| (this.nativeLog || function(s) {console.log(s)})('START WEEX HTML5: 0.5.0, Build 2017-08-14 14:07.'); |
| ;(this.getJSFMVersion = function(){return "0.21.9"}); |
| var global = this, process = { env: {} };var setTimeout = global.setTimeout; |
| |
| (function (global, factory) { |
| typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : |
| typeof define === 'function' && define.amd ? define(factory) : |
| (global.Weex = factory()); |
| }(this, (function () { 'use strict'; |
| |
| function __$styleInject(css, returnValue) { |
| if (typeof document === 'undefined') { |
| return returnValue; |
| } |
| css = css || ''; |
| var head = document.head || document.getElementsByTagName('head')[0]; |
| var style = document.createElement('style'); |
| style.type = 'text/css'; |
| head.appendChild(style); |
| |
| if (style.styleSheet){ |
| style.styleSheet.cssText = css; |
| } else { |
| style.appendChild(document.createTextNode(css)); |
| } |
| return returnValue; |
| } |
| __$styleInject("* {\n margin: 0;\n padding: 0;\n text-size-adjust: none;\n}\n\nul, ol {\n list-style: none;\n}\n\n.weex-container {\n box-sizing: border-box;\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n -webkit-flex-shrink: 0;\n flex-shrink: 0;\n -webkit-flex-grow: 0;\n flex-grow: 0;\n -webkit-flex-basis: auto;\n flex-basis: auto;\n align-items: stretch;\n box-align: stretch;\n align-content: flex-start;\n position: relative;\n border: 0 solid black;\n margin: 0;\n padding: 0;\n min-width: 0;\n}\n\n.weex-element {\n box-sizing: border-box;\n position: relative;\n -webkit-flex-shrink: 0;\n flex-shrink: 0;\n -webkit-flex-grow: 0;\n flex-grow: 0;\n -webkit-flex-basis: auto;\n flex-basis: auto;\n border: 0 solid black;\n margin: 0;\n padding: 0;\n min-width: 0;\n}\n",undefined); |
| |
| var subversion = {"browser":"0.5.0","framework":"0.21.9","vue-render":"0.12.3","transformer":">=0.1.5 <0.5"}; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* eslint-disable */ |
| |
| // Production steps of ECMA-262, Edition 6, 22.1.2.1 |
| // Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from |
| |
| /* istanbul ignore if */ |
| if (!Array.from) { |
| Array.from = (function() { |
| var toStr = Object.prototype.toString; |
| var isCallable = function(fn) { |
| return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; |
| }; |
| var toInteger = function(value) { |
| var number = Number(value); |
| if (isNaN(number)) { |
| return 0; |
| } |
| if (number === 0 || !isFinite(number)) { |
| return number; |
| } |
| return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); |
| }; |
| var maxSafeInteger = Math.pow(2, 53) - 1; |
| var toLength = function(value) { |
| var len = toInteger(value); |
| return Math.min(Math.max(len, 0), maxSafeInteger); |
| }; |
| |
| // The length property of the from method is 1. |
| return function from(arrayLike/*, mapFn, thisArg */) { |
| // 1. Let C be the this value. |
| var C = this; |
| |
| // 2. Let items be ToObject(arrayLike). |
| var items = Object(arrayLike); |
| |
| // 3. ReturnIfAbrupt(items). |
| if (arrayLike == null) { |
| throw new TypeError('Array.from requires an array-like object - not null or undefined'); |
| } |
| |
| // 4. If mapfn is undefined, then let mapping be false. |
| var mapFn = arguments.length > 1 ? arguments[1] : void undefined; |
| var T; |
| if (typeof mapFn !== 'undefined') { |
| // 5. else |
| // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. |
| if (!isCallable(mapFn)) { |
| throw new TypeError('Array.from: when provided, the second argument must be a function'); |
| } |
| |
| // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. |
| if (arguments.length > 2) { |
| T = arguments[2]; |
| } |
| } |
| |
| // 10. Let lenValue be Get(items, "length"). |
| // 11. Let len be ToLength(lenValue). |
| var len = toLength(items.length); |
| |
| // 13. If IsConstructor(C) is true, then |
| // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. |
| // 14. a. Else, Let A be ArrayCreate(len). |
| var A = isCallable(C) ? Object(new C(len)) : new Array(len); |
| |
| // 16. Let k be 0. |
| var k = 0; |
| // 17. Repeat, while k < len… (also steps a - h) |
| var kValue; |
| while (k < len) { |
| kValue = items[k]; |
| if (mapFn) { |
| A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); |
| } else { |
| A[k] = kValue; |
| } |
| k += 1; |
| } |
| // 18. Let putStatus be Put(A, "length", len, true). |
| A.length = len; |
| // 20. Return A. |
| return A; |
| }; |
| }()); |
| } |
| |
| var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; |
| |
| |
| |
| function unwrapExports (x) { |
| return x && x.__esModule ? x['default'] : x; |
| } |
| |
| function createCommonjsModule(fn, module) { |
| return module = { exports: {} }, fn(module, module.exports), module.exports; |
| } |
| |
| var _global = createCommonjsModule(function (module) { |
| // 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 |
| }); |
| |
| var _core = createCommonjsModule(function (module) { |
| var core = module.exports = { version: '2.5.0' }; |
| if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef |
| }); |
| |
| var _isObject = function (it) { |
| return typeof it === 'object' ? it !== null : typeof it === 'function'; |
| }; |
| |
| var isObject = _isObject; |
| var _anObject = function (it) { |
| if (!isObject(it)) { throw TypeError(it + ' is not an object!'); } |
| return it; |
| }; |
| |
| var _fails = function (exec) { |
| try { |
| return !!exec(); |
| } catch (e) { |
| return true; |
| } |
| }; |
| |
| // Thank's IE8 for his funny defineProperty |
| var _descriptors = !_fails(function () { |
| return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; |
| }); |
| |
| var isObject$1 = _isObject; |
| var document$1 = _global.document; |
| // typeof document.createElement is 'object' in old IE |
| var is = isObject$1(document$1) && isObject$1(document$1.createElement); |
| var _domCreate = function (it) { |
| return is ? document$1.createElement(it) : {}; |
| }; |
| |
| var _ie8DomDefine = !_descriptors && !_fails(function () { |
| return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7; |
| }); |
| |
| // 7.1.1 ToPrimitive(input [, PreferredType]) |
| var isObject$2 = _isObject; |
| // instead of the ES6 spec version, we didn't implement @@toPrimitive case |
| // and the second argument - flag - preferred type is a string |
| var _toPrimitive = function (it, S) { |
| if (!isObject$2(it)) { return it; } |
| var fn, val; |
| if (S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; } |
| if (typeof (fn = it.valueOf) == 'function' && !isObject$2(val = fn.call(it))) { return val; } |
| if (!S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; } |
| throw TypeError("Can't convert object to primitive value"); |
| }; |
| |
| var anObject = _anObject; |
| var IE8_DOM_DEFINE = _ie8DomDefine; |
| var toPrimitive = _toPrimitive; |
| var dP$1 = Object.defineProperty; |
| |
| var f$1 = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) { |
| anObject(O); |
| P = toPrimitive(P, true); |
| anObject(Attributes); |
| if (IE8_DOM_DEFINE) { try { |
| return dP$1(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; |
| }; |
| |
| var _objectDp = { |
| f: f$1 |
| }; |
| |
| var _propertyDesc = function (bitmap, value) { |
| return { |
| enumerable: !(bitmap & 1), |
| configurable: !(bitmap & 2), |
| writable: !(bitmap & 4), |
| value: value |
| }; |
| }; |
| |
| var dP = _objectDp; |
| var createDesc = _propertyDesc; |
| var _hide = _descriptors ? function (object, key, value) { |
| return dP.f(object, key, createDesc(1, value)); |
| } : function (object, key, value) { |
| object[key] = value; |
| return object; |
| }; |
| |
| var hasOwnProperty = {}.hasOwnProperty; |
| var _has = function (it, key) { |
| return hasOwnProperty.call(it, key); |
| }; |
| |
| var id = 0; |
| var px = Math.random(); |
| var _uid = function (key) { |
| return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); |
| }; |
| |
| var _redefine = createCommonjsModule(function (module) { |
| var global = _global; |
| var hide = _hide; |
| var has = _has; |
| var SRC = _uid('src'); |
| var TO_STRING = 'toString'; |
| var $toString = Function[TO_STRING]; |
| var TPL = ('' + $toString).split(TO_STRING); |
| |
| _core.inspectSource = function (it) { |
| return $toString.call(it); |
| }; |
| |
| (module.exports = function (O, key, val, safe) { |
| var isFunction = typeof val == 'function'; |
| if (isFunction) { has(val, 'name') || hide(val, 'name', key); } |
| if (O[key] === val) { return; } |
| if (isFunction) { has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); } |
| if (O === global) { |
| O[key] = val; |
| } else if (!safe) { |
| delete O[key]; |
| hide(O, key, val); |
| } else if (O[key]) { |
| O[key] = val; |
| } else { |
| hide(O, key, val); |
| } |
| // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative |
| })(Function.prototype, TO_STRING, function toString() { |
| return typeof this == 'function' && this[SRC] || $toString.call(this); |
| }); |
| }); |
| |
| var _aFunction = function (it) { |
| if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); } |
| return it; |
| }; |
| |
| // optional / simple context binding |
| var aFunction = _aFunction; |
| var _ctx = 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); |
| }; |
| }; |
| |
| var global$1 = _global; |
| var core = _core; |
| var hide = _hide; |
| var redefine = _redefine; |
| var ctx = _ctx; |
| var PROTOTYPE = 'prototype'; |
| |
| var $export$1 = function (type, name, source) { |
| var IS_FORCED = type & $export$1.F; |
| var IS_GLOBAL = type & $export$1.G; |
| var IS_STATIC = type & $export$1.S; |
| var IS_PROTO = type & $export$1.P; |
| var IS_BIND = type & $export$1.B; |
| var target = IS_GLOBAL ? global$1 : IS_STATIC ? global$1[name] || (global$1[name] = {}) : (global$1[name] || {})[PROTOTYPE]; |
| var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); |
| var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); |
| var key, own, out, exp; |
| if (IS_GLOBAL) { source = name; } |
| for (key in source) { |
| // contains in native |
| own = !IS_FORCED && target && target[key] !== undefined; |
| // export native or passed |
| out = (own ? target : source)[key]; |
| // bind timers to global for call from export context |
| exp = IS_BIND && own ? ctx(out, global$1) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; |
| // extend global |
| if (target) { redefine(target, key, out, type & $export$1.U); } |
| // export |
| if (exports[key] != out) { hide(exports, key, exp); } |
| if (IS_PROTO && expProto[key] != out) { expProto[key] = out; } |
| } |
| }; |
| global$1.core = core; |
| // type bitmap |
| $export$1.F = 1; // forced |
| $export$1.G = 2; // global |
| $export$1.S = 4; // static |
| $export$1.P = 8; // proto |
| $export$1.B = 16; // bind |
| $export$1.W = 32; // wrap |
| $export$1.U = 64; // safe |
| $export$1.R = 128; // real proto method for `library` |
| var _export = $export$1; |
| |
| var toString$1 = {}.toString; |
| |
| var _cof = function (it) { |
| return toString$1.call(it).slice(8, -1); |
| }; |
| |
| // fallback for non-array-like ES3 and non-enumerable old V8 strings |
| var cof = _cof; |
| // eslint-disable-next-line no-prototype-builtins |
| var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) { |
| return cof(it) == 'String' ? it.split('') : Object(it); |
| }; |
| |
| // 7.2.1 RequireObjectCoercible(argument) |
| var _defined = function (it) { |
| if (it == undefined) { throw TypeError("Can't call method on " + it); } |
| return it; |
| }; |
| |
| // to indexed object, toObject with fallback for non-array-like ES3 strings |
| var IObject$1 = _iobject; |
| var defined = _defined; |
| var _toIobject = function (it) { |
| return IObject$1(defined(it)); |
| }; |
| |
| // 7.1.4 ToInteger |
| var ceil = Math.ceil; |
| var floor = Math.floor; |
| var _toInteger = function (it) { |
| return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); |
| }; |
| |
| // 7.1.15 ToLength |
| var toInteger = _toInteger; |
| var min = Math.min; |
| var _toLength = function (it) { |
| return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 |
| }; |
| |
| var toInteger$1 = _toInteger; |
| var max = Math.max; |
| var min$1 = Math.min; |
| var _toAbsoluteIndex = function (index, length) { |
| index = toInteger$1(index); |
| return index < 0 ? max(index + length, 0) : min$1(index, length); |
| }; |
| |
| // false -> Array#indexOf |
| // true -> Array#includes |
| var toIObject$1 = _toIobject; |
| var toLength = _toLength; |
| var toAbsoluteIndex = _toAbsoluteIndex; |
| var _arrayIncludes = function (IS_INCLUDES) { |
| return function ($this, el, fromIndex) { |
| var O = toIObject$1($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; |
| }; |
| }; |
| |
| var global$2 = _global; |
| var SHARED = '__core-js_shared__'; |
| var store = global$2[SHARED] || (global$2[SHARED] = {}); |
| var _shared = function (key) { |
| return store[key] || (store[key] = {}); |
| }; |
| |
| var shared = _shared('keys'); |
| var uid = _uid; |
| var _sharedKey = function (key) { |
| return shared[key] || (shared[key] = uid(key)); |
| }; |
| |
| var has$1 = _has; |
| var toIObject = _toIobject; |
| var arrayIndexOf = _arrayIncludes(false); |
| var IE_PROTO = _sharedKey('IE_PROTO'); |
| |
| var _objectKeysInternal = function (object, names) { |
| var O = toIObject(object); |
| var i = 0; |
| var result = []; |
| var key; |
| for (key in O) { if (key != IE_PROTO) { has$1(O, key) && result.push(key); } } |
| // Don't enum bug & hidden keys |
| while (names.length > i) { if (has$1(O, key = names[i++])) { |
| ~arrayIndexOf(result, key) || result.push(key); |
| } } |
| return result; |
| }; |
| |
| // IE 8- don't enum bug keys |
| var _enumBugKeys = ( |
| 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' |
| ).split(','); |
| |
| // 19.1.2.14 / 15.2.3.14 Object.keys(O) |
| var $keys = _objectKeysInternal; |
| var enumBugKeys = _enumBugKeys; |
| |
| var _objectKeys = Object.keys || function keys(O) { |
| return $keys(O, enumBugKeys); |
| }; |
| |
| var f$2 = Object.getOwnPropertySymbols; |
| |
| var _objectGops = { |
| f: f$2 |
| }; |
| |
| var f$3 = {}.propertyIsEnumerable; |
| |
| var _objectPie = { |
| f: f$3 |
| }; |
| |
| // 7.1.13 ToObject(argument) |
| var defined$1 = _defined; |
| var _toObject = function (it) { |
| return Object(defined$1(it)); |
| }; |
| |
| // 19.1.2.1 Object.assign(target, source, ...) |
| var getKeys = _objectKeys; |
| var gOPS = _objectGops; |
| var pIE = _objectPie; |
| var toObject = _toObject; |
| var IObject = _iobject; |
| var $assign = Object.assign; |
| |
| // should work with symbols and should have deterministic property order (V8 bug) |
| var _objectAssign = !$assign || _fails(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) { |
| var arguments$1 = arguments; |
| // 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$1[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; |
| |
| // 19.1.3.1 Object.assign(target, source) |
| var $export = _export; |
| |
| $export($export.S + $export.F, 'Object', { assign: _objectAssign }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* eslint-disable */ |
| |
| // https://gist.github.com/WebReflection/5593554 |
| |
| /* istanbul ignore if */ |
| if (!Object.setPrototypeOf) { |
| Object.setPrototypeOf = (function(Object, magic) { |
| var set; |
| function setPrototypeOf(O, proto) { |
| set.call(O, proto); |
| return O; |
| } |
| try { |
| // this works already in Firefox and Safari |
| set = Object.getOwnPropertyDescriptor(Object.prototype, magic).set; |
| set.call({}, null); |
| } catch (e) { |
| if ( |
| // IE < 11 cannot be shimmed |
| Object.prototype !== {}[magic] || |
| // neither can any browser that actually |
| // implemented __proto__ correctly |
| // (all but old V8 will return here) |
| {__proto__: null}.__proto__ === void 0 |
| // this case means null objects cannot be passed |
| // through setPrototypeOf in a reliable way |
| // which means here a **Sham** is needed instead |
| ) { |
| return; |
| } |
| // nodejs 0.8 and 0.10 are (buggy and..) fine here |
| // probably Chrome or some old Mobile stock browser |
| set = function(proto) { |
| this[magic] = proto; |
| }; |
| // please note that this will **not** work |
| // in those browsers that do not inherit |
| // __proto__ by mistake from Object.prototype |
| // in these cases we should probably throw an error |
| // or at least be informed about the issue |
| setPrototypeOf.polyfill = setPrototypeOf( |
| setPrototypeOf({}, null), |
| Object.prototype |
| ) instanceof Object; |
| // setPrototypeOf.polyfill === true means it works as meant |
| // setPrototypeOf.polyfill === false means it's not 100% reliable |
| // setPrototypeOf.polyfill === undefined |
| // or |
| // setPrototypeOf.polyfill == null means it's not a polyfill |
| // which means it works as expected |
| // we can even delete Object.prototype.__proto__; |
| } |
| return setPrototypeOf; |
| }(Object, '__proto__')); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| // fix Promise Problem on JSContext of iOS7~8 |
| // @see https://bugs.webkit.org/show_bug.cgi?id=135866 |
| |
| var ref = commonjsGlobal; |
| var WXEnvironment$1 = ref.WXEnvironment; |
| |
| /* istanbul ignore next */ |
| if (WXEnvironment$1 && WXEnvironment$1.platform === 'iOS') { |
| commonjsGlobal.Promise = undefined; |
| } |
| |
| var _wks = createCommonjsModule(function (module) { |
| var store = _shared('wks'); |
| var uid = _uid; |
| var Symbol = _global.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; |
| }); |
| |
| // getting tag from 19.1.3.6 Object.prototype.toString() |
| var cof$1 = _cof; |
| var TAG = _wks('toStringTag'); |
| // ES3 wrong here |
| var ARG = cof$1(function () { return arguments; }()) == 'Arguments'; |
| |
| // fallback for IE11 Script Access Denied error |
| var tryGet = function (it, key) { |
| try { |
| return it[key]; |
| } catch (e) { /* empty */ } |
| }; |
| |
| var _classof = 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$1(O) |
| // ES3 arguments fallback |
| : (B = cof$1(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; |
| }; |
| |
| // 19.1.3.6 Object.prototype.toString() |
| var classof = _classof; |
| var test = {}; |
| test[_wks('toStringTag')] = 'z'; |
| if (test + '' != '[object z]') { |
| _redefine(Object.prototype, 'toString', function toString() { |
| return '[object ' + classof(this) + ']'; |
| }, true); |
| } |
| |
| var toInteger$2 = _toInteger; |
| var defined$2 = _defined; |
| // true -> String#at |
| // false -> String#codePointAt |
| var _stringAt = function (TO_STRING) { |
| return function (that, pos) { |
| var s = String(defined$2(that)); |
| var i = toInteger$2(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; |
| }; |
| }; |
| |
| var _library = false; |
| |
| var _iterators = {}; |
| |
| var dP$2 = _objectDp; |
| var anObject$2 = _anObject; |
| var getKeys$1 = _objectKeys; |
| |
| var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) { |
| anObject$2(O); |
| var keys = getKeys$1(Properties); |
| var length = keys.length; |
| var i = 0; |
| var P; |
| while (length > i) { dP$2.f(O, P = keys[i++], Properties[P]); } |
| return O; |
| }; |
| |
| var document$2 = _global.document; |
| var _html = document$2 && document$2.documentElement; |
| |
| // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) |
| var anObject$1 = _anObject; |
| var dPs = _objectDps; |
| var enumBugKeys$1 = _enumBugKeys; |
| var IE_PROTO$1 = _sharedKey('IE_PROTO'); |
| var Empty = function () { /* empty */ }; |
| var PROTOTYPE$1 = '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 = _domCreate('iframe'); |
| var i = enumBugKeys$1.length; |
| var lt = '<'; |
| var gt = '>'; |
| var iframeDocument; |
| iframe.style.display = 'none'; |
| _html.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$1][enumBugKeys$1[i]]; } |
| return createDict(); |
| }; |
| |
| var _objectCreate = Object.create || function create(O, Properties) { |
| var result; |
| if (O !== null) { |
| Empty[PROTOTYPE$1] = anObject$1(O); |
| result = new Empty(); |
| Empty[PROTOTYPE$1] = null; |
| // add "__proto__" for Object.getPrototypeOf polyfill |
| result[IE_PROTO$1] = O; |
| } else { result = createDict(); } |
| return Properties === undefined ? result : dPs(result, Properties); |
| }; |
| |
| var def = _objectDp.f; |
| var has$3 = _has; |
| var TAG$1 = _wks('toStringTag'); |
| |
| var _setToStringTag = function (it, tag, stat) { |
| if (it && !has$3(it = stat ? it : it.prototype, TAG$1)) { def(it, TAG$1, { configurable: true, value: tag }); } |
| }; |
| |
| var create$1 = _objectCreate; |
| var descriptor = _propertyDesc; |
| var setToStringTag$1 = _setToStringTag; |
| var IteratorPrototype = {}; |
| |
| // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() |
| _hide(IteratorPrototype, _wks('iterator'), function () { return this; }); |
| |
| var _iterCreate = function (Constructor, NAME, next) { |
| Constructor.prototype = create$1(IteratorPrototype, { next: descriptor(1, next) }); |
| setToStringTag$1(Constructor, NAME + ' Iterator'); |
| }; |
| |
| // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) |
| var has$4 = _has; |
| var toObject$1 = _toObject; |
| var IE_PROTO$2 = _sharedKey('IE_PROTO'); |
| var ObjectProto = Object.prototype; |
| |
| var _objectGpo = Object.getPrototypeOf || function (O) { |
| O = toObject$1(O); |
| if (has$4(O, IE_PROTO$2)) { return O[IE_PROTO$2]; } |
| if (typeof O.constructor == 'function' && O instanceof O.constructor) { |
| return O.constructor.prototype; |
| } return O instanceof Object ? ObjectProto : null; |
| }; |
| |
| var LIBRARY = _library; |
| var $export$2 = _export; |
| var redefine$1 = _redefine; |
| var hide$1 = _hide; |
| var has$2 = _has; |
| var Iterators = _iterators; |
| var $iterCreate = _iterCreate; |
| var setToStringTag = _setToStringTag; |
| var getPrototypeOf = _objectGpo; |
| var ITERATOR = _wks('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; }; |
| |
| var _iterDefine = 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 && !has$2(IteratorPrototype, ITERATOR)) { hide$1(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$1(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$1(proto, key, methods[key]); } |
| } } else { $export$2($export$2.P + $export$2.F * (BUGGY || VALUES_BUG), NAME, methods); } |
| } |
| return methods; |
| }; |
| |
| var $at = _stringAt(true); |
| |
| // 21.1.3.27 String.prototype[@@iterator]() |
| _iterDefine(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 }; |
| }); |
| |
| // 22.1.3.31 Array.prototype[@@unscopables] |
| var UNSCOPABLES = _wks('unscopables'); |
| var ArrayProto = Array.prototype; |
| if (ArrayProto[UNSCOPABLES] == undefined) { _hide(ArrayProto, UNSCOPABLES, {}); } |
| var _addToUnscopables = function (key) { |
| ArrayProto[UNSCOPABLES][key] = true; |
| }; |
| |
| var _iterStep = function (done, value) { |
| return { value: value, done: !!done }; |
| }; |
| |
| var addToUnscopables = _addToUnscopables; |
| var step = _iterStep; |
| var Iterators$2 = _iterators; |
| var toIObject$2 = _toIobject; |
| |
| // 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]() |
| var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) { |
| this._t = toIObject$2(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$2.Arguments = Iterators$2.Array; |
| |
| addToUnscopables('keys'); |
| addToUnscopables('values'); |
| addToUnscopables('entries'); |
| |
| var $iterators = es6_array_iterator; |
| var getKeys$2 = _objectKeys; |
| var redefine$2 = _redefine; |
| var global$3 = _global; |
| var hide$2 = _hide; |
| var Iterators$1 = _iterators; |
| var wks = _wks; |
| var ITERATOR$1 = wks('iterator'); |
| var TO_STRING_TAG = wks('toStringTag'); |
| var ArrayValues = Iterators$1.Array; |
| |
| var DOMIterables = { |
| CSSRuleList: true, // TODO: Not spec compliant, should be false. |
| CSSStyleDeclaration: false, |
| CSSValueList: false, |
| ClientRectList: false, |
| DOMRectList: false, |
| DOMStringList: false, |
| DOMTokenList: true, |
| DataTransferItemList: false, |
| FileList: false, |
| HTMLAllCollection: false, |
| HTMLCollection: false, |
| HTMLFormElement: false, |
| HTMLSelectElement: false, |
| MediaList: true, // TODO: Not spec compliant, should be false. |
| MimeTypeArray: false, |
| NamedNodeMap: false, |
| NodeList: true, |
| PaintRequestList: false, |
| Plugin: false, |
| PluginArray: false, |
| SVGLengthList: false, |
| SVGNumberList: false, |
| SVGPathSegList: false, |
| SVGPointList: false, |
| SVGStringList: false, |
| SVGTransformList: false, |
| SourceBufferList: false, |
| StyleSheetList: true, // TODO: Not spec compliant, should be false. |
| TextTrackCueList: false, |
| TextTrackList: false, |
| TouchList: false |
| }; |
| |
| for (var collections = getKeys$2(DOMIterables), i = 0; i < collections.length; i++) { |
| var NAME = collections[i]; |
| var explicit = DOMIterables[NAME]; |
| var Collection = global$3[NAME]; |
| var proto = Collection && Collection.prototype; |
| var key; |
| if (proto) { |
| if (!proto[ITERATOR$1]) { hide$2(proto, ITERATOR$1, ArrayValues); } |
| if (!proto[TO_STRING_TAG]) { hide$2(proto, TO_STRING_TAG, NAME); } |
| Iterators$1[NAME] = ArrayValues; |
| if (explicit) { for (key in $iterators) { if (!proto[key]) { redefine$2(proto, key, $iterators[key], true); } } } |
| } |
| } |
| |
| var _anInstance = function (it, Constructor, name, forbiddenField) { |
| if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { |
| throw TypeError(name + ': incorrect invocation!'); |
| } return it; |
| }; |
| |
| // call something on iterator step with safe closing on error |
| var anObject$3 = _anObject; |
| var _iterCall = function (iterator, fn, value, entries) { |
| try { |
| return entries ? fn(anObject$3(value)[0], value[1]) : fn(value); |
| // 7.4.6 IteratorClose(iterator, completion) |
| } catch (e) { |
| var ret = iterator['return']; |
| if (ret !== undefined) { anObject$3(ret.call(iterator)); } |
| throw e; |
| } |
| }; |
| |
| // check on default Array iterator |
| var Iterators$3 = _iterators; |
| var ITERATOR$2 = _wks('iterator'); |
| var ArrayProto$1 = Array.prototype; |
| |
| var _isArrayIter = function (it) { |
| return it !== undefined && (Iterators$3.Array === it || ArrayProto$1[ITERATOR$2] === it); |
| }; |
| |
| var classof$2 = _classof; |
| var ITERATOR$3 = _wks('iterator'); |
| var Iterators$4 = _iterators; |
| var core_getIteratorMethod = _core.getIteratorMethod = function (it) { |
| if (it != undefined) { return it[ITERATOR$3] |
| || it['@@iterator'] |
| || Iterators$4[classof$2(it)]; } |
| }; |
| |
| var _forOf = createCommonjsModule(function (module) { |
| var ctx = _ctx; |
| var call = _iterCall; |
| var isArrayIter = _isArrayIter; |
| var anObject = _anObject; |
| var toLength = _toLength; |
| var getIterFn = core_getIteratorMethod; |
| 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; |
| }); |
| |
| // 7.3.20 SpeciesConstructor(O, defaultConstructor) |
| var anObject$4 = _anObject; |
| var aFunction$2 = _aFunction; |
| var SPECIES = _wks('species'); |
| var _speciesConstructor = function (O, D) { |
| var C = anObject$4(O).constructor; |
| var S; |
| return C === undefined || (S = anObject$4(C)[SPECIES]) == undefined ? D : aFunction$2(S); |
| }; |
| |
| // fast apply, http://jsperf.lnkit.com/fast-apply/5 |
| var _invoke = 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); |
| }; |
| |
| var ctx$2 = _ctx; |
| var invoke = _invoke; |
| var html = _html; |
| var cel = _domCreate; |
| var global$5 = _global; |
| var process$2 = global$5.process; |
| var setTask = global$5.setImmediate; |
| var clearTask = global$5.clearImmediate; |
| var MessageChannel = global$5.MessageChannel; |
| var Dispatch = global$5.Dispatch; |
| var counter = 0; |
| var queue = {}; |
| var ONREADYSTATECHANGE = 'onreadystatechange'; |
| var defer; |
| var channel; |
| var port; |
| var run$1 = 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$1.call(event.data); |
| }; |
| // Node.js 0.9+ & IE10+ has setImmediate, otherwise: |
| if (!setTask || !clearTask) { |
| setTask = function setImmediate(fn) { |
| var arguments$1 = arguments; |
| |
| var args = []; |
| var i = 1; |
| while (arguments.length > i) { args.push(arguments$1[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 (_cof(process$2) == 'process') { |
| defer = function (id) { |
| process$2.nextTick(ctx$2(run$1, id, 1)); |
| }; |
| // Sphere (JS game engine) Dispatch API |
| } else if (Dispatch && Dispatch.now) { |
| defer = function (id) { |
| Dispatch.now(ctx$2(run$1, id, 1)); |
| }; |
| // Browsers with MessageChannel, includes WebWorkers |
| } else if (MessageChannel) { |
| channel = new MessageChannel(); |
| port = channel.port2; |
| channel.port1.onmessage = listener; |
| defer = ctx$2(port.postMessage, port, 1); |
| // Browsers with postMessage, skip WebWorkers |
| // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' |
| } else if (global$5.addEventListener && typeof postMessage == 'function' && !global$5.importScripts) { |
| defer = function (id) { |
| global$5.postMessage(id + '', '*'); |
| }; |
| global$5.addEventListener('message', listener, false); |
| // IE8- |
| } else if (ONREADYSTATECHANGE in cel('script')) { |
| defer = function (id) { |
| html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { |
| html.removeChild(this); |
| run$1.call(id); |
| }; |
| }; |
| // Rest old browsers |
| } else { |
| defer = function (id) { |
| setTimeout(ctx$2(run$1, id, 1), 0); |
| }; |
| } |
| } |
| var _task = { |
| set: setTask, |
| clear: clearTask |
| }; |
| |
| var global$6 = _global; |
| var macrotask = _task.set; |
| var Observer = global$6.MutationObserver || global$6.WebKitMutationObserver; |
| var process$3 = global$6.process; |
| var Promise$1 = global$6.Promise; |
| var isNode$1 = _cof(process$3) == 'process'; |
| |
| var _microtask = function () { |
| var head, last, notify; |
| |
| var flush = function () { |
| var parent, fn; |
| if (isNode$1 && (parent = process$3.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$1) { |
| notify = function () { |
| process$3.nextTick(flush); |
| }; |
| // browsers with MutationObserver |
| } else if (Observer) { |
| 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$1 && Promise$1.resolve) { |
| var promise = Promise$1.resolve(); |
| 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$6, flush); |
| }; |
| } |
| |
| return function (fn) { |
| var task = { fn: fn, next: undefined }; |
| if (last) { last.next = task; } |
| if (!head) { |
| head = task; |
| notify(); |
| } last = task; |
| }; |
| }; |
| |
| // 25.4.1.5 NewPromiseCapability(C) |
| var aFunction$3 = _aFunction; |
| |
| 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$3(resolve); |
| this.reject = aFunction$3(reject); |
| } |
| |
| var f$4 = function (C) { |
| return new PromiseCapability(C); |
| }; |
| |
| var _newPromiseCapability = { |
| f: f$4 |
| }; |
| |
| var _perform = function (exec) { |
| try { |
| return { e: false, v: exec() }; |
| } catch (e) { |
| return { e: true, v: e }; |
| } |
| }; |
| |
| var newPromiseCapability$1 = _newPromiseCapability; |
| |
| var _promiseResolve = function (C, x) { |
| var promiseCapability = newPromiseCapability$1.f(C); |
| var resolve = promiseCapability.resolve; |
| resolve(x); |
| return promiseCapability.promise; |
| }; |
| |
| var redefine$3 = _redefine; |
| var _redefineAll = function (target, src, safe) { |
| for (var key in src) { redefine$3(target, key, src[key], safe); } |
| return target; |
| }; |
| |
| var global$7 = _global; |
| var dP$3 = _objectDp; |
| var DESCRIPTORS = _descriptors; |
| var SPECIES$1 = _wks('species'); |
| |
| var _setSpecies = function (KEY) { |
| var C = global$7[KEY]; |
| if (DESCRIPTORS && C && !C[SPECIES$1]) { dP$3.f(C, SPECIES$1, { |
| configurable: true, |
| get: function () { return this; } |
| }); } |
| }; |
| |
| var ITERATOR$4 = _wks('iterator'); |
| var SAFE_CLOSING = false; |
| |
| try { |
| var riter = [7][ITERATOR$4](); |
| riter['return'] = function () { SAFE_CLOSING = true; }; |
| // eslint-disable-next-line no-throw-literal |
| Array.from(riter, function () { throw 2; }); |
| } catch (e) { /* empty */ } |
| |
| var _iterDetect = function (exec, skipClosing) { |
| if (!skipClosing && !SAFE_CLOSING) { return false; } |
| var safe = false; |
| try { |
| var arr = [7]; |
| var iter = arr[ITERATOR$4](); |
| iter.next = function () { return { done: safe = true }; }; |
| arr[ITERATOR$4] = function () { return iter; }; |
| exec(arr); |
| } catch (e) { /* empty */ } |
| return safe; |
| }; |
| |
| var LIBRARY$1 = _library; |
| var global$4 = _global; |
| var ctx$1 = _ctx; |
| var classof$1 = _classof; |
| var $export$3 = _export; |
| var isObject$3 = _isObject; |
| var aFunction$1 = _aFunction; |
| var anInstance = _anInstance; |
| var forOf = _forOf; |
| var speciesConstructor = _speciesConstructor; |
| var task = _task.set; |
| var microtask = _microtask(); |
| var newPromiseCapabilityModule = _newPromiseCapability; |
| var perform = _perform; |
| var promiseResolve = _promiseResolve; |
| var PROMISE = 'Promise'; |
| var TypeError$1 = global$4.TypeError; |
| var process$1 = global$4.process; |
| var $Promise = global$4[PROMISE]; |
| var isNode = classof$1(process$1) == 'process'; |
| var empty = function () { /* empty */ }; |
| var Internal; |
| var newGenericPromiseCapability; |
| var OwnPromiseCapability; |
| var 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 = {})[_wks('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; |
| } catch (e) { /* empty */ } |
| }(); |
| |
| // helpers |
| var sameConstructor = LIBRARY$1 ? function (a, b) { |
| // with library wrapper special case |
| return a === b || a === $Promise && b === Wrapper; |
| } : function (a, b) { |
| return a === b; |
| }; |
| var isThenable = function (it) { |
| var then; |
| return isObject$3(it) && typeof (then = it.then) == 'function' ? then : false; |
| }; |
| var notify$1 = 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; |
| 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); |
| if (domain) { domain.exit(); } |
| } |
| if (result === reaction.promise) { |
| reject(TypeError$1('Promise-chain cycle')); |
| } else if (then = isThenable(result)) { |
| then.call(result, resolve, reject); |
| } else { resolve(result); } |
| } else { reject(value); } |
| } catch (e) { |
| 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$4, function () { |
| var value = promise._v; |
| var unhandled = isUnhandled(promise); |
| var result, handler, console; |
| if (unhandled) { |
| result = perform(function () { |
| if (isNode) { |
| process$1.emit('unhandledRejection', value, promise); |
| } else if (handler = global$4.onunhandledrejection) { |
| handler({ promise: promise, reason: value }); |
| } else if ((console = global$4.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) { |
| if (promise._h == 1) { return false; } |
| var chain = promise._a || promise._c; |
| var i = 0; |
| var reaction; |
| while (chain.length > i) { |
| reaction = chain[i++]; |
| if (reaction.fail || !isUnhandled(reaction.promise)) { return false; } |
| } return true; |
| }; |
| var onHandleUnhandled = function (promise) { |
| task.call(global$4, function () { |
| var handler; |
| if (isNode) { |
| process$1.emit('rejectionHandled', promise); |
| } else if (handler = global$4.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$1(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$1("Promise can't be resolved itself"); } |
| if (then = isThenable(value)) { |
| microtask(function () { |
| var wrapper = { _w: promise, _d: false }; // wrap |
| try { |
| then.call(value, ctx$1($resolve, wrapper, 1), ctx$1($reject, wrapper, 1)); |
| } catch (e) { |
| $reject.call(wrapper, e); |
| } |
| }); |
| } else { |
| promise._v = value; |
| promise._s = 1; |
| notify$1(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$1(executor); |
| Internal.call(this); |
| try { |
| executor(ctx$1($resolve, this, 1), ctx$1($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 = _redefineAll($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$1.domain : undefined; |
| this._c.push(reaction); |
| if (this._a) { this._a.push(reaction); } |
| if (this._s) { notify$1(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$1($resolve, promise, 1); |
| this.reject = ctx$1($reject, promise, 1); |
| }; |
| newPromiseCapabilityModule.f = newPromiseCapability = function (C) { |
| return sameConstructor($Promise, C) |
| ? new OwnPromiseCapability(C) |
| : newGenericPromiseCapability(C); |
| }; |
| } |
| |
| $export$3($export$3.G + $export$3.W + $export$3.F * !USE_NATIVE, { Promise: $Promise }); |
| _setToStringTag($Promise, PROMISE); |
| _setSpecies(PROMISE); |
| Wrapper = _core[PROMISE]; |
| |
| // statics |
| $export$3($export$3.S + $export$3.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$3($export$3.S + $export$3.F * (LIBRARY$1 || !USE_NATIVE), PROMISE, { |
| // 25.4.4.6 Promise.resolve(x) |
| resolve: function resolve(x) { |
| // instanceof instead of internal slot check because we should fix it without replacement native Promise core |
| if (x instanceof $Promise && sameConstructor(x.constructor, this)) { return x; } |
| return promiseResolve(this, x); |
| } |
| }); |
| $export$3($export$3.S + $export$3.F * !(USE_NATIVE && _iterDetect(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; |
| } |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * @fileOverview |
| * This file will hack `console` methods by `WXEnvironment.logLevel`. |
| * So we can control how many and which messages will be sent by change the log level. |
| * Additionally in native platform the message content must be primitive values and |
| * using `nativeLog(...args, logLevelMark)` so we create a new `console` object in |
| * global add a format process for its methods. |
| */ |
| |
| var LEVELS = ['off', 'error', 'warn', 'info', 'log', 'debug']; |
| var levelMap = {}; |
| |
| var originalConsole = global.console; |
| |
| /** |
| * Hack console for native environment. |
| */ |
| function setNativeConsole () { |
| generateLevelMap(); |
| |
| /* istanbul ignore next */ |
| // mock console in native environment |
| if (global.WXEnvironment && global.WXEnvironment.platform !== 'Web') { |
| global.console = { |
| debug: function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('debug')) { global.nativeLog.apply(global, format(args).concat( ['__DEBUG'] )); } |
| }, |
| log: function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('log')) { global.nativeLog.apply(global, format(args).concat( ['__LOG'] )); } |
| }, |
| info: function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('info')) { global.nativeLog.apply(global, format(args).concat( ['__INFO'] )); } |
| }, |
| warn: function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('warn')) { global.nativeLog.apply(global, format(args).concat( ['__WARN'] )); } |
| }, |
| error: function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('error')) { global.nativeLog.apply(global, format(args).concat( ['__ERROR'] )); } |
| } |
| }; |
| } |
| |
| // Web or Node |
| else { |
| var debug = console.debug; |
| var log = console.log; |
| var info = console.info; |
| var warn = console.warn; |
| var error = console.error; |
| console.__ori__ = { debug: debug, log: log, info: info, warn: warn, error: error }; |
| console.debug = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('debug')) { console.__ori__.debug.apply(console, args); } |
| }; |
| console.log = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('log')) { console.__ori__.log.apply(console, args); } |
| }; |
| console.info = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('info')) { console.__ori__.info.apply(console, args); } |
| }; |
| console.warn = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('warn')) { console.__ori__.warn.apply(console, args); } |
| }; |
| console.error = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (checkLevel('error')) { console.__ori__.error.apply(console, args); } |
| }; |
| } |
| } |
| |
| /** |
| * Reset hacked console to original. |
| */ |
| /* istanbul ignore next */ |
| function resetNativeConsole () { |
| levelMap = {}; |
| global.console = originalConsole; |
| } |
| |
| /** |
| * Generate map for which types of message will be sent in a certain message level |
| * as the order of LEVELS. |
| */ |
| function generateLevelMap () { |
| LEVELS.forEach(function (level) { |
| var levelIndex = LEVELS.indexOf(level); |
| levelMap[level] = {}; |
| LEVELS.forEach(function (type) { |
| var typeIndex = LEVELS.indexOf(type); |
| if (typeIndex <= levelIndex) { |
| levelMap[level][type] = true; |
| } |
| }); |
| }); |
| } |
| |
| /** |
| * Check if a certain type of message will be sent in current log level of env. |
| * @param {string} type |
| * @return {boolean} |
| */ |
| function checkLevel (type) { |
| var logLevel = (global.WXEnvironment && global.WXEnvironment.logLevel) || 'log'; |
| return levelMap[logLevel] && levelMap[logLevel][type] |
| } |
| |
| /** |
| * Convert all log arguments into primitive values. |
| * @param {array} args |
| * @return {array} |
| */ |
| /* istanbul ignore next */ |
| function format (args) { |
| return args.map(function (v) { |
| var type = Object.prototype.toString.call(v); |
| if (type.toLowerCase() === '[object object]') { |
| v = JSON.stringify(v); |
| } |
| else { |
| v = String(v); |
| } |
| return v |
| }) |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * @fileOverview |
| * Polyfill `setTimeout` on Android V8 using native method |
| * `setTimeoutNative(callbackId, time)` and JS method |
| * `setTimeoutCallback(callbackId)`. |
| * This polyfill is only used in virtual-DOM diff & flush agorithm. Not |
| * accessed by JS Bundle code (The timer APIs polyfill for JS Bundle is in |
| * `html5/default/app/ctrl.js`). |
| */ |
| |
| var originalSetTimeout = global.setTimeout; |
| var setTimeoutNative = global.setTimeoutNative; |
| |
| /** |
| * Set up native timer |
| */ |
| /* istanbul ignore next */ |
| function setNativeTimer () { |
| if (typeof setTimeout === 'undefined' && |
| typeof setTimeoutNative === 'function') { |
| var timeoutMap = {}; |
| var timeoutId = 0; |
| |
| global.setTimeout = function (cb, time) { |
| timeoutMap[++timeoutId] = cb; |
| setTimeoutNative(timeoutId.toString(), time); |
| }; |
| |
| global.setTimeoutCallback = function (id) { |
| if (typeof timeoutMap[id] === 'function') { |
| timeoutMap[id](); |
| delete timeoutMap[id]; |
| } |
| }; |
| } |
| } |
| |
| /* istanbul ignore next */ |
| function resetNativeTimer () { |
| global.setTimeout = originalSetTimeout; |
| global.setTimeoutCallback = null; |
| } |
| |
| setNativeTimer(); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * Freeze the prototype of javascript build-in objects. |
| */ |
| /* istanbul ignore next */ |
| function freezePrototype$1 () { |
| Object.freeze(Object); |
| Object.freeze(Array); |
| |
| // Object.freeze(Object.prototype) |
| freezeObjectProto(); |
| Object.freeze(Array.prototype); |
| Object.freeze(String.prototype); |
| Object.freeze(Number.prototype); |
| Object.freeze(Boolean.prototype); |
| |
| // Object.freeze(Error.prototype) |
| freezeErrorProto(); |
| Object.freeze(Date.prototype); |
| Object.freeze(RegExp.prototype); |
| } |
| |
| function freezeObjectProto () { |
| var proto = Object.prototype; |
| var protoName = 'Object.prototype'; |
| freezeProtoProperty(proto, '__defineGetter__', protoName); |
| freezeProtoProperty(proto, '__defineSetter__', protoName); |
| freezeProtoProperty(proto, '__lookupGetter__', protoName); |
| freezeProtoProperty(proto, '__lookupSetter__', protoName); |
| freezeProtoProperty(proto, 'constructor', protoName); |
| freezeProtoProperty(proto, 'hasOwnProperty', protoName); |
| freezeProtoProperty(proto, 'isPrototypeOf', protoName); |
| freezeProtoProperty(proto, 'propertyIsEnumerable', protoName); |
| freezeProtoProperty(proto, 'toLocaleString', protoName); |
| freezeProtoProperty(proto, 'toString', protoName); |
| freezeProtoProperty(proto, 'valueOf', protoName); |
| Object.seal(proto); |
| } |
| |
| function freezeErrorProto () { |
| var proto = Error.prototype; |
| var protoName = 'Error.prototype'; |
| freezeProtoProperty(proto, 'name', protoName); |
| freezeProtoProperty(proto, 'message', protoName); |
| freezeProtoProperty(proto, 'toString', protoName); |
| freezeProtoProperty(proto, 'constructor', protoName); |
| Object.seal(proto); |
| } |
| |
| function freezeProtoProperty (proto, propertyName, protoName) { |
| if (!proto.hasOwnProperty(propertyName)) { |
| return |
| } |
| |
| var origin = proto[propertyName]; |
| Object.defineProperty(proto, propertyName, { |
| get: function () { |
| return origin |
| }, |
| set: function (value) { |
| if (this === proto) { |
| throw Error(("Cannot assign to read only property " + propertyName + " of " + protoName)) |
| } |
| |
| Object.defineProperty(this, propertyName, { |
| value: value, |
| writable: true |
| }); |
| |
| return value |
| } |
| }); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // import promise hack and polyfills |
| |
| /** |
| * Get a unique id. |
| */ |
| var nextNodeRef = 1; |
| function uniqueId () { |
| return (nextNodeRef++).toString() |
| } |
| |
| function typof (v) { |
| var s = Object.prototype.toString.call(v); |
| return s.substring(8, s.length - 1) |
| } |
| |
| function bufferToBase64 (buffer) { |
| if (typeof btoa !== 'function') { |
| return '' |
| } |
| var string = Array.prototype.map.call( |
| new Uint8Array(buffer), |
| function (code) { return String.fromCharCode(code); } |
| ).join(''); |
| return btoa(string) // eslint-disable-line no-undef |
| } |
| |
| function base64ToBuffer (base64) { |
| if (typeof atob !== 'function') { |
| return new ArrayBuffer(0) |
| } |
| var string = atob(base64); // eslint-disable-line no-undef |
| var array = new Uint8Array(string.length); |
| Array.prototype.forEach.call(string, function (ch, i) { |
| array[i] = ch.charCodeAt(0); |
| }); |
| return array.buffer |
| } |
| |
| /** |
| * Normalize a primitive value. |
| * @param {any} v |
| * @return {primitive} |
| */ |
| function normalizePrimitive (v) { |
| var type = typof(v); |
| |
| switch (type) { |
| case 'Undefined': |
| case 'Null': |
| return '' |
| |
| case 'RegExp': |
| return v.toString() |
| case 'Date': |
| return v.toISOString() |
| |
| case 'Number': |
| case 'String': |
| case 'Boolean': |
| case 'Array': |
| case 'Object': |
| return v |
| |
| case 'ArrayBuffer': |
| return { |
| '@type': 'binary', |
| dataType: type, |
| base64: bufferToBase64(v) |
| } |
| |
| case 'Int8Array': |
| case 'Uint8Array': |
| case 'Uint8ClampedArray': |
| case 'Int16Array': |
| case 'Uint16Array': |
| case 'Int32Array': |
| case 'Uint32Array': |
| case 'Float32Array': |
| case 'Float64Array': |
| return { |
| '@type': 'binary', |
| dataType: type, |
| base64: bufferToBase64(v.buffer) |
| } |
| |
| default: |
| return JSON.stringify(v) |
| } |
| } |
| |
| function decodePrimitive (data) { |
| if (typof(data) === 'Object') { |
| // decode base64 into binary |
| if (data['@type'] && data['@type'] === 'binary') { |
| return base64ToBuffer(data.base64 || '') |
| } |
| |
| var realData = {}; |
| for (var key in data) { |
| realData[key] = decodePrimitive(data[key]); |
| } |
| return realData |
| } |
| if (typof(data) === 'Array') { |
| return data.map(decodePrimitive) |
| } |
| return data |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * For general callback management of a certain Weex instance. |
| * Because function can not passed into native, so we create callback |
| * callback id for each function and pass the callback id into native |
| * in fact. And when a callback called from native, we can find the real |
| * callback through the callback id we have passed before. |
| */ |
| var CallbackManager = function CallbackManager (instanceId) { |
| this.instanceId = instanceId; |
| this.lastCallbackId = 0; |
| this.callbacks = {}; |
| }; |
| CallbackManager.prototype.add = function add (callback) { |
| this.lastCallbackId++; |
| this.callbacks[this.lastCallbackId] = callback; |
| return this.lastCallbackId |
| }; |
| CallbackManager.prototype.remove = function remove (callbackId) { |
| var callback = this.callbacks[callbackId]; |
| delete this.callbacks[callbackId]; |
| return callback |
| }; |
| CallbackManager.prototype.consume = function consume (callbackId, data, ifKeepAlive) { |
| var callback = this.callbacks[callbackId]; |
| if (typeof ifKeepAlive === 'undefined' || ifKeepAlive === false) { |
| delete this.callbacks[callbackId]; |
| } |
| if (typeof callback === 'function') { |
| return callback(decodePrimitive(data)) |
| } |
| return new Error(("invalid callback id \"" + callbackId + "\"")) |
| }; |
| CallbackManager.prototype.close = function close () { |
| this.callbacks = {}; |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| var docMap = {}; |
| |
| /** |
| * Add a document object into docMap. |
| * @param {string} id |
| * @param {object} document |
| */ |
| function addDoc (id, doc) { |
| if (id) { |
| docMap[id] = doc; |
| } |
| } |
| |
| /** |
| * Get the document object by id. |
| * @param {string} id |
| */ |
| function getDoc (id) { |
| return docMap[id] |
| } |
| |
| /** |
| * Remove the document from docMap by id. |
| * @param {string} id |
| */ |
| function removeDoc (id) { |
| delete docMap[id]; |
| } |
| |
| /** |
| * @deprecated |
| * Get listener by document id. |
| * @param {string} id |
| * @return {object} listener |
| */ |
| |
| |
| /** |
| * Get TaskCenter instance by id. |
| * @param {string} id |
| * @return {object} TaskCenter |
| */ |
| function getTaskCenter (id) { |
| var doc = docMap[id]; |
| if (doc && doc.taskCenter) { |
| return doc.taskCenter |
| } |
| return null |
| } |
| |
| /** |
| * Append body node to documentElement. |
| * @param {object} document |
| * @param {object} node |
| * @param {object} before |
| */ |
| function appendBody (doc, node, before) { |
| var documentElement = doc.documentElement; |
| |
| if (documentElement.pureChildren.length > 0 || node.parentNode) { |
| return |
| } |
| var children = documentElement.children; |
| var beforeIndex = children.indexOf(before); |
| if (beforeIndex < 0) { |
| children.push(node); |
| } |
| else { |
| children.splice(beforeIndex, 0, node); |
| } |
| |
| if (node.nodeType === 1) { |
| if (node.role === 'body') { |
| node.docId = doc.id; |
| node.ownerDocument = doc; |
| node.parentNode = documentElement; |
| linkParent(node, documentElement); |
| } |
| else { |
| node.children.forEach(function (child) { |
| child.parentNode = node; |
| }); |
| setBody(doc, node); |
| node.docId = doc.id; |
| node.ownerDocument = doc; |
| linkParent(node, documentElement); |
| delete doc.nodeMap[node.nodeId]; |
| } |
| documentElement.pureChildren.push(node); |
| sendBody(doc, node); |
| } |
| else { |
| node.parentNode = documentElement; |
| doc.nodeMap[node.ref] = node; |
| } |
| } |
| |
| function sendBody (doc, node) { |
| var body = node.toJSON(); |
| var children = body.children; |
| delete body.children; |
| var result = doc.taskCenter.send('dom', { action: 'createBody' }, [body]); |
| if (children) { |
| children.forEach(function (child) { |
| result = doc.taskCenter.send('dom', { action: 'addElement' }, [body.ref, child, -1]); |
| }); |
| } |
| return result |
| } |
| |
| /** |
| * Set up body node. |
| * @param {object} document |
| * @param {object} element |
| */ |
| function setBody (doc, el) { |
| el.role = 'body'; |
| el.depth = 1; |
| delete doc.nodeMap[el.nodeId]; |
| el.ref = '_root'; |
| doc.nodeMap._root = el; |
| doc.body = el; |
| } |
| |
| /** |
| * Establish the connection between parent and child node. |
| * @param {object} child node |
| * @param {object} parent node |
| */ |
| function linkParent (node, parent) { |
| node.parentNode = parent; |
| if (parent.docId) { |
| node.docId = parent.docId; |
| node.ownerDocument = parent.ownerDocument; |
| node.ownerDocument.nodeMap[node.nodeId] = node; |
| node.depth = parent.depth + 1; |
| } |
| node.children.forEach(function (child) { |
| linkParent(child, node); |
| }); |
| } |
| |
| /** |
| * Get the next sibling element. |
| * @param {object} node |
| */ |
| function nextElement (node) { |
| while (node) { |
| if (node.nodeType === 1) { |
| return node |
| } |
| node = node.nextSibling; |
| } |
| } |
| |
| /** |
| * Get the previous sibling element. |
| * @param {object} node |
| */ |
| function previousElement (node) { |
| while (node) { |
| if (node.nodeType === 1) { |
| return node |
| } |
| node = node.previousSibling; |
| } |
| } |
| |
| /** |
| * Insert a node into list at the specified index. |
| * @param {object} target node |
| * @param {array} list |
| * @param {number} newIndex |
| * @param {boolean} changeSibling |
| * @return {number} newIndex |
| */ |
| function insertIndex (target, list, newIndex, changeSibling) { |
| /* istanbul ignore next */ |
| if (newIndex < 0) { |
| newIndex = 0; |
| } |
| var before = list[newIndex - 1]; |
| var after = list[newIndex]; |
| list.splice(newIndex, 0, target); |
| if (changeSibling) { |
| before && (before.nextSibling = target); |
| target.previousSibling = before; |
| target.nextSibling = after; |
| after && (after.previousSibling = target); |
| } |
| return newIndex |
| } |
| |
| /** |
| * Move the node to a new index in list. |
| * @param {object} target node |
| * @param {array} list |
| * @param {number} newIndex |
| * @param {boolean} changeSibling |
| * @return {number} newIndex |
| */ |
| function moveIndex (target, list, newIndex, changeSibling) { |
| var index = list.indexOf(target); |
| /* istanbul ignore next */ |
| if (index < 0) { |
| return -1 |
| } |
| if (changeSibling) { |
| var before = list[index - 1]; |
| var after = list[index + 1]; |
| before && (before.nextSibling = after); |
| after && (after.previousSibling = before); |
| } |
| list.splice(index, 1); |
| var newIndexAfter = newIndex; |
| if (index <= newIndex) { |
| newIndexAfter = newIndex - 1; |
| } |
| var beforeNew = list[newIndexAfter - 1]; |
| var afterNew = list[newIndexAfter]; |
| list.splice(newIndexAfter, 0, target); |
| if (changeSibling) { |
| beforeNew && (beforeNew.nextSibling = target); |
| target.previousSibling = beforeNew; |
| target.nextSibling = afterNew; |
| afterNew && (afterNew.previousSibling = target); |
| } |
| if (index === newIndexAfter) { |
| return -1 |
| } |
| return newIndex |
| } |
| |
| /** |
| * Remove the node from list. |
| * @param {object} target node |
| * @param {array} list |
| * @param {boolean} changeSibling |
| */ |
| function removeIndex (target, list, changeSibling) { |
| var index = list.indexOf(target); |
| /* istanbul ignore next */ |
| if (index < 0) { |
| return |
| } |
| if (changeSibling) { |
| var before = list[index - 1]; |
| var after = list[index + 1]; |
| before && (before.nextSibling = after); |
| after && (after.previousSibling = before); |
| } |
| list.splice(index, 1); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| var Node = function Node () { |
| this.nodeId = uniqueId(); |
| this.ref = this.nodeId; |
| this.children = []; |
| this.pureChildren = []; |
| this.parentNode = null; |
| this.nextSibling = null; |
| this.previousSibling = null; |
| }; |
| |
| /** |
| * Destroy current node, and remove itself form nodeMap. |
| */ |
| Node.prototype.destroy = function destroy () { |
| var doc = getDoc(this.docId); |
| if (doc) { |
| delete this.docId; |
| delete doc.nodeMap[this.nodeId]; |
| } |
| this.children.forEach(function (child) { |
| child.destroy(); |
| }); |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var Element$2; |
| |
| function setElement (El) { |
| Element$2 = El; |
| } |
| |
| /** |
| * A map which stores all type of elements. |
| * @type {Object} |
| */ |
| var registeredElements = {}; |
| |
| /** |
| * Register an extended element type with component methods. |
| * @param {string} type component type |
| * @param {array} methods a list of method names |
| */ |
| function registerElement (type, methods) { |
| // Skip when no special component methods. |
| if (!methods || !methods.length) { |
| return |
| } |
| |
| // Init constructor. |
| var WeexElement = (function (Element) { |
| function WeexElement () { |
| Element.apply(this, arguments); |
| }if ( Element ) WeexElement.__proto__ = Element; |
| WeexElement.prototype = Object.create( Element && Element.prototype ); |
| WeexElement.prototype.constructor = WeexElement; |
| |
| |
| |
| return WeexElement; |
| }(Element$2)); |
| |
| // Add methods to prototype. |
| methods.forEach(function (methodName) { |
| WeexElement.prototype[methodName] = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| var taskCenter = getTaskCenter(this.docId); |
| if (taskCenter) { |
| return taskCenter.send('component', { |
| ref: this.ref, |
| component: type, |
| method: methodName |
| }, args) |
| } |
| }; |
| }); |
| |
| // Add to element type map. |
| registeredElements[type] = WeexElement; |
| } |
| |
| |
| |
| function getWeexElement (type) { |
| return registeredElements[type] |
| } |
| |
| |
| |
| /** |
| * Clear all element types. Only for testing. |
| */ |
| |
| // match the binding delimiter |
| var delimiterRE = /\[\[((?:.|\n)+?)\]\]/g; |
| |
| function generateBinding (text) { |
| if (typof(text) === 'String') { |
| return { '@binding': text } |
| } |
| return text |
| } |
| |
| function parseString (string) { |
| var tokens = []; |
| var lastIndex = delimiterRE.lastIndex = 0; |
| var match, index; |
| while ((match = delimiterRE.exec(string))) { |
| index = match.index; |
| if (index > lastIndex) { |
| tokens.push(string.slice(lastIndex, index)); |
| } |
| var binding = generateBinding(match[1].trim()); |
| tokens.push(binding); |
| lastIndex = index + match[0].length; |
| } |
| if (lastIndex < string.length) { |
| tokens.push(string.slice(lastIndex)); |
| } |
| if (tokens.length === 1) { |
| return tokens[0] |
| } |
| return tokens |
| } |
| |
| function filterDirective (value) { |
| if (typof(value) === 'String' && delimiterRE.test(value)) { |
| return parseString(value) |
| } |
| if (typof(value) === 'Object') { |
| var realData = {}; |
| for (var key in value) { |
| realData[key] = filterDirective(value[key]); |
| } |
| return realData |
| } |
| if (typof(value) === 'Array') { |
| return value.map(filterDirective) |
| } |
| return value |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| var DEFAULT_TAG_NAME = 'div'; |
| var BUBBLE_EVENTS = [ |
| 'click', 'longpress', 'touchstart', 'touchmove', 'touchend', |
| 'panstart', 'panmove', 'panend', 'horizontalpan', 'verticalpan', 'swipe' |
| ]; |
| |
| function registerNode (docId, node) { |
| var doc = getDoc(docId); |
| doc.nodeMap[node.nodeId] = node; |
| } |
| |
| var Element = (function (Node$$1) { |
| function Element (type, props, isExtended) { |
| if ( type === void 0 ) type = DEFAULT_TAG_NAME; |
| |
| Node$$1.call(this); |
| |
| var WeexElement = getWeexElement(type); |
| if (WeexElement && !isExtended) { |
| return new WeexElement(props) |
| } |
| |
| props = props || {}; |
| this.nodeType = 1; |
| this.nodeId = uniqueId(); |
| this.ref = this.nodeId; |
| this.type = type; |
| this.attr = props.attr || {}; |
| this.style = props.style || {}; |
| this.classStyle = props.classStyle || {}; |
| this.event = {}; |
| this.children = []; |
| this.pureChildren = []; |
| } |
| |
| if ( Node$$1 ) Element.__proto__ = Node$$1; |
| Element.prototype = Object.create( Node$$1 && Node$$1.prototype ); |
| Element.prototype.constructor = Element; |
| |
| /** |
| * Append a child node. |
| * @param {object} node |
| * @return {undefined | number} the signal sent by native |
| */ |
| Element.prototype.appendChild = function appendChild (node) { |
| if (node.parentNode && node.parentNode !== this) { |
| return |
| } |
| /* istanbul ignore else */ |
| if (!node.parentNode) { |
| linkParent(node, this); |
| insertIndex(node, this.children, this.children.length, true); |
| if (this.docId) { |
| registerNode(this.docId, node); |
| } |
| if (node.nodeType === 1) { |
| insertIndex(node, this.pureChildren, this.pureChildren.length); |
| var taskCenter = getTaskCenter(this.docId); |
| if (taskCenter) { |
| return taskCenter.send( |
| 'dom', |
| { action: 'addElement' }, |
| [this.ref, node.toJSON(), -1] |
| ) |
| } |
| } |
| } |
| else { |
| moveIndex(node, this.children, this.children.length, true); |
| if (node.nodeType === 1) { |
| var index = moveIndex(node, this.pureChildren, this.pureChildren.length); |
| var taskCenter$1 = getTaskCenter(this.docId); |
| if (taskCenter$1 && index >= 0) { |
| return taskCenter$1.send( |
| 'dom', |
| { action: 'moveElement' }, |
| [node.ref, this.ref, index] |
| ) |
| } |
| } |
| } |
| }; |
| |
| /** |
| * Insert a node before specified node. |
| * @param {object} node |
| * @param {object} before |
| * @return {undefined | number} the signal sent by native |
| */ |
| Element.prototype.insertBefore = function insertBefore (node, before) { |
| if (node.parentNode && node.parentNode !== this) { |
| return |
| } |
| if (node === before || (node.nextSibling && node.nextSibling === before)) { |
| return |
| } |
| if (!node.parentNode) { |
| linkParent(node, this); |
| insertIndex(node, this.children, this.children.indexOf(before), true); |
| if (this.docId) { |
| registerNode(this.docId, node); |
| } |
| if (node.nodeType === 1) { |
| var pureBefore = nextElement(before); |
| var index = insertIndex( |
| node, |
| this.pureChildren, |
| pureBefore |
| ? this.pureChildren.indexOf(pureBefore) |
| : this.pureChildren.length |
| ); |
| var taskCenter = getTaskCenter(this.docId); |
| if (taskCenter) { |
| return taskCenter.send( |
| 'dom', |
| { action: 'addElement' }, |
| [this.ref, node.toJSON(), index] |
| ) |
| } |
| } |
| } |
| else { |
| moveIndex(node, this.children, this.children.indexOf(before), true); |
| if (node.nodeType === 1) { |
| var pureBefore$1 = nextElement(before); |
| /* istanbul ignore next */ |
| var index$1 = moveIndex( |
| node, |
| this.pureChildren, |
| pureBefore$1 |
| ? this.pureChildren.indexOf(pureBefore$1) |
| : this.pureChildren.length |
| ); |
| var taskCenter$1 = getTaskCenter(this.docId); |
| if (taskCenter$1 && index$1 >= 0) { |
| return taskCenter$1.send( |
| 'dom', |
| { action: 'moveElement' }, |
| [node.ref, this.ref, index$1] |
| ) |
| } |
| } |
| } |
| }; |
| |
| /** |
| * Insert a node after specified node. |
| * @param {object} node |
| * @param {object} after |
| * @return {undefined | number} the signal sent by native |
| */ |
| Element.prototype.insertAfter = function insertAfter (node, after) { |
| if (node.parentNode && node.parentNode !== this) { |
| return |
| } |
| if (node === after || (node.previousSibling && node.previousSibling === after)) { |
| return |
| } |
| if (!node.parentNode) { |
| linkParent(node, this); |
| insertIndex(node, this.children, this.children.indexOf(after) + 1, true); |
| /* istanbul ignore else */ |
| if (this.docId) { |
| registerNode(this.docId, node); |
| } |
| if (node.nodeType === 1) { |
| var index = insertIndex( |
| node, |
| this.pureChildren, |
| this.pureChildren.indexOf(previousElement(after)) + 1 |
| ); |
| var taskCenter = getTaskCenter(this.docId); |
| /* istanbul ignore else */ |
| if (taskCenter) { |
| return taskCenter.send( |
| 'dom', |
| { action: 'addElement' }, |
| [this.ref, node.toJSON(), index] |
| ) |
| } |
| } |
| } |
| else { |
| moveIndex(node, this.children, this.children.indexOf(after) + 1, true); |
| if (node.nodeType === 1) { |
| var index$1 = moveIndex( |
| node, |
| this.pureChildren, |
| this.pureChildren.indexOf(previousElement(after)) + 1 |
| ); |
| var taskCenter$1 = getTaskCenter(this.docId); |
| if (taskCenter$1 && index$1 >= 0) { |
| return taskCenter$1.send( |
| 'dom', |
| { action: 'moveElement' }, |
| [node.ref, this.ref, index$1] |
| ) |
| } |
| } |
| } |
| }; |
| |
| /** |
| * Remove a child node, and decide whether it should be destroyed. |
| * @param {object} node |
| * @param {boolean} preserved |
| */ |
| Element.prototype.removeChild = function removeChild (node, preserved) { |
| if (node.parentNode) { |
| removeIndex(node, this.children, true); |
| if (node.nodeType === 1) { |
| removeIndex(node, this.pureChildren); |
| var taskCenter = getTaskCenter(this.docId); |
| if (taskCenter) { |
| taskCenter.send( |
| 'dom', |
| { action: 'removeElement' }, |
| [node.ref] |
| ); |
| } |
| } |
| } |
| if (!preserved) { |
| node.destroy(); |
| } |
| }; |
| |
| /** |
| * Clear all child nodes. |
| */ |
| Element.prototype.clear = function clear () { |
| var taskCenter = getTaskCenter(this.docId); |
| /* istanbul ignore else */ |
| if (taskCenter) { |
| this.pureChildren.forEach(function (node) { |
| taskCenter.send( |
| 'dom', |
| { action: 'removeElement' }, |
| [node.ref] |
| ); |
| }); |
| } |
| this.children.forEach(function (node) { |
| node.destroy(); |
| }); |
| this.children.length = 0; |
| this.pureChildren.length = 0; |
| }; |
| |
| /** |
| * Set an attribute, and decide whether the task should be send to native. |
| * @param {string} key |
| * @param {string | number} value |
| * @param {boolean} silent |
| */ |
| Element.prototype.setAttr = function setAttr (key, value, silent) { |
| if (this.attr[key] === value && silent !== false) { |
| return |
| } |
| this.attr[key] = value; |
| var taskCenter = getTaskCenter(this.docId); |
| if (!silent && taskCenter) { |
| var result = {}; |
| result[key] = filterDirective(value); |
| taskCenter.send( |
| 'dom', |
| { action: 'updateAttrs' }, |
| [this.ref, result] |
| ); |
| } |
| }; |
| |
| /** |
| * Set a style property, and decide whether the task should be send to native. |
| * @param {string} key |
| * @param {string | number} value |
| * @param {boolean} silent |
| */ |
| Element.prototype.setStyle = function setStyle (key, value, silent) { |
| if (this.style[key] === value && silent !== false) { |
| return |
| } |
| this.style[key] = value; |
| var taskCenter = getTaskCenter(this.docId); |
| if (!silent && taskCenter) { |
| var result = {}; |
| result[key] = value; |
| taskCenter.send( |
| 'dom', |
| { action: 'updateStyle' }, |
| [this.ref, result] |
| ); |
| } |
| }; |
| |
| /** |
| * Set style properties from class. |
| * @param {object} classStyle |
| */ |
| Element.prototype.setClassStyle = function setClassStyle (classStyle) { |
| var this$1 = this; |
| |
| // reset previous class style to empty string |
| for (var key in this.classStyle) { |
| this$1.classStyle[key] = ''; |
| } |
| |
| Object.assign(this.classStyle, classStyle); |
| var taskCenter = getTaskCenter(this.docId); |
| if (taskCenter) { |
| taskCenter.send( |
| 'dom', |
| { action: 'updateStyle' }, |
| [this.ref, this.toStyle()] |
| ); |
| } |
| }; |
| |
| /** |
| * Add an event handler. |
| * @param {string} event type |
| * @param {function} event handler |
| */ |
| Element.prototype.addEvent = function addEvent (type, handler) { |
| if (!this.event[type]) { |
| this.event[type] = handler; |
| var taskCenter = getTaskCenter(this.docId); |
| if (taskCenter) { |
| taskCenter.send( |
| 'dom', |
| { action: 'addEvent' }, |
| [this.ref, type] |
| ); |
| } |
| } |
| }; |
| |
| /** |
| * Remove an event handler. |
| * @param {string} event type |
| */ |
| Element.prototype.removeEvent = function removeEvent (type) { |
| if (this.event[type]) { |
| delete this.event[type]; |
| var taskCenter = getTaskCenter(this.docId); |
| if (taskCenter) { |
| taskCenter.send( |
| 'dom', |
| { action: 'removeEvent' }, |
| [this.ref, type] |
| ); |
| } |
| } |
| }; |
| |
| /** |
| * Fire an event manually. |
| * @param {string} type type |
| * @param {function} e handler |
| * @param {boolean} isBubble whether or not event bubble |
| * @return {} anything returned by handler function |
| */ |
| Element.prototype.fireEvent = function fireEvent (type, e, isBubble) { |
| var result = null; |
| var isStopPropagation = false; |
| var handler = this.event[type]; |
| if (handler && e) { |
| e.stopPropagation = function () { |
| isStopPropagation = true; |
| }; |
| result = handler.call(this, e); |
| } |
| |
| if (!isStopPropagation |
| && isBubble |
| && BUBBLE_EVENTS.includes(type) |
| && this.parentNode |
| && this.parentNode.fireEvent) { |
| e.currentTarget = this.parentNode; |
| this.parentNode.fireEvent(type, e, isBubble); |
| } |
| |
| return result |
| }; |
| |
| /** |
| * Get all styles of current element. |
| * @return {object} style |
| */ |
| Element.prototype.toStyle = function toStyle () { |
| return Object.assign({}, this.classStyle, this.style) |
| }; |
| |
| /** |
| * Convert current element to JSON like object. |
| * @return {object} element |
| */ |
| Element.prototype.toJSON = function toJSON () { |
| var result = { |
| ref: this.ref.toString(), |
| type: this.type, |
| attr: filterDirective(this.attr), |
| style: this.toStyle() |
| }; |
| var event = Object.keys(this.event); |
| if (event.length) { |
| result.event = event; |
| } |
| if (this.pureChildren.length) { |
| result.children = this.pureChildren.map(function (child) { return child.toJSON(); }); |
| } |
| return result |
| }; |
| |
| /** |
| * Convert to HTML element tag string. |
| * @return {stirng} html |
| */ |
| Element.prototype.toString = function toString () { |
| return '<' + this.type + |
| ' attr=' + JSON.stringify(this.attr) + |
| ' style=' + JSON.stringify(this.toStyle()) + '>' + |
| this.pureChildren.map(function (child) { return child.toString(); }).join('') + |
| '</' + this.type + '>' |
| }; |
| |
| return Element; |
| }(Node)); |
| |
| setElement(Element); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var fallback = function () {}; |
| |
| // The API of TaskCenter would be re-design. |
| var TaskCenter = function TaskCenter (id, sendTasks) { |
| Object.defineProperty(this, 'instanceId', { |
| enumerable: true, |
| value: id |
| }); |
| Object.defineProperty(this, 'callbackManager', { |
| enumerable: true, |
| value: new CallbackManager(id) |
| }); |
| fallback = sendTasks || function () {}; |
| }; |
| |
| TaskCenter.prototype.callback = function callback (callbackId, data, ifKeepAlive) { |
| return this.callbackManager.consume(callbackId, data, ifKeepAlive) |
| }; |
| |
| TaskCenter.prototype.destroyCallback = function destroyCallback () { |
| return this.callbackManager.close() |
| }; |
| |
| /** |
| * Normalize a value. Specially, if the value is a function, then generate a function id |
| * and save it to `CallbackManager`, at last return the function id. |
| * @param{any} v |
| * @return {primitive} |
| */ |
| TaskCenter.prototype.normalize = function normalize (v) { |
| var type = typof(v); |
| if (v && v instanceof Element) { |
| return v.ref |
| } |
| if (v && v._isVue && v.$el instanceof Element) { |
| return v.$el.ref |
| } |
| if (type === 'Function') { |
| return this.callbackManager.add(v).toString() |
| } |
| return normalizePrimitive(v) |
| }; |
| |
| TaskCenter.prototype.send = function send (type, params, args, options) { |
| var this$1 = this; |
| |
| var action = params.action; |
| var component = params.component; |
| var ref = params.ref; |
| var module = params.module; |
| var method = params.method; |
| |
| args = args.map(function (arg) { return this$1.normalize(arg); }); |
| |
| switch (type) { |
| case 'dom': |
| return this[action](this.instanceId, args) |
| case 'component': |
| return this.componentHandler(this.instanceId, ref, method, args, Object.assign({ component: component }, options)) |
| default: |
| return this.moduleHandler(this.instanceId, module, method, args, options) |
| } |
| }; |
| |
| TaskCenter.prototype.callDOM = function callDOM (action, args) { |
| return this[action](this.instanceId, args) |
| }; |
| |
| TaskCenter.prototype.callComponent = function callComponent (ref, method, args, options) { |
| return this.componentHandler(this.instanceId, ref, method, args, options) |
| }; |
| |
| TaskCenter.prototype.callModule = function callModule (module, method, args, options) { |
| return this.moduleHandler(this.instanceId, module, method, args, options) |
| }; |
| |
| function init$2 () { |
| var DOM_METHODS = { |
| createFinish: global.callCreateFinish, |
| updateFinish: global.callUpdateFinish, |
| refreshFinish: global.callRefreshFinish, |
| |
| createBody: global.callCreateBody, |
| |
| addElement: global.callAddElement, |
| removeElement: global.callRemoveElement, |
| moveElement: global.callMoveElement, |
| updateAttrs: global.callUpdateAttrs, |
| updateStyle: global.callUpdateStyle, |
| |
| addEvent: global.callAddEvent, |
| removeEvent: global.callRemoveEvent |
| }; |
| var proto = TaskCenter.prototype; |
| |
| var loop = function ( name ) { |
| var method = DOM_METHODS[name]; |
| proto[name] = method ? |
| function (id, args) { return method.apply(void 0, [ id ].concat( args )); } : |
| function (id, args) { return fallback(id, [{ module: 'dom', method: name, args: args }], '-1'); }; |
| }; |
| |
| for (var name in DOM_METHODS) loop( name ); |
| |
| proto.componentHandler = global.callNativeComponent || |
| (function (id, ref, method, args, options) { return fallback(id, [{ component: options.component, ref: ref, method: method, args: args }]); }); |
| |
| proto.moduleHandler = global.callNativeModule || |
| (function (id, module, method, args) { return fallback(id, [{ module: module, method: method, args: args }]); }); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| // JS Services |
| |
| var services = []; |
| |
| /** |
| * Register a JavaScript service. |
| * A JavaScript service options could have a set of lifecycle methods |
| * for each Weex instance. For example: create, refresh, destroy. |
| * For the JS framework maintainer if you want to supply some features |
| * which need to work well in different Weex instances, even in different |
| * frameworks separately. You can make a JavaScript service to init |
| * its variables or classes for each Weex instance when it's created |
| * and recycle them when it's destroyed. |
| * @param {object} options Could have { create, refresh, destroy } |
| * lifecycle methods. In create method it should |
| * return an object of what variables or classes |
| * would be injected into the Weex instance. |
| */ |
| function register$1 (name, options) { |
| if (has$5(name)) { |
| console.warn(("Service \"" + name + "\" has been registered already!")); |
| } |
| else { |
| options = Object.assign({}, options); |
| services.push({ name: name, options: options }); |
| } |
| } |
| |
| /** |
| * Unregister a JavaScript service by name |
| * @param {string} name |
| */ |
| function unregister (name) { |
| services.some(function (service, index) { |
| if (service.name === name) { |
| services.splice(index, 1); |
| return true |
| } |
| }); |
| } |
| |
| /** |
| * Check if a JavaScript service with a certain name existed. |
| * @param {string} name |
| * @return {Boolean} |
| */ |
| function has$5 (name) { |
| return indexOf(name) >= 0 |
| } |
| |
| /** |
| * Find the index of a JavaScript service by name |
| * @param {string} name |
| * @return {number} |
| */ |
| function indexOf (name) { |
| return services.map(function (service) { return service.name; }).indexOf(name) |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var frameworks; |
| var runtimeConfig; |
| |
| var versionRegExp = /^\s*\/\/ *(\{[^}]*\}) *\r?\n/; |
| |
| /** |
| * Detect a JS Bundle code and make sure which framework it's based to. Each JS |
| * Bundle should make sure that it starts with a line of JSON comment and is |
| * more that one line. |
| * @param {string} code |
| * @return {object} |
| */ |
| function getBundleType (code) { |
| var result = versionRegExp.exec(code); |
| if (result) { |
| try { |
| var info = JSON.parse(result[1]); |
| return info.framework |
| } |
| catch (e) {} |
| } |
| |
| // default bundle type |
| return 'Weex' |
| } |
| |
| function createServices (id, env, config) { |
| // Init JavaScript services for this instance. |
| var serviceMap = Object.create(null); |
| serviceMap.service = Object.create(null); |
| services.forEach(function (ref) { |
| var name = ref.name; |
| var options = ref.options; |
| |
| { |
| console.debug(("[JS Runtime] create service " + name + ".")); |
| } |
| var create = options.create; |
| if (create) { |
| var result = create(id, env, config); |
| Object.assign(serviceMap.service, result); |
| Object.assign(serviceMap, result.instance); |
| } |
| }); |
| delete serviceMap.service.instance; |
| Object.freeze(serviceMap.service); |
| return serviceMap |
| } |
| |
| var instanceMap = {}; |
| |
| function getFrameworkType (id) { |
| if (instanceMap[id]) { |
| return instanceMap[id].framework |
| } |
| } |
| |
| /** |
| * Check which framework a certain JS Bundle code based to. And create instance |
| * by this framework. |
| * @param {string} id |
| * @param {string} code |
| * @param {object} config |
| * @param {object} data |
| */ |
| function createInstance (id, code, config, data) { |
| if (instanceMap[id]) { |
| return new Error(("invalid instance id \"" + id + "\"")) |
| } |
| |
| // Init instance info. |
| var bundleType = getBundleType(code); |
| |
| // Init instance config. |
| config = JSON.parse(JSON.stringify(config || {})); |
| config.env = JSON.parse(JSON.stringify(global.WXEnvironment || {})); |
| |
| var context = { |
| config: config, |
| created: Date.now(), |
| framework: bundleType |
| }; |
| context.services = createServices(id, context, runtimeConfig); |
| instanceMap[id] = context; |
| |
| { |
| console.debug(("[JS Framework] create an " + bundleType + " instance")); |
| } |
| |
| var fm = frameworks[bundleType]; |
| if (!fm) { |
| return new Error(("invalid bundle type \"" + bundleType + "\".")) |
| } |
| |
| return fm.createInstance(id, code, config, data, context) |
| } |
| |
| var methods = { |
| createInstance: createInstance, |
| registerService: register$1, |
| unregisterService: unregister |
| }; |
| |
| /** |
| * Register methods which init each frameworks. |
| * @param {string} methodName |
| */ |
| function genInit (methodName) { |
| methods[methodName] = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (methodName === 'registerComponents') { |
| checkComponentMethods(args[0]); |
| } |
| for (var name in frameworks) { |
| var framework = frameworks[name]; |
| if (framework && framework[methodName]) { |
| framework[methodName].apply(framework, args); |
| } |
| } |
| }; |
| } |
| |
| function checkComponentMethods (components) { |
| if (Array.isArray(components)) { |
| components.forEach(function (name) { |
| if (name && name.type && name.methods) { |
| registerElement(name.type, name.methods); |
| } |
| }); |
| } |
| } |
| |
| /** |
| * Register methods which will be called for each instance. |
| * @param {string} methodName |
| */ |
| function genInstance (methodName) { |
| methods[methodName] = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| var id = args[0]; |
| var type = getFrameworkType(id); |
| if (type && frameworks[type]) { |
| var result = (ref = frameworks[type])[methodName].apply(ref, args); |
| var info = { framework: type }; |
| |
| // Lifecycle methods |
| if (methodName === 'refreshInstance') { |
| services.forEach(function (service) { |
| var refresh = service.options.refresh; |
| if (refresh) { |
| refresh(id, { info: info, runtime: runtimeConfig }); |
| } |
| }); |
| } |
| else if (methodName === 'destroyInstance') { |
| services.forEach(function (service) { |
| var destroy = service.options.destroy; |
| if (destroy) { |
| destroy(id, { info: info, runtime: runtimeConfig }); |
| } |
| }); |
| delete instanceMap[id]; |
| } |
| |
| return result |
| } |
| return new Error(("invalid instance id \"" + id + "\"")) |
| var ref; |
| }; |
| } |
| |
| /** |
| * Adapt some legacy method(s) which will be called for each instance. These |
| * methods should be deprecated and removed later. |
| * @param {string} methodName |
| * @param {string} nativeMethodName |
| */ |
| function adaptInstance (methodName, nativeMethodName) { |
| methods[nativeMethodName] = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| var id = args[0]; |
| var type = getFrameworkType(id); |
| if (type && frameworks[type]) { |
| return (ref = frameworks[type])[methodName].apply(ref, args) |
| } |
| return new Error(("invalid instance id \"" + id + "\"")) |
| var ref; |
| }; |
| } |
| |
| function init$1 (config) { |
| runtimeConfig = config || {}; |
| frameworks = runtimeConfig.frameworks || {}; |
| init$2(); |
| |
| // Init each framework by `init` method and `config` which contains three |
| // virtual-DOM Class: `Document`, `Element` & `Comment`, and a JS bridge method: |
| // `sendTasks(...args)`. |
| for (var name in frameworks) { |
| var framework = frameworks[name]; |
| framework.init(config); |
| } |
| |
| // @todo: The method `registerMethods` will be re-designed or removed later. |
| ['registerComponents', 'registerModules', 'registerMethods'].forEach(genInit) |
| |
| ; ['destroyInstance', 'refreshInstance', 'receiveTasks', 'getRoot'].forEach(genInstance); |
| |
| adaptInstance('receiveTasks', 'callJS'); |
| |
| return methods |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| var Comment = (function (Node$$1) { |
| function Comment (value) { |
| Node$$1.call(this); |
| |
| this.nodeType = 8; |
| this.nodeId = uniqueId(); |
| this.ref = this.nodeId; |
| this.type = 'comment'; |
| this.value = value; |
| this.children = []; |
| this.pureChildren = []; |
| } |
| |
| if ( Node$$1 ) Comment.__proto__ = Node$$1; |
| Comment.prototype = Object.create( Node$$1 && Node$$1.prototype ); |
| Comment.prototype.constructor = Comment; |
| |
| /** |
| * Convert to HTML comment string. |
| * @return {stirng} html |
| */ |
| Comment.prototype.toString = function toString () { |
| return '<!-- ' + this.value + ' -->' |
| }; |
| |
| return Comment; |
| }(Node)); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * Create the action object. |
| * @param {string} name |
| * @param {array} arguments |
| * @return {object} action |
| */ |
| function createAction (name, args) { |
| if ( args === void 0 ) args = []; |
| |
| return { module: 'dom', method: name, args: args } |
| } |
| |
| var Listener = function Listener (id, handler) { |
| this.id = id; |
| this.batched = false; |
| this.updates = []; |
| if (typeof handler === 'function') { |
| Object.defineProperty(this, 'handler', { |
| configurable: true, |
| enumerable: true, |
| writable: true, |
| value: handler |
| }); |
| } |
| else { |
| console.error('[JS Runtime] invalid parameter, handler must be a function'); |
| } |
| }; |
| |
| /** |
| * Send the "createFinish" signal. |
| * @param {function} callback |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.createFinish = function createFinish (callback) { |
| var handler = this.handler; |
| return handler([createAction('createFinish')], callback) |
| }; |
| |
| /** |
| * Send the "updateFinish" signal. |
| * @param {function} callback |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.updateFinish = function updateFinish (callback) { |
| var handler = this.handler; |
| return handler([createAction('updateFinish')], callback) |
| }; |
| |
| /** |
| * Send the "refreshFinish" signal. |
| * @param {function} callback |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.refreshFinish = function refreshFinish (callback) { |
| var handler = this.handler; |
| return handler([createAction('refreshFinish')], callback) |
| }; |
| |
| /** |
| * Send the "createBody" signal. |
| * @param {object} element |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.createBody = function createBody (element) { |
| var body = element.toJSON(); |
| var children = body.children; |
| delete body.children; |
| var actions = [createAction('createBody', [body])]; |
| if (children) { |
| actions.push.apply(actions, children.map(function (child) { |
| return createAction('addElement', [body.ref, child, -1]) |
| })); |
| } |
| return this.addActions(actions) |
| }; |
| |
| /** |
| * Send the "addElement" signal. |
| * @param {object} element |
| * @param {stirng} reference id |
| * @param {number} index |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.addElement = function addElement (element, ref, index) { |
| if (!(index >= 0)) { |
| index = -1; |
| } |
| return this.addActions(createAction('addElement', [ref, element.toJSON(), index])) |
| }; |
| |
| /** |
| * Send the "removeElement" signal. |
| * @param {stirng} reference id |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.removeElement = function removeElement (ref) { |
| if (Array.isArray(ref)) { |
| var actions = ref.map(function (r) { return createAction('removeElement', [r]); }); |
| return this.addActions(actions) |
| } |
| return this.addActions(createAction('removeElement', [ref])) |
| }; |
| |
| /** |
| * Send the "moveElement" signal. |
| * @param {stirng} target reference id |
| * @param {stirng} parent reference id |
| * @param {number} index |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.moveElement = function moveElement (targetRef, parentRef, index) { |
| return this.addActions(createAction('moveElement', [targetRef, parentRef, index])) |
| }; |
| |
| /** |
| * Send the "updateAttrs" signal. |
| * @param {stirng} reference id |
| * @param {stirng} key |
| * @param {stirng} value |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.setAttr = function setAttr (ref, key, value) { |
| var result = {}; |
| result[key] = value; |
| return this.addActions(createAction('updateAttrs', [ref, result])) |
| }; |
| |
| /** |
| * Send the "updateStyle" signal, update a sole style. |
| * @param {stirng} reference id |
| * @param {stirng} key |
| * @param {stirng} value |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.setStyle = function setStyle (ref, key, value) { |
| var result = {}; |
| result[key] = value; |
| return this.addActions(createAction('updateStyle', [ref, result])) |
| }; |
| |
| /** |
| * Send the "updateStyle" signal. |
| * @param {stirng} reference id |
| * @param {object} style |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.setStyles = function setStyles (ref, style) { |
| return this.addActions(createAction('updateStyle', [ref, style])) |
| }; |
| |
| /** |
| * Send the "addEvent" signal. |
| * @param {stirng} reference id |
| * @param {string} event type |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.addEvent = function addEvent (ref, type) { |
| return this.addActions(createAction('addEvent', [ref, type])) |
| }; |
| |
| /** |
| * Send the "removeEvent" signal. |
| * @param {stirng} reference id |
| * @param {string} event type |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.removeEvent = function removeEvent (ref, type) { |
| return this.addActions(createAction('removeEvent', [ref, type])) |
| }; |
| |
| /** |
| * Default handler. |
| * @param {object | array} actions |
| * @param {function} callback |
| * @return {} anything returned by callback function |
| */ |
| Listener.prototype.handler = function handler (actions, cb) { |
| return cb && cb() |
| }; |
| |
| /** |
| * Add actions into updates. |
| * @param {object | array} actions |
| * @return {undefined | number} the signal sent by native |
| */ |
| Listener.prototype.addActions = function addActions (actions) { |
| var updates = this.updates; |
| var handler = this.handler; |
| |
| if (!Array.isArray(actions)) { |
| actions = [actions]; |
| } |
| |
| if (this.batched) { |
| updates.push.apply(updates, actions); |
| } |
| else { |
| return handler(actions) |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * @fileOverview |
| * Task handler for communication between javascript and native. |
| */ |
| |
| var handlerMap = { |
| createBody: 'callCreateBody', |
| addElement: 'callAddElement', |
| removeElement: 'callRemoveElement', |
| moveElement: 'callMoveElement', |
| updateAttrs: 'callUpdateAttrs', |
| updateStyle: 'callUpdateStyle', |
| addEvent: 'callAddEvent', |
| removeEvent: 'callRemoveEvent' |
| }; |
| |
| /** |
| * Create a task handler. |
| * @param {string} id |
| * @param {function} handler |
| * @return {function} taskHandler |
| */ |
| function createHandler (id, handler) { |
| var defaultHandler = handler || global.callNative; |
| |
| /* istanbul ignore if */ |
| if (typeof defaultHandler !== 'function') { |
| console.error('[JS Runtime] no default handler'); |
| } |
| |
| return function taskHandler (tasks) { |
| /* istanbul ignore if */ |
| if (!Array.isArray(tasks)) { |
| tasks = [tasks]; |
| } |
| for (var i = 0; i < tasks.length; i++) { |
| var returnValue = dispatchTask(id, tasks[i], defaultHandler); |
| if (returnValue === -1) { |
| return returnValue |
| } |
| } |
| } |
| } |
| |
| /** |
| * Check if there is a corresponding available handler in the environment. |
| * @param {string} module |
| * @param {string} method |
| * @return {boolean} |
| */ |
| function hasAvailableHandler (module, method) { |
| return module === 'dom' |
| && handlerMap[method] |
| && typeof global[handlerMap[method]] === 'function' |
| } |
| |
| /** |
| * Dispatch the task to the specified handler. |
| * @param {string} id |
| * @param {object} task |
| * @param {function} defaultHandler |
| * @return {number} signal returned from native |
| */ |
| function dispatchTask (id, task, defaultHandler) { |
| var module = task.module; |
| var method = task.method; |
| var args = task.args; |
| |
| if (hasAvailableHandler(module, method)) { |
| return global[handlerMap[method]].apply(global, [ id ].concat( args, ['-1'] )) |
| } |
| |
| return defaultHandler(id, [task], '-1') |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * Update all changes for an element. |
| * @param {object} element |
| * @param {object} changes |
| */ |
| function updateElement (el, changes) { |
| var attrs = changes.attrs || {}; |
| for (var name in attrs) { |
| el.setAttr(name, attrs[name], true); |
| } |
| var style = changes.style || {}; |
| for (var name$1 in style) { |
| el.setStyle(name$1, style[name$1], true); |
| } |
| } |
| |
| var Document = function Document (id, url, handler) { |
| id = id ? id.toString() : ''; |
| this.id = id; |
| this.URL = url; |
| |
| addDoc(id, this); |
| this.nodeMap = {}; |
| var L = Document.Listener || Listener; |
| this.listener = new L(id, handler || createHandler(id, Document.handler)); // deprecated |
| this.taskCenter = new TaskCenter(id, handler ? function (id) { |
| var args = [], len = arguments.length - 1; |
| while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ]; |
| |
| return handler.apply(void 0, args); |
| } : Document.handler); |
| this.createDocumentElement(); |
| }; |
| |
| /** |
| * Get the node from nodeMap. |
| * @param {string} reference id |
| * @return {object} node |
| */ |
| Document.prototype.getRef = function getRef (ref) { |
| return this.nodeMap[ref] |
| }; |
| |
| /** |
| * Turn on batched updates. |
| */ |
| Document.prototype.open = function open () { |
| this.listener.batched = false; |
| }; |
| |
| /** |
| * Turn off batched updates. |
| */ |
| Document.prototype.close = function close () { |
| this.listener.batched = true; |
| }; |
| |
| /** |
| * Create the document element. |
| * @return {object} documentElement |
| */ |
| Document.prototype.createDocumentElement = function createDocumentElement () { |
| var this$1 = this; |
| |
| if (!this.documentElement) { |
| var el = new Element('document'); |
| el.docId = this.id; |
| el.ownerDocument = this; |
| el.role = 'documentElement'; |
| el.depth = 0; |
| el.ref = '_documentElement'; |
| this.nodeMap._documentElement = el; |
| this.documentElement = el; |
| |
| Object.defineProperty(el, 'appendChild', { |
| configurable: true, |
| enumerable: true, |
| writable: true, |
| value: function (node) { |
| appendBody(this$1, node); |
| } |
| }); |
| |
| Object.defineProperty(el, 'insertBefore', { |
| configurable: true, |
| enumerable: true, |
| writable: true, |
| value: function (node, before) { |
| appendBody(this$1, node, before); |
| } |
| }); |
| } |
| |
| return this.documentElement |
| }; |
| |
| /** |
| * Create the body element. |
| * @param {string} type |
| * @param {objct} props |
| * @return {object} body element |
| */ |
| Document.prototype.createBody = function createBody (type, props) { |
| if (!this.body) { |
| var el = new Element(type, props); |
| setBody(this, el); |
| } |
| |
| return this.body |
| }; |
| |
| /** |
| * Create an element. |
| * @param {string} tagName |
| * @param {objct} props |
| * @return {object} element |
| */ |
| Document.prototype.createElement = function createElement (tagName, props) { |
| return new Element(tagName, props) |
| }; |
| |
| /** |
| * Create an comment. |
| * @param {string} text |
| * @return {object} comment |
| */ |
| Document.prototype.createComment = function createComment (text) { |
| return new Comment(text) |
| }; |
| |
| /** |
| * Fire an event on specified element manually. |
| * @param {object} element |
| * @param {string} event type |
| * @param {object} event object |
| * @param {object} dom changes |
| * @return {} anything returned by handler function |
| */ |
| Document.prototype.fireEvent = function fireEvent (el, type, e, domChanges) { |
| if (!el) { |
| return |
| } |
| e = e || {}; |
| e.type = type; |
| e.target = el; |
| e.currentTarget = el; |
| e.timestamp = Date.now(); |
| if (domChanges) { |
| updateElement(el, domChanges); |
| } |
| var isBubble = this.getRef('_root').attr['bubble'] === 'true'; |
| return el.fireEvent(type, e, isBubble) |
| }; |
| |
| /** |
| * Destroy current document, and remove itself form docMap. |
| */ |
| Document.prototype.destroy = function destroy () { |
| this.taskCenter.destroyCallback(); |
| delete this.listener; |
| delete this.nodeMap; |
| delete this.taskCenter; |
| removeDoc(this.id); |
| }; |
| |
| // default task handler |
| Document.handler = null; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var config = { |
| Document: Document, Element: Element, Comment: Comment, Listener: Listener, |
| TaskCenter: TaskCenter, |
| sendTasks: function sendTasks () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| if (typeof callNative === 'function') { |
| return callNative.apply(void 0, args) |
| } |
| return (global.callNative || (function () {})).apply(void 0, args) |
| } |
| }; |
| |
| Document.handler = config.sendTasks; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * @fileOverview |
| * Register framework(s) in JS runtime. Weex supply two layers for 3rd-party |
| * framework(s): one is the instance management layer, another is the |
| * virtual-DOM layer. |
| */ |
| |
| /* istanbul ignore next */ |
| function freezePrototype$$1 () { |
| freezePrototype$1(); |
| |
| Object.freeze(config.Element); |
| Object.freeze(config.Comment); |
| Object.freeze(config.Listener); |
| Object.freeze(config.Document.prototype); |
| Object.freeze(config.Element.prototype); |
| Object.freeze(config.Comment.prototype); |
| Object.freeze(config.Listener.prototype); |
| } |
| |
| var runtime = { |
| setNativeConsole: setNativeConsole, |
| resetNativeConsole: resetNativeConsole, |
| setNativeTimer: setNativeTimer, |
| resetNativeTimer: resetNativeTimer, |
| service: { register: register$1, unregister: unregister, has: has$5 }, |
| freezePrototype: freezePrototype$$1, |
| init: init$1, |
| config: config |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var config$2 = {}; |
| |
| var instanceMap$1 = {}; |
| |
| function init$3 (cfg) { |
| config$2.Document = cfg.Document; |
| config$2.Element = cfg.Element; |
| config$2.Comment = cfg.Comment; |
| config$2.sendTasks = cfg.sendTasks; |
| } |
| |
| function createInstance$1 (id, code, options, data, serviceObjects) { |
| if ( options === void 0 ) options = {}; |
| if ( data === void 0 ) data = {}; |
| if ( serviceObjects === void 0 ) serviceObjects = {}; |
| |
| var document = new config$2.Document(id, options.bundleUrl); |
| var callbacks = {}; |
| var instance = { id: id, data: data, document: document, callbacks: callbacks }; |
| |
| var lastCallbackId = 0; |
| document.addCallback = function (func) { |
| lastCallbackId++; |
| callbacks[lastCallbackId] = func; |
| return lastCallbackId |
| }; |
| document.handleCallback = function (funcId, data, ifLast) { |
| var callback = callbacks[funcId]; |
| if (ifLast) { |
| delete callbacks[funcId]; |
| } |
| return callback(data) |
| }; |
| instanceMap$1[id] = instance; |
| |
| var globalObjects = Object.assign({ |
| Document: config$2.Document, |
| Element: config$2.Element, |
| Comment: config$2.Comment, |
| sendTasks: function (tasks) { return config$2.sendTasks(id, tasks, -1); }, |
| options: options, |
| document: document |
| }, serviceObjects); |
| |
| var globalKeys = []; |
| var globalValues = []; |
| for (var key in globalObjects) { |
| globalKeys.push(key); |
| globalValues.push(globalObjects[key]); |
| } |
| globalKeys.push(code); |
| |
| var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) )); |
| result.apply(void 0, globalValues); |
| |
| config$2.sendTasks(id, [{ module: 'dom', method: 'createFinish', args: [] }], -1); |
| |
| return instance |
| } |
| |
| function destroyInstance (id) { |
| delete instanceMap$1[id]; |
| } |
| |
| function getRoot (id) { |
| return instanceMap$1[id].document.body.toJSON() |
| } |
| |
| function receiveTasks (id, tasks) { |
| var jsHandlers = { |
| fireEvent: function (id, ref, type, data, domChanges) { |
| var ref$1 = instanceMap$1[id]; |
| var document = ref$1.document; |
| var el = document.getRef(ref); |
| return document.fireEvent(el, type, data, domChanges) |
| }, |
| |
| callback: function (id, funcId, data, ifLast) { |
| var ref = instanceMap$1[id]; |
| var document = ref.document; |
| return document.handleCallback(funcId, data, ifLast) |
| } |
| }; |
| |
| var ref = instanceMap$1[id] || {}; |
| var document = ref.document; |
| if (document && Array.isArray(tasks)) { |
| var results = []; |
| tasks.forEach(function (task) { |
| var handler = jsHandlers[task.method]; |
| var args = [].concat( task.args ); |
| if (typeof handler === 'function') { |
| args.unshift(id); |
| results.push(handler.apply(void 0, args)); |
| } |
| }); |
| return results |
| } |
| } |
| |
| |
| var Vanilla = Object.freeze({ |
| init: init$3, |
| createInstance: createInstance$1, |
| destroyInstance: destroyInstance, |
| getRoot: getRoot, |
| receiveTasks: receiveTasks |
| }); |
| |
| var factory = createCommonjsModule(function (module) { |
| 'use strict'; |
| |
| module.exports = function weexFactory (exports, renderer) { |
| |
| /* */ |
| |
| // these helpers produces better vm code in JS engines due to their |
| // explicitness and function inlining |
| function isUndef (v) { |
| return v === undefined || v === null |
| } |
| |
| function isDef (v) { |
| return v !== undefined && v !== null |
| } |
| |
| function isTrue (v) { |
| return v === true |
| } |
| |
| function isFalse (v) { |
| return v === false |
| } |
| |
| /** |
| * Check if value is primitive |
| */ |
| function isPrimitive (value) { |
| return ( |
| typeof value === 'string' || |
| typeof value === 'number' || |
| typeof value === 'boolean' |
| ) |
| } |
| |
| /** |
| * Quick object check - this is primarily used to tell |
| * Objects from primitive values when we know the value |
| * is a JSON-compliant type. |
| */ |
| function isObject (obj) { |
| return obj !== null && typeof obj === 'object' |
| } |
| |
| var _toString = Object.prototype.toString; |
| |
| /** |
| * Strict object type check. Only returns true |
| * for plain JavaScript objects. |
| */ |
| function isPlainObject (obj) { |
| return _toString.call(obj) === '[object Object]' |
| } |
| |
| function isRegExp (v) { |
| return _toString.call(v) === '[object RegExp]' |
| } |
| |
| /** |
| * Check if val is a valid array index. |
| */ |
| function isValidArrayIndex (val) { |
| var n = parseFloat(val); |
| return n >= 0 && Math.floor(n) === n && isFinite(val) |
| } |
| |
| /** |
| * Convert a value to a string that is actually rendered. |
| */ |
| function toString (val) { |
| return val == null |
| ? '' |
| : typeof val === 'object' |
| ? JSON.stringify(val, null, 2) |
| : String(val) |
| } |
| |
| /** |
| * Convert a input value to a number for persistence. |
| * If the conversion fails, return original string. |
| */ |
| function toNumber (val) { |
| var n = parseFloat(val); |
| return isNaN(n) ? val : n |
| } |
| |
| /** |
| * Make a map and return a function for checking if a key |
| * is in that map. |
| */ |
| function makeMap ( |
| str, |
| expectsLowerCase |
| ) { |
| var map = Object.create(null); |
| var list = str.split(','); |
| for (var i = 0; i < list.length; i++) { |
| map[list[i]] = true; |
| } |
| return expectsLowerCase |
| ? function (val) { return map[val.toLowerCase()]; } |
| : function (val) { return map[val]; } |
| } |
| |
| /** |
| * Check if a tag is a built-in tag. |
| */ |
| var isBuiltInTag = makeMap('slot,component', true); |
| |
| /** |
| * Check if a attribute is a reserved attribute. |
| */ |
| var isReservedAttribute = makeMap('key,ref,slot,is'); |
| |
| /** |
| * Remove an item from an array |
| */ |
| function remove (arr, item) { |
| if (arr.length) { |
| var index = arr.indexOf(item); |
| if (index > -1) { |
| return arr.splice(index, 1) |
| } |
| } |
| } |
| |
| /** |
| * Check whether the object has the property. |
| */ |
| var hasOwnProperty = Object.prototype.hasOwnProperty; |
| function hasOwn (obj, key) { |
| return hasOwnProperty.call(obj, key) |
| } |
| |
| /** |
| * Create a cached version of a pure function. |
| */ |
| function cached (fn) { |
| var cache = Object.create(null); |
| return (function cachedFn (str) { |
| var hit = cache[str]; |
| return hit || (cache[str] = fn(str)) |
| }) |
| } |
| |
| /** |
| * Camelize a hyphen-delimited string. |
| */ |
| var camelizeRE = /-(\w)/g; |
| var camelize = cached(function (str) { |
| return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) |
| }); |
| |
| /** |
| * Capitalize a string. |
| */ |
| var capitalize = cached(function (str) { |
| return str.charAt(0).toUpperCase() + str.slice(1) |
| }); |
| |
| /** |
| * Hyphenate a camelCase string. |
| */ |
| var hyphenateRE = /([^-])([A-Z])/g; |
| var hyphenate = cached(function (str) { |
| return str |
| .replace(hyphenateRE, '$1-$2') |
| .replace(hyphenateRE, '$1-$2') |
| .toLowerCase() |
| }); |
| |
| /** |
| * Simple bind, faster than native |
| */ |
| function bind (fn, ctx) { |
| function boundFn (a) { |
| var l = arguments.length; |
| return l |
| ? l > 1 |
| ? fn.apply(ctx, arguments) |
| : fn.call(ctx, a) |
| : fn.call(ctx) |
| } |
| // record original fn length |
| boundFn._length = fn.length; |
| return boundFn |
| } |
| |
| /** |
| * Convert an Array-like object to a real Array. |
| */ |
| function toArray (list, start) { |
| start = start || 0; |
| var i = list.length - start; |
| var ret = new Array(i); |
| while (i--) { |
| ret[i] = list[i + start]; |
| } |
| return ret |
| } |
| |
| /** |
| * Mix properties into target object. |
| */ |
| function extend (to, _from) { |
| for (var key in _from) { |
| to[key] = _from[key]; |
| } |
| return to |
| } |
| |
| /** |
| * Merge an Array of Objects into a single Object. |
| */ |
| function toObject (arr) { |
| var res = {}; |
| for (var i = 0; i < arr.length; i++) { |
| if (arr[i]) { |
| extend(res, arr[i]); |
| } |
| } |
| return res |
| } |
| |
| /** |
| * Perform no operation. |
| * Stubbing args to make Flow happy without leaving useless transpiled code |
| * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/) |
| */ |
| function noop (a, b, c) {} |
| |
| /** |
| * Always return false. |
| */ |
| var no = function (a, b, c) { return false; }; |
| |
| /** |
| * Return same value |
| */ |
| var identity = function (_) { return _; }; |
| |
| /** |
| * Generate a static keys string from compiler modules. |
| */ |
| |
| |
| /** |
| * Check if two values are loosely equal - that is, |
| * if they are plain objects, do they have the same shape? |
| */ |
| function looseEqual (a, b) { |
| if (a === b) { return true } |
| var isObjectA = isObject(a); |
| var isObjectB = isObject(b); |
| if (isObjectA && isObjectB) { |
| try { |
| var isArrayA = Array.isArray(a); |
| var isArrayB = Array.isArray(b); |
| if (isArrayA && isArrayB) { |
| return a.length === b.length && a.every(function (e, i) { |
| return looseEqual(e, b[i]) |
| }) |
| } else if (!isArrayA && !isArrayB) { |
| var keysA = Object.keys(a); |
| var keysB = Object.keys(b); |
| return keysA.length === keysB.length && keysA.every(function (key) { |
| return looseEqual(a[key], b[key]) |
| }) |
| } else { |
| /* istanbul ignore next */ |
| return false |
| } |
| } catch (e) { |
| /* istanbul ignore next */ |
| return false |
| } |
| } else if (!isObjectA && !isObjectB) { |
| return String(a) === String(b) |
| } else { |
| return false |
| } |
| } |
| |
| function looseIndexOf (arr, val) { |
| for (var i = 0; i < arr.length; i++) { |
| if (looseEqual(arr[i], val)) { return i } |
| } |
| return -1 |
| } |
| |
| /** |
| * Ensure a function is called only once. |
| */ |
| function once (fn) { |
| var called = false; |
| return function () { |
| if (!called) { |
| called = true; |
| fn.apply(this, arguments); |
| } |
| } |
| } |
| |
| var SSR_ATTR = 'data-server-rendered'; |
| |
| var ASSET_TYPES = [ |
| 'component', |
| 'directive', |
| 'filter' |
| ]; |
| |
| var LIFECYCLE_HOOKS = [ |
| 'beforeCreate', |
| 'created', |
| 'beforeMount', |
| 'mounted', |
| 'beforeUpdate', |
| 'updated', |
| 'beforeDestroy', |
| 'destroyed', |
| 'activated', |
| 'deactivated' |
| ]; |
| |
| /* */ |
| |
| var config = ({ |
| /** |
| * Option merge strategies (used in core/util/options) |
| */ |
| optionMergeStrategies: Object.create(null), |
| |
| /** |
| * Whether to suppress warnings. |
| */ |
| silent: false, |
| |
| /** |
| * Show production mode tip message on boot? |
| */ |
| productionTip: "development" !== 'production', |
| |
| /** |
| * Whether to enable devtools |
| */ |
| devtools: "development" !== 'production', |
| |
| /** |
| * Whether to record perf |
| */ |
| performance: false, |
| |
| /** |
| * Error handler for watcher errors |
| */ |
| errorHandler: null, |
| |
| /** |
| * Warn handler for watcher warns |
| */ |
| warnHandler: null, |
| |
| /** |
| * Ignore certain custom elements |
| */ |
| ignoredElements: [], |
| |
| /** |
| * Custom user key aliases for v-on |
| */ |
| keyCodes: Object.create(null), |
| |
| /** |
| * Check if a tag is reserved so that it cannot be registered as a |
| * component. This is platform-dependent and may be overwritten. |
| */ |
| isReservedTag: no, |
| |
| /** |
| * Check if an attribute is reserved so that it cannot be used as a component |
| * prop. This is platform-dependent and may be overwritten. |
| */ |
| isReservedAttr: no, |
| |
| /** |
| * Check if a tag is an unknown element. |
| * Platform-dependent. |
| */ |
| isUnknownElement: no, |
| |
| /** |
| * Get the namespace of an element |
| */ |
| getTagNamespace: noop, |
| |
| /** |
| * Parse the real tag name for the specific platform. |
| */ |
| parsePlatformTagName: identity, |
| |
| /** |
| * Check if an attribute must be bound using property, e.g. value |
| * Platform-dependent. |
| */ |
| mustUseProp: no, |
| |
| /** |
| * Exposed for legacy reasons |
| */ |
| _lifecycleHooks: LIFECYCLE_HOOKS |
| }); |
| |
| /* */ |
| |
| var emptyObject = Object.freeze({}); |
| |
| /** |
| * Check if a string starts with $ or _ |
| */ |
| function isReserved (str) { |
| var c = (str + '').charCodeAt(0); |
| return c === 0x24 || c === 0x5F |
| } |
| |
| /** |
| * Define a property. |
| */ |
| function def (obj, key, val, enumerable) { |
| Object.defineProperty(obj, key, { |
| value: val, |
| enumerable: !!enumerable, |
| writable: true, |
| configurable: true |
| }); |
| } |
| |
| /** |
| * Parse simple path. |
| */ |
| var bailRE = /[^\w.$]/; |
| function parsePath (path) { |
| if (bailRE.test(path)) { |
| return |
| } |
| var segments = path.split('.'); |
| return function (obj) { |
| for (var i = 0; i < segments.length; i++) { |
| if (!obj) { return } |
| obj = obj[segments[i]]; |
| } |
| return obj |
| } |
| } |
| |
| /* */ |
| |
| var warn = noop; |
| var tip = noop; |
| var formatComponentName = (null); // work around flow check |
| |
| { |
| var hasConsole = typeof console !== 'undefined'; |
| var classifyRE = /(?:^|[-_])(\w)/g; |
| var classify = function (str) { return str |
| .replace(classifyRE, function (c) { return c.toUpperCase(); }) |
| .replace(/[-_]/g, ''); }; |
| |
| warn = function (msg, vm) { |
| var trace = vm ? generateComponentTrace(vm) : ''; |
| |
| if (config.warnHandler) { |
| config.warnHandler.call(null, msg, vm, trace); |
| } else if (hasConsole && (!config.silent)) { |
| console.error(("[Vue warn]: " + msg + trace)); |
| } |
| }; |
| |
| tip = function (msg, vm) { |
| if (hasConsole && (!config.silent)) { |
| console.warn("[Vue tip]: " + msg + ( |
| vm ? generateComponentTrace(vm) : '' |
| )); |
| } |
| }; |
| |
| formatComponentName = function (vm, includeFile) { |
| if (vm.$root === vm) { |
| return '<Root>' |
| } |
| var name = typeof vm === 'string' |
| ? vm |
| : typeof vm === 'function' && vm.options |
| ? vm.options.name |
| : vm._isVue |
| ? vm.$options.name || vm.$options._componentTag |
| : vm.name; |
| |
| var file = vm._isVue && vm.$options.__file; |
| if (!name && file) { |
| var match = file.match(/([^/\\]+)\.vue$/); |
| name = match && match[1]; |
| } |
| |
| return ( |
| (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") + |
| (file && includeFile !== false ? (" at " + file) : '') |
| ) |
| }; |
| |
| var repeat = function (str, n) { |
| var res = ''; |
| while (n) { |
| if (n % 2 === 1) { res += str; } |
| if (n > 1) { str += str; } |
| n >>= 1; |
| } |
| return res |
| }; |
| |
| var generateComponentTrace = function (vm) { |
| if (vm._isVue && vm.$parent) { |
| var tree = []; |
| var currentRecursiveSequence = 0; |
| while (vm) { |
| if (tree.length > 0) { |
| var last = tree[tree.length - 1]; |
| if (last.constructor === vm.constructor) { |
| currentRecursiveSequence++; |
| vm = vm.$parent; |
| continue |
| } else if (currentRecursiveSequence > 0) { |
| tree[tree.length - 1] = [last, currentRecursiveSequence]; |
| currentRecursiveSequence = 0; |
| } |
| } |
| tree.push(vm); |
| vm = vm.$parent; |
| } |
| return '\n\nfound in\n\n' + tree |
| .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm) |
| ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)") |
| : formatComponentName(vm))); }) |
| .join('\n') |
| } else { |
| return ("\n\n(found in " + (formatComponentName(vm)) + ")") |
| } |
| }; |
| } |
| |
| /* */ |
| |
| function handleError (err, vm, info) { |
| if (config.errorHandler) { |
| config.errorHandler.call(null, err, vm, info); |
| } else { |
| { |
| warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm); |
| } |
| /* istanbul ignore else */ |
| if (inBrowser && typeof console !== 'undefined') { |
| console.error(err); |
| } else { |
| throw err |
| } |
| } |
| } |
| |
| /* */ |
| /* globals MutationObserver */ |
| |
| // can we use __proto__? |
| var hasProto = '__proto__' in {}; |
| |
| // Browser environment sniffing |
| var inBrowser = typeof window !== 'undefined'; |
| var UA = inBrowser && window.navigator.userAgent.toLowerCase(); |
| var isIE = UA && /msie|trident/.test(UA); |
| var isIE9 = UA && UA.indexOf('msie 9.0') > 0; |
| var isEdge = UA && UA.indexOf('edge/') > 0; |
| var isAndroid = UA && UA.indexOf('android') > 0; |
| var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); |
| var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; |
| |
| // Firefix has a "watch" function on Object.prototype... |
| var nativeWatch = ({}).watch; |
| |
| var supportsPassive = false; |
| if (inBrowser) { |
| try { |
| var opts = {}; |
| Object.defineProperty(opts, 'passive', ({ |
| get: function get () { |
| /* istanbul ignore next */ |
| supportsPassive = true; |
| } |
| })); // https://github.com/facebook/flow/issues/285 |
| window.addEventListener('test-passive', null, opts); |
| } catch (e) {} |
| } |
| |
| // this needs to be lazy-evaled because vue may be required before |
| // vue-server-renderer can set VUE_ENV |
| var _isServer; |
| var isServerRendering = function () { |
| if (_isServer === undefined) { |
| /* istanbul ignore if */ |
| if (!inBrowser && typeof commonjsGlobal !== 'undefined') { |
| // detect presence of vue-server-renderer and avoid |
| // Webpack shimming the process |
| _isServer = commonjsGlobal['process'].env.VUE_ENV === 'server'; |
| } else { |
| _isServer = false; |
| } |
| } |
| return _isServer |
| }; |
| |
| // detect devtools |
| var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; |
| |
| /* istanbul ignore next */ |
| function isNative (Ctor) { |
| return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) |
| } |
| |
| var hasSymbol = |
| typeof Symbol !== 'undefined' && isNative(Symbol) && |
| typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); |
| |
| /** |
| * Defer a task to execute it asynchronously. |
| */ |
| var nextTick = (function () { |
| var callbacks = []; |
| var pending = false; |
| var timerFunc; |
| |
| function nextTickHandler () { |
| pending = false; |
| var copies = callbacks.slice(0); |
| callbacks.length = 0; |
| for (var i = 0; i < copies.length; i++) { |
| copies[i](); |
| } |
| } |
| |
| // the nextTick behavior leverages the microtask queue, which can be accessed |
| // via either native Promise.then or MutationObserver. |
| // MutationObserver has wider support, however it is seriously bugged in |
| // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It |
| // completely stops working after triggering a few times... so, if native |
| // Promise is available, we will use it: |
| /* istanbul ignore if */ |
| if (typeof Promise !== 'undefined' && isNative(Promise)) { |
| var p = Promise.resolve(); |
| var logError = function (err) { console.error(err); }; |
| timerFunc = function () { |
| p.then(nextTickHandler).catch(logError); |
| // in problematic UIWebViews, Promise.then doesn't completely break, but |
| // it can get stuck in a weird state where callbacks are pushed into the |
| // microtask queue but the queue isn't being flushed, until the browser |
| // needs to do some other work, e.g. handle a timer. Therefore we can |
| // "force" the microtask queue to be flushed by adding an empty timer. |
| if (isIOS) { setTimeout(noop); } |
| }; |
| } else if (typeof MutationObserver !== 'undefined' && ( |
| isNative(MutationObserver) || |
| // PhantomJS and iOS 7.x |
| MutationObserver.toString() === '[object MutationObserverConstructor]' |
| )) { |
| // use MutationObserver where native Promise is not available, |
| // e.g. PhantomJS IE11, iOS7, Android 4.4 |
| var counter = 1; |
| var observer = new MutationObserver(nextTickHandler); |
| var textNode = document.createTextNode(String(counter)); |
| observer.observe(textNode, { |
| characterData: true |
| }); |
| timerFunc = function () { |
| counter = (counter + 1) % 2; |
| textNode.data = String(counter); |
| }; |
| } else { |
| // fallback to setTimeout |
| /* istanbul ignore next */ |
| timerFunc = function () { |
| setTimeout(nextTickHandler, 0); |
| }; |
| } |
| |
| return function queueNextTick (cb, ctx) { |
| var _resolve; |
| callbacks.push(function () { |
| if (cb) { |
| try { |
| cb.call(ctx); |
| } catch (e) { |
| handleError(e, ctx, 'nextTick'); |
| } |
| } else if (_resolve) { |
| _resolve(ctx); |
| } |
| }); |
| if (!pending) { |
| pending = true; |
| timerFunc(); |
| } |
| if (!cb && typeof Promise !== 'undefined') { |
| return new Promise(function (resolve, reject) { |
| _resolve = resolve; |
| }) |
| } |
| } |
| })(); |
| |
| var _Set; |
| /* istanbul ignore if */ |
| if (typeof Set !== 'undefined' && isNative(Set)) { |
| // use native Set when available. |
| _Set = Set; |
| } else { |
| // a non-standard Set polyfill that only works with primitive keys. |
| _Set = (function () { |
| function Set () { |
| this.set = Object.create(null); |
| } |
| Set.prototype.has = function has (key) { |
| return this.set[key] === true |
| }; |
| Set.prototype.add = function add (key) { |
| this.set[key] = true; |
| }; |
| Set.prototype.clear = function clear () { |
| this.set = Object.create(null); |
| }; |
| |
| return Set; |
| }()); |
| } |
| |
| /* */ |
| |
| |
| var uid$1 = 0; |
| |
| /** |
| * A dep is an observable that can have multiple |
| * directives subscribing to it. |
| */ |
| var Dep = function Dep () { |
| this.id = uid$1++; |
| this.subs = []; |
| }; |
| |
| Dep.prototype.addSub = function addSub (sub) { |
| this.subs.push(sub); |
| }; |
| |
| Dep.prototype.removeSub = function removeSub (sub) { |
| remove(this.subs, sub); |
| }; |
| |
| Dep.prototype.depend = function depend () { |
| if (Dep.target) { |
| Dep.target.addDep(this); |
| } |
| }; |
| |
| Dep.prototype.notify = function notify () { |
| // stabilize the subscriber list first |
| var subs = this.subs.slice(); |
| for (var i = 0, l = subs.length; i < l; i++) { |
| subs[i].update(); |
| } |
| }; |
| |
| // the current target watcher being evaluated. |
| // this is globally unique because there could be only one |
| // watcher being evaluated at any time. |
| Dep.target = null; |
| var targetStack = []; |
| |
| function pushTarget (_target) { |
| if (Dep.target) { targetStack.push(Dep.target); } |
| Dep.target = _target; |
| } |
| |
| function popTarget () { |
| Dep.target = targetStack.pop(); |
| } |
| |
| /* |
| * not type checking this file because flow doesn't play well with |
| * dynamically accessing methods on Array prototype |
| */ |
| |
| var arrayProto = Array.prototype; |
| var arrayMethods = Object.create(arrayProto);[ |
| 'push', |
| 'pop', |
| 'shift', |
| 'unshift', |
| 'splice', |
| 'sort', |
| 'reverse' |
| ] |
| .forEach(function (method) { |
| // cache original method |
| var original = arrayProto[method]; |
| def(arrayMethods, method, function mutator () { |
| var arguments$1 = arguments; |
| |
| var args = [], len = arguments.length; |
| while ( len-- ) { args[ len ] = arguments$1[ len ]; } |
| |
| var result = original.apply(this, args); |
| var ob = this.__ob__; |
| var inserted; |
| switch (method) { |
| case 'push': |
| case 'unshift': |
| inserted = args; |
| break |
| case 'splice': |
| inserted = args.slice(2); |
| break |
| } |
| if (inserted) { ob.observeArray(inserted); } |
| // notify change |
| ob.dep.notify(); |
| return result |
| }); |
| }); |
| |
| /* */ |
| |
| var arrayKeys = Object.getOwnPropertyNames(arrayMethods); |
| |
| /** |
| * By default, when a reactive property is set, the new value is |
| * also converted to become reactive. However when passing down props, |
| * we don't want to force conversion because the value may be a nested value |
| * under a frozen data structure. Converting it would defeat the optimization. |
| */ |
| var observerState = { |
| shouldConvert: true |
| }; |
| |
| /** |
| * Observer class that are attached to each observed |
| * object. Once attached, the observer converts target |
| * object's property keys into getter/setters that |
| * collect dependencies and dispatches updates. |
| */ |
| var Observer = function Observer (value) { |
| this.value = value; |
| this.dep = new Dep(); |
| this.vmCount = 0; |
| def(value, '__ob__', this); |
| if (Array.isArray(value)) { |
| var augment = hasProto |
| ? protoAugment |
| : copyAugment; |
| augment(value, arrayMethods, arrayKeys); |
| this.observeArray(value); |
| } else { |
| this.walk(value); |
| } |
| }; |
| |
| /** |
| * Walk through each property and convert them into |
| * getter/setters. This method should only be called when |
| * value type is Object. |
| */ |
| Observer.prototype.walk = function walk (obj) { |
| var keys = Object.keys(obj); |
| for (var i = 0; i < keys.length; i++) { |
| defineReactive$$1(obj, keys[i], obj[keys[i]]); |
| } |
| }; |
| |
| /** |
| * Observe a list of Array items. |
| */ |
| Observer.prototype.observeArray = function observeArray (items) { |
| for (var i = 0, l = items.length; i < l; i++) { |
| observe(items[i]); |
| } |
| }; |
| |
| // helpers |
| |
| /** |
| * Augment an target Object or Array by intercepting |
| * the prototype chain using __proto__ |
| */ |
| function protoAugment (target, src, keys) { |
| /* eslint-disable no-proto */ |
| target.__proto__ = src; |
| /* eslint-enable no-proto */ |
| } |
| |
| /** |
| * Augment an target Object or Array by defining |
| * hidden properties. |
| */ |
| /* istanbul ignore next */ |
| function copyAugment (target, src, keys) { |
| for (var i = 0, l = keys.length; i < l; i++) { |
| var key = keys[i]; |
| def(target, key, src[key]); |
| } |
| } |
| |
| /** |
| * Attempt to create an observer instance for a value, |
| * returns the new observer if successfully observed, |
| * or the existing observer if the value already has one. |
| */ |
| function observe (value, asRootData) { |
| if (!isObject(value)) { |
| return |
| } |
| var ob; |
| if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { |
| ob = value.__ob__; |
| } else if ( |
| observerState.shouldConvert && |
| !isServerRendering() && |
| (Array.isArray(value) || isPlainObject(value)) && |
| Object.isExtensible(value) && |
| !value._isVue |
| ) { |
| ob = new Observer(value); |
| } |
| if (asRootData && ob) { |
| ob.vmCount++; |
| } |
| return ob |
| } |
| |
| /** |
| * Define a reactive property on an Object. |
| */ |
| function defineReactive$$1 ( |
| obj, |
| key, |
| val, |
| customSetter, |
| shallow |
| ) { |
| var dep = new Dep(); |
| |
| var property = Object.getOwnPropertyDescriptor(obj, key); |
| if (property && property.configurable === false) { |
| return |
| } |
| |
| // cater for pre-defined getter/setters |
| var getter = property && property.get; |
| var setter = property && property.set; |
| |
| var childOb = !shallow && observe(val); |
| Object.defineProperty(obj, key, { |
| enumerable: true, |
| configurable: true, |
| get: function reactiveGetter () { |
| var value = getter ? getter.call(obj) : val; |
| if (Dep.target) { |
| dep.depend(); |
| if (childOb) { |
| childOb.dep.depend(); |
| } |
| if (Array.isArray(value)) { |
| dependArray(value); |
| } |
| } |
| return value |
| }, |
| set: function reactiveSetter (newVal) { |
| var value = getter ? getter.call(obj) : val; |
| /* eslint-disable no-self-compare */ |
| if (newVal === value || (newVal !== newVal && value !== value)) { |
| return |
| } |
| /* eslint-enable no-self-compare */ |
| if ("development" !== 'production' && customSetter) { |
| customSetter(); |
| } |
| if (setter) { |
| setter.call(obj, newVal); |
| } else { |
| val = newVal; |
| } |
| childOb = !shallow && observe(newVal); |
| dep.notify(); |
| } |
| }); |
| } |
| |
| /** |
| * Set a property on an object. Adds the new property and |
| * triggers change notification if the property doesn't |
| * already exist. |
| */ |
| function set (target, key, val) { |
| if (Array.isArray(target) && isValidArrayIndex(key)) { |
| target.length = Math.max(target.length, key); |
| target.splice(key, 1, val); |
| return val |
| } |
| if (hasOwn(target, key)) { |
| target[key] = val; |
| return val |
| } |
| var ob = (target).__ob__; |
| if (target._isVue || (ob && ob.vmCount)) { |
| "development" !== 'production' && warn( |
| 'Avoid adding reactive properties to a Vue instance or its root $data ' + |
| 'at runtime - declare it upfront in the data option.' |
| ); |
| return val |
| } |
| if (!ob) { |
| target[key] = val; |
| return val |
| } |
| defineReactive$$1(ob.value, key, val); |
| ob.dep.notify(); |
| return val |
| } |
| |
| /** |
| * Delete a property and trigger change if necessary. |
| */ |
| function del (target, key) { |
| if (Array.isArray(target) && isValidArrayIndex(key)) { |
| target.splice(key, 1); |
| return |
| } |
| var ob = (target).__ob__; |
| if (target._isVue || (ob && ob.vmCount)) { |
| "development" !== 'production' && warn( |
| 'Avoid deleting properties on a Vue instance or its root $data ' + |
| '- just set it to null.' |
| ); |
| return |
| } |
| if (!hasOwn(target, key)) { |
| return |
| } |
| delete target[key]; |
| if (!ob) { |
| return |
| } |
| ob.dep.notify(); |
| } |
| |
| /** |
| * Collect dependencies on array elements when the array is touched, since |
| * we cannot intercept array element access like property getters. |
| */ |
| function dependArray (value) { |
| for (var e = (void 0), i = 0, l = value.length; i < l; i++) { |
| e = value[i]; |
| e && e.__ob__ && e.__ob__.dep.depend(); |
| if (Array.isArray(e)) { |
| dependArray(e); |
| } |
| } |
| } |
| |
| /* */ |
| |
| /** |
| * Option overwriting strategies are functions that handle |
| * how to merge a parent option value and a child option |
| * value into the final value. |
| */ |
| var strats = config.optionMergeStrategies; |
| |
| /** |
| * Options with restrictions |
| */ |
| { |
| strats.el = strats.propsData = function (parent, child, vm, key) { |
| if (!vm) { |
| warn( |
| "option \"" + key + "\" can only be used during instance " + |
| 'creation with the `new` keyword.' |
| ); |
| } |
| return defaultStrat(parent, child) |
| }; |
| } |
| |
| /** |
| * Helper that recursively merges two data objects together. |
| */ |
| function mergeData (to, from) { |
| if (!from) { return to } |
| var key, toVal, fromVal; |
| var keys = Object.keys(from); |
| for (var i = 0; i < keys.length; i++) { |
| key = keys[i]; |
| toVal = to[key]; |
| fromVal = from[key]; |
| if (!hasOwn(to, key)) { |
| set(to, key, fromVal); |
| } else if (isPlainObject(toVal) && isPlainObject(fromVal)) { |
| mergeData(toVal, fromVal); |
| } |
| } |
| return to |
| } |
| |
| /** |
| * Data |
| */ |
| function mergeDataOrFn ( |
| parentVal, |
| childVal, |
| vm |
| ) { |
| if (!vm) { |
| // in a Vue.extend merge, both should be functions |
| if (!childVal) { |
| return parentVal |
| } |
| if (!parentVal) { |
| return childVal |
| } |
| // when parentVal & childVal are both present, |
| // we need to return a function that returns the |
| // merged result of both functions... no need to |
| // check if parentVal is a function here because |
| // it has to be a function to pass previous merges. |
| return function mergedDataFn () { |
| return mergeData( |
| typeof childVal === 'function' ? childVal.call(this) : childVal, |
| typeof parentVal === 'function' ? parentVal.call(this) : parentVal |
| ) |
| } |
| } else if (parentVal || childVal) { |
| return function mergedInstanceDataFn () { |
| // instance merge |
| var instanceData = typeof childVal === 'function' |
| ? childVal.call(vm) |
| : childVal; |
| var defaultData = typeof parentVal === 'function' |
| ? parentVal.call(vm) |
| : undefined; |
| if (instanceData) { |
| return mergeData(instanceData, defaultData) |
| } else { |
| return defaultData |
| } |
| } |
| } |
| } |
| |
| strats.data = function ( |
| parentVal, |
| childVal, |
| vm |
| ) { |
| if (!vm) { |
| if (childVal && typeof childVal !== 'function') { |
| "development" !== 'production' && warn( |
| 'The "data" option should be a function ' + |
| 'that returns a per-instance value in component ' + |
| 'definitions.', |
| vm |
| ); |
| |
| return parentVal |
| } |
| return mergeDataOrFn.call(this, parentVal, childVal) |
| } |
| |
| return mergeDataOrFn(parentVal, childVal, vm) |
| }; |
| |
| /** |
| * Hooks and props are merged as arrays. |
| */ |
| function mergeHook ( |
| parentVal, |
| childVal |
| ) { |
| return childVal |
| ? parentVal |
| ? parentVal.concat(childVal) |
| : Array.isArray(childVal) |
| ? childVal |
| : [childVal] |
| : parentVal |
| } |
| |
| LIFECYCLE_HOOKS.forEach(function (hook) { |
| strats[hook] = mergeHook; |
| }); |
| |
| /** |
| * Assets |
| * |
| * When a vm is present (instance creation), we need to do |
| * a three-way merge between constructor options, instance |
| * options and parent options. |
| */ |
| function mergeAssets (parentVal, childVal) { |
| var res = Object.create(parentVal || null); |
| return childVal |
| ? extend(res, childVal) |
| : res |
| } |
| |
| ASSET_TYPES.forEach(function (type) { |
| strats[type + 's'] = mergeAssets; |
| }); |
| |
| /** |
| * Watchers. |
| * |
| * Watchers hashes should not overwrite one |
| * another, so we merge them as arrays. |
| */ |
| strats.watch = function (parentVal, childVal) { |
| // work around Firefox's Object.prototype.watch... |
| if (parentVal === nativeWatch) { parentVal = undefined; } |
| if (childVal === nativeWatch) { childVal = undefined; } |
| /* istanbul ignore if */ |
| if (!childVal) { return Object.create(parentVal || null) } |
| if (!parentVal) { return childVal } |
| var ret = {}; |
| extend(ret, parentVal); |
| for (var key in childVal) { |
| var parent = ret[key]; |
| var child = childVal[key]; |
| if (parent && !Array.isArray(parent)) { |
| parent = [parent]; |
| } |
| ret[key] = parent |
| ? parent.concat(child) |
| : Array.isArray(child) ? child : [child]; |
| } |
| return ret |
| }; |
| |
| /** |
| * Other object hashes. |
| */ |
| strats.props = |
| strats.methods = |
| strats.inject = |
| strats.computed = function (parentVal, childVal) { |
| if (!parentVal) { return childVal } |
| var ret = Object.create(null); |
| extend(ret, parentVal); |
| if (childVal) { extend(ret, childVal); } |
| return ret |
| }; |
| strats.provide = mergeDataOrFn; |
| |
| /** |
| * Default strategy. |
| */ |
| var defaultStrat = function (parentVal, childVal) { |
| return childVal === undefined |
| ? parentVal |
| : childVal |
| }; |
| |
| /** |
| * Validate component names |
| */ |
| function checkComponents (options) { |
| for (var key in options.components) { |
| var lower = key.toLowerCase(); |
| if (isBuiltInTag(lower) || config.isReservedTag(lower)) { |
| warn( |
| 'Do not use built-in or reserved HTML elements as component ' + |
| 'id: ' + key |
| ); |
| } |
| } |
| } |
| |
| /** |
| * Ensure all props option syntax are normalized into the |
| * Object-based format. |
| */ |
| function normalizeProps (options) { |
| var props = options.props; |
| if (!props) { return } |
| var res = {}; |
| var i, val, name; |
| if (Array.isArray(props)) { |
| i = props.length; |
| while (i--) { |
| val = props[i]; |
| if (typeof val === 'string') { |
| name = camelize(val); |
| res[name] = { type: null }; |
| } else { |
| warn('props must be strings when using array syntax.'); |
| } |
| } |
| } else if (isPlainObject(props)) { |
| for (var key in props) { |
| val = props[key]; |
| name = camelize(key); |
| res[name] = isPlainObject(val) |
| ? val |
| : { type: val }; |
| } |
| } |
| options.props = res; |
| } |
| |
| /** |
| * Normalize all injections into Object-based format |
| */ |
| function normalizeInject (options) { |
| var inject = options.inject; |
| if (Array.isArray(inject)) { |
| var normalized = options.inject = {}; |
| for (var i = 0; i < inject.length; i++) { |
| normalized[inject[i]] = inject[i]; |
| } |
| } |
| } |
| |
| /** |
| * Normalize raw function directives into object format. |
| */ |
| function normalizeDirectives (options) { |
| var dirs = options.directives; |
| if (dirs) { |
| for (var key in dirs) { |
| var def = dirs[key]; |
| if (typeof def === 'function') { |
| dirs[key] = { bind: def, update: def }; |
| } |
| } |
| } |
| } |
| |
| /** |
| * Merge two option objects into a new one. |
| * Core utility used in both instantiation and inheritance. |
| */ |
| function mergeOptions ( |
| parent, |
| child, |
| vm |
| ) { |
| { |
| checkComponents(child); |
| } |
| |
| if (typeof child === 'function') { |
| child = child.options; |
| } |
| |
| normalizeProps(child); |
| normalizeInject(child); |
| normalizeDirectives(child); |
| var extendsFrom = child.extends; |
| if (extendsFrom) { |
| parent = mergeOptions(parent, extendsFrom, vm); |
| } |
| if (child.mixins) { |
| for (var i = 0, l = child.mixins.length; i < l; i++) { |
| parent = mergeOptions(parent, child.mixins[i], vm); |
| } |
| } |
| var options = {}; |
| var key; |
| for (key in parent) { |
| mergeField(key); |
| } |
| for (key in child) { |
| if (!hasOwn(parent, key)) { |
| mergeField(key); |
| } |
| } |
| function mergeField (key) { |
| var strat = strats[key] || defaultStrat; |
| options[key] = strat(parent[key], child[key], vm, key); |
| } |
| return options |
| } |
| |
| /** |
| * Resolve an asset. |
| * This function is used because child instances need access |
| * to assets defined in its ancestor chain. |
| */ |
| function resolveAsset ( |
| options, |
| type, |
| id, |
| warnMissing |
| ) { |
| /* istanbul ignore if */ |
| if (typeof id !== 'string') { |
| return |
| } |
| var assets = options[type]; |
| // check local registration variations first |
| if (hasOwn(assets, id)) { return assets[id] } |
| var camelizedId = camelize(id); |
| if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } |
| var PascalCaseId = capitalize(camelizedId); |
| if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } |
| // fallback to prototype chain |
| var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; |
| if ("development" !== 'production' && warnMissing && !res) { |
| warn( |
| 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, |
| options |
| ); |
| } |
| return res |
| } |
| |
| /* */ |
| |
| function validateProp ( |
| key, |
| propOptions, |
| propsData, |
| vm |
| ) { |
| var prop = propOptions[key]; |
| var absent = !hasOwn(propsData, key); |
| var value = propsData[key]; |
| // handle boolean props |
| if (isType(Boolean, prop.type)) { |
| if (absent && !hasOwn(prop, 'default')) { |
| value = false; |
| } else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) { |
| value = true; |
| } |
| } |
| // check default value |
| if (value === undefined) { |
| value = getPropDefaultValue(vm, prop, key); |
| // since the default value is a fresh copy, |
| // make sure to observe it. |
| var prevShouldConvert = observerState.shouldConvert; |
| observerState.shouldConvert = true; |
| observe(value); |
| observerState.shouldConvert = prevShouldConvert; |
| } |
| { |
| assertProp(prop, key, value, vm, absent); |
| } |
| return value |
| } |
| |
| /** |
| * Get the default value of a prop. |
| */ |
| function getPropDefaultValue (vm, prop, key) { |
| // no default, return undefined |
| if (!hasOwn(prop, 'default')) { |
| return undefined |
| } |
| var def = prop.default; |
| // warn against non-factory defaults for Object & Array |
| if ("development" !== 'production' && isObject(def)) { |
| warn( |
| 'Invalid default value for prop "' + key + '": ' + |
| 'Props with type Object/Array must use a factory function ' + |
| 'to return the default value.', |
| vm |
| ); |
| } |
| // the raw prop value was also undefined from previous render, |
| // return previous default value to avoid unnecessary watcher trigger |
| if (vm && vm.$options.propsData && |
| vm.$options.propsData[key] === undefined && |
| vm._props[key] !== undefined |
| ) { |
| return vm._props[key] |
| } |
| // call factory function for non-Function types |
| // a value is Function if its prototype is function even across different execution context |
| return typeof def === 'function' && getType(prop.type) !== 'Function' |
| ? def.call(vm) |
| : def |
| } |
| |
| /** |
| * Assert whether a prop is valid. |
| */ |
| function assertProp ( |
| prop, |
| name, |
| value, |
| vm, |
| absent |
| ) { |
| if (prop.required && absent) { |
| warn( |
| 'Missing required prop: "' + name + '"', |
| vm |
| ); |
| return |
| } |
| if (value == null && !prop.required) { |
| return |
| } |
| var type = prop.type; |
| var valid = !type || type === true; |
| var expectedTypes = []; |
| if (type) { |
| if (!Array.isArray(type)) { |
| type = [type]; |
| } |
| for (var i = 0; i < type.length && !valid; i++) { |
| var assertedType = assertType(value, type[i]); |
| expectedTypes.push(assertedType.expectedType || ''); |
| valid = assertedType.valid; |
| } |
| } |
| if (!valid) { |
| warn( |
| 'Invalid prop: type check failed for prop "' + name + '".' + |
| ' Expected ' + expectedTypes.map(capitalize).join(', ') + |
| ', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.', |
| vm |
| ); |
| return |
| } |
| var validator = prop.validator; |
| if (validator) { |
| if (!validator(value)) { |
| warn( |
| 'Invalid prop: custom validator check failed for prop "' + name + '".', |
| vm |
| ); |
| } |
| } |
| } |
| |
| var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/; |
| |
| function assertType (value, type) { |
| var valid; |
| var expectedType = getType(type); |
| if (simpleCheckRE.test(expectedType)) { |
| valid = typeof value === expectedType.toLowerCase(); |
| } else if (expectedType === 'Object') { |
| valid = isPlainObject(value); |
| } else if (expectedType === 'Array') { |
| valid = Array.isArray(value); |
| } else { |
| valid = value instanceof type; |
| } |
| return { |
| valid: valid, |
| expectedType: expectedType |
| } |
| } |
| |
| /** |
| * Use function string name to check built-in types, |
| * because a simple equality check will fail when running |
| * across different vms / iframes. |
| */ |
| function getType (fn) { |
| var match = fn && fn.toString().match(/^\s*function (\w+)/); |
| return match ? match[1] : '' |
| } |
| |
| function isType (type, fn) { |
| if (!Array.isArray(fn)) { |
| return getType(fn) === getType(type) |
| } |
| for (var i = 0, len = fn.length; i < len; i++) { |
| if (getType(fn[i]) === getType(type)) { |
| return true |
| } |
| } |
| /* istanbul ignore next */ |
| return false |
| } |
| |
| /* */ |
| |
| /* not type checking this file because flow doesn't play well with Proxy */ |
| |
| var initProxy; |
| |
| { |
| var allowedGlobals = makeMap( |
| 'Infinity,undefined,NaN,isFinite,isNaN,' + |
| 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + |
| 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + |
| 'require' // for Webpack/Browserify |
| ); |
| |
| var warnNonPresent = function (target, key) { |
| warn( |
| "Property or method \"" + key + "\" is not defined on the instance but " + |
| "referenced during render. Make sure to declare reactive data " + |
| "properties in the data option.", |
| target |
| ); |
| }; |
| |
| var hasProxy = |
| typeof Proxy !== 'undefined' && |
| Proxy.toString().match(/native code/); |
| |
| if (hasProxy) { |
| var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta'); |
| config.keyCodes = new Proxy(config.keyCodes, { |
| set: function set (target, key, value) { |
| if (isBuiltInModifier(key)) { |
| warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key)); |
| return false |
| } else { |
| target[key] = value; |
| return true |
| } |
| } |
| }); |
| } |
| |
| var hasHandler = { |
| has: function has (target, key) { |
| var has = key in target; |
| var isAllowed = allowedGlobals(key) || key.charAt(0) === '_'; |
| if (!has && !isAllowed) { |
| warnNonPresent(target, key); |
| } |
| return has || !isAllowed |
| } |
| }; |
| |
| var getHandler = { |
| get: function get (target, key) { |
| if (typeof key === 'string' && !(key in target)) { |
| warnNonPresent(target, key); |
| } |
| return target[key] |
| } |
| }; |
| |
| initProxy = function initProxy (vm) { |
| if (hasProxy) { |
| // determine which proxy handler to use |
| var options = vm.$options; |
| var handlers = options.render && options.render._withStripped |
| ? getHandler |
| : hasHandler; |
| vm._renderProxy = new Proxy(vm, handlers); |
| } else { |
| vm._renderProxy = vm; |
| } |
| }; |
| } |
| |
| var mark; |
| var measure; |
| |
| { |
| var perf = inBrowser && window.performance; |
| /* istanbul ignore if */ |
| if ( |
| perf && |
| perf.mark && |
| perf.measure && |
| perf.clearMarks && |
| perf.clearMeasures |
| ) { |
| mark = function (tag) { return perf.mark(tag); }; |
| measure = function (name, startTag, endTag) { |
| perf.measure(name, startTag, endTag); |
| perf.clearMarks(startTag); |
| perf.clearMarks(endTag); |
| perf.clearMeasures(name); |
| }; |
| } |
| } |
| |
| /* */ |
| |
| var VNode = function VNode ( |
| tag, |
| data, |
| children, |
| text, |
| elm, |
| context, |
| componentOptions, |
| asyncFactory |
| ) { |
| this.tag = tag; |
| this.data = data; |
| this.children = children; |
| this.text = text; |
| this.elm = elm; |
| this.ns = undefined; |
| this.context = context; |
| this.functionalContext = undefined; |
| this.key = data && data.key; |
| this.componentOptions = componentOptions; |
| this.componentInstance = undefined; |
| this.parent = undefined; |
| this.raw = false; |
| this.isStatic = false; |
| this.isRootInsert = true; |
| this.isComment = false; |
| this.isCloned = false; |
| this.isOnce = false; |
| this.asyncFactory = asyncFactory; |
| this.asyncMeta = undefined; |
| this.isAsyncPlaceholder = false; |
| }; |
| |
| var prototypeAccessors = { child: {} }; |
| |
| // DEPRECATED: alias for componentInstance for backwards compat. |
| /* istanbul ignore next */ |
| prototypeAccessors.child.get = function () { |
| return this.componentInstance |
| }; |
| |
| Object.defineProperties( VNode.prototype, prototypeAccessors ); |
| |
| var createEmptyVNode = function (text) { |
| if ( text === void 0 ) { text = ''; } |
| |
| var node = new VNode(); |
| node.text = text; |
| node.isComment = true; |
| return node |
| }; |
| |
| function createTextVNode (val) { |
| return new VNode(undefined, undefined, undefined, String(val)) |
| } |
| |
| // optimized shallow clone |
| // used for static nodes and slot nodes because they may be reused across |
| // multiple renders, cloning them avoids errors when DOM manipulations rely |
| // on their elm reference. |
| function cloneVNode (vnode) { |
| var cloned = new VNode( |
| vnode.tag, |
| vnode.data, |
| vnode.children, |
| vnode.text, |
| vnode.elm, |
| vnode.context, |
| vnode.componentOptions, |
| vnode.asyncFactory |
| ); |
| cloned.ns = vnode.ns; |
| cloned.isStatic = vnode.isStatic; |
| cloned.key = vnode.key; |
| cloned.isComment = vnode.isComment; |
| cloned.isCloned = true; |
| return cloned |
| } |
| |
| function cloneVNodes (vnodes) { |
| var len = vnodes.length; |
| var res = new Array(len); |
| for (var i = 0; i < len; i++) { |
| res[i] = cloneVNode(vnodes[i]); |
| } |
| return res |
| } |
| |
| /* */ |
| |
| var normalizeEvent = cached(function (name) { |
| var passive = name.charAt(0) === '&'; |
| name = passive ? name.slice(1) : name; |
| var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first |
| name = once$$1 ? name.slice(1) : name; |
| var capture = name.charAt(0) === '!'; |
| name = capture ? name.slice(1) : name; |
| return { |
| name: name, |
| once: once$$1, |
| capture: capture, |
| passive: passive |
| } |
| }); |
| |
| function createFnInvoker (fns) { |
| function invoker () { |
| var arguments$1 = arguments; |
| |
| var fns = invoker.fns; |
| if (Array.isArray(fns)) { |
| var cloned = fns.slice(); |
| for (var i = 0; i < cloned.length; i++) { |
| cloned[i].apply(null, arguments$1); |
| } |
| } else { |
| // return handler return value for single handlers |
| return fns.apply(null, arguments) |
| } |
| } |
| invoker.fns = fns; |
| return invoker |
| } |
| |
| function updateListeners ( |
| on, |
| oldOn, |
| add, |
| remove$$1, |
| vm |
| ) { |
| var name, cur, old, event; |
| for (name in on) { |
| cur = on[name]; |
| old = oldOn[name]; |
| event = normalizeEvent(name); |
| if (isUndef(cur)) { |
| "development" !== 'production' && warn( |
| "Invalid handler for event \"" + (event.name) + "\": got " + String(cur), |
| vm |
| ); |
| } else if (isUndef(old)) { |
| if (isUndef(cur.fns)) { |
| cur = on[name] = createFnInvoker(cur); |
| } |
| add(event.name, cur, event.once, event.capture, event.passive); |
| } else if (cur !== old) { |
| old.fns = cur; |
| on[name] = old; |
| } |
| } |
| for (name in oldOn) { |
| if (isUndef(on[name])) { |
| event = normalizeEvent(name); |
| remove$$1(event.name, oldOn[name], event.capture); |
| } |
| } |
| } |
| |
| /* */ |
| |
| function mergeVNodeHook (def, hookKey, hook) { |
| var invoker; |
| var oldHook = def[hookKey]; |
| |
| function wrappedHook () { |
| hook.apply(this, arguments); |
| // important: remove merged hook to ensure it's called only once |
| // and prevent memory leak |
| remove(invoker.fns, wrappedHook); |
| } |
| |
| if (isUndef(oldHook)) { |
| // no existing hook |
| invoker = createFnInvoker([wrappedHook]); |
| } else { |
| /* istanbul ignore if */ |
| if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { |
| // already a merged invoker |
| invoker = oldHook; |
| invoker.fns.push(wrappedHook); |
| } else { |
| // existing plain hook |
| invoker = createFnInvoker([oldHook, wrappedHook]); |
| } |
| } |
| |
| invoker.merged = true; |
| def[hookKey] = invoker; |
| } |
| |
| /* */ |
| |
| function extractPropsFromVNodeData ( |
| data, |
| Ctor, |
| tag |
| ) { |
| // we are only extracting raw values here. |
| // validation and default values are handled in the child |
| // component itself. |
| var propOptions = Ctor.options.props; |
| if (isUndef(propOptions)) { |
| return |
| } |
| var res = {}; |
| var attrs = data.attrs; |
| var props = data.props; |
| if (isDef(attrs) || isDef(props)) { |
| for (var key in propOptions) { |
| var altKey = hyphenate(key); |
| { |
| var keyInLowerCase = key.toLowerCase(); |
| if ( |
| key !== keyInLowerCase && |
| attrs && hasOwn(attrs, keyInLowerCase) |
| ) { |
| tip( |
| "Prop \"" + keyInLowerCase + "\" is passed to component " + |
| (formatComponentName(tag || Ctor)) + ", but the declared prop name is" + |
| " \"" + key + "\". " + |
| "Note that HTML attributes are case-insensitive and camelCased " + |
| "props need to use their kebab-case equivalents when using in-DOM " + |
| "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"." |
| ); |
| } |
| } |
| checkProp(res, props, key, altKey, true) || |
| checkProp(res, attrs, key, altKey, false); |
| } |
| } |
| return res |
| } |
| |
| function checkProp ( |
| res, |
| hash, |
| key, |
| altKey, |
| preserve |
| ) { |
| if (isDef(hash)) { |
| if (hasOwn(hash, key)) { |
| res[key] = hash[key]; |
| if (!preserve) { |
| delete hash[key]; |
| } |
| return true |
| } else if (hasOwn(hash, altKey)) { |
| res[key] = hash[altKey]; |
| if (!preserve) { |
| delete hash[altKey]; |
| } |
| return true |
| } |
| } |
| return false |
| } |
| |
| /* */ |
| |
| // The template compiler attempts to minimize the need for normalization by |
| // statically analyzing the template at compile time. |
| // |
| // For plain HTML markup, normalization can be completely skipped because the |
| // generated render function is guaranteed to return Array<VNode>. There are |
| // two cases where extra normalization is needed: |
| |
| // 1. When the children contains components - because a functional component |
| // may return an Array instead of a single root. In this case, just a simple |
| // normalization is needed - if any child is an Array, we flatten the whole |
| // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep |
| // because functional components already normalize their own children. |
| function simpleNormalizeChildren (children) { |
| for (var i = 0; i < children.length; i++) { |
| if (Array.isArray(children[i])) { |
| return Array.prototype.concat.apply([], children) |
| } |
| } |
| return children |
| } |
| |
| // 2. When the children contains constructs that always generated nested Arrays, |
| // e.g. <template>, <slot>, v-for, or when the children is provided by user |
| // with hand-written render functions / JSX. In such cases a full normalization |
| // is needed to cater to all possible types of children values. |
| function normalizeChildren (children) { |
| return isPrimitive(children) |
| ? [createTextVNode(children)] |
| : Array.isArray(children) |
| ? normalizeArrayChildren(children) |
| : undefined |
| } |
| |
| function isTextNode (node) { |
| return isDef(node) && isDef(node.text) && isFalse(node.isComment) |
| } |
| |
| function normalizeArrayChildren (children, nestedIndex) { |
| var res = []; |
| var i, c, last; |
| for (i = 0; i < children.length; i++) { |
| c = children[i]; |
| if (isUndef(c) || typeof c === 'boolean') { continue } |
| last = res[res.length - 1]; |
| // nested |
| if (Array.isArray(c)) { |
| res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i))); |
| } else if (isPrimitive(c)) { |
| if (isTextNode(last)) { |
| // merge adjacent text nodes |
| // this is necessary for SSR hydration because text nodes are |
| // essentially merged when rendered to HTML strings |
| (last).text += String(c); |
| } else if (c !== '') { |
| // convert primitive to vnode |
| res.push(createTextVNode(c)); |
| } |
| } else { |
| if (isTextNode(c) && isTextNode(last)) { |
| // merge adjacent text nodes |
| res[res.length - 1] = createTextVNode(last.text + c.text); |
| } else { |
| // default key for nested array children (likely generated by v-for) |
| if (isTrue(children._isVList) && |
| isDef(c.tag) && |
| isUndef(c.key) && |
| isDef(nestedIndex)) { |
| c.key = "__vlist" + nestedIndex + "_" + i + "__"; |
| } |
| res.push(c); |
| } |
| } |
| } |
| return res |
| } |
| |
| /* */ |
| |
| function ensureCtor (comp, base) { |
| if (comp.__esModule && comp.default) { |
| comp = comp.default; |
| } |
| return isObject(comp) |
| ? base.extend(comp) |
| : comp |
| } |
| |
| function createAsyncPlaceholder ( |
| factory, |
| data, |
| context, |
| children, |
| tag |
| ) { |
| var node = createEmptyVNode(); |
| node.asyncFactory = factory; |
| node.asyncMeta = { data: data, context: context, children: children, tag: tag }; |
| return node |
| } |
| |
| function resolveAsyncComponent ( |
| factory, |
| baseCtor, |
| context |
| ) { |
| if (isTrue(factory.error) && isDef(factory.errorComp)) { |
| return factory.errorComp |
| } |
| |
| if (isDef(factory.resolved)) { |
| return factory.resolved |
| } |
| |
| if (isTrue(factory.loading) && isDef(factory.loadingComp)) { |
| return factory.loadingComp |
| } |
| |
| if (isDef(factory.contexts)) { |
| // already pending |
| factory.contexts.push(context); |
| } else { |
| var contexts = factory.contexts = [context]; |
| var sync = true; |
| |
| var forceRender = function () { |
| for (var i = 0, l = contexts.length; i < l; i++) { |
| contexts[i].$forceUpdate(); |
| } |
| }; |
| |
| var resolve = once(function (res) { |
| // cache resolved |
| factory.resolved = ensureCtor(res, baseCtor); |
| // invoke callbacks only if this is not a synchronous resolve |
| // (async resolves are shimmed as synchronous during SSR) |
| if (!sync) { |
| forceRender(); |
| } |
| }); |
| |
| var reject = once(function (reason) { |
| "development" !== 'production' && warn( |
| "Failed to resolve async component: " + (String(factory)) + |
| (reason ? ("\nReason: " + reason) : '') |
| ); |
| if (isDef(factory.errorComp)) { |
| factory.error = true; |
| forceRender(); |
| } |
| }); |
| |
| var res = factory(resolve, reject); |
| |
| if (isObject(res)) { |
| if (typeof res.then === 'function') { |
| // () => Promise |
| if (isUndef(factory.resolved)) { |
| res.then(resolve, reject); |
| } |
| } else if (isDef(res.component) && typeof res.component.then === 'function') { |
| res.component.then(resolve, reject); |
| |
| if (isDef(res.error)) { |
| factory.errorComp = ensureCtor(res.error, baseCtor); |
| } |
| |
| if (isDef(res.loading)) { |
| factory.loadingComp = ensureCtor(res.loading, baseCtor); |
| if (res.delay === 0) { |
| factory.loading = true; |
| } else { |
| setTimeout(function () { |
| if (isUndef(factory.resolved) && isUndef(factory.error)) { |
| factory.loading = true; |
| forceRender(); |
| } |
| }, res.delay || 200); |
| } |
| } |
| |
| if (isDef(res.timeout)) { |
| setTimeout(function () { |
| if (isUndef(factory.resolved)) { |
| reject( |
| ("timeout (" + (res.timeout) + "ms)") |
| ); |
| } |
| }, res.timeout); |
| } |
| } |
| } |
| |
| sync = false; |
| // return in case resolved synchronously |
| return factory.loading |
| ? factory.loadingComp |
| : factory.resolved |
| } |
| } |
| |
| /* */ |
| |
| function getFirstComponentChild (children) { |
| if (Array.isArray(children)) { |
| for (var i = 0; i < children.length; i++) { |
| var c = children[i]; |
| if (isDef(c) && isDef(c.componentOptions)) { |
| return c |
| } |
| } |
| } |
| } |
| |
| /* */ |
| |
| /* */ |
| |
| function initEvents (vm) { |
| vm._events = Object.create(null); |
| vm._hasHookEvent = false; |
| // init parent attached events |
| var listeners = vm.$options._parentListeners; |
| if (listeners) { |
| updateComponentListeners(vm, listeners); |
| } |
| } |
| |
| var target; |
| |
| function add (event, fn, once$$1) { |
| if (once$$1) { |
| target.$once(event, fn); |
| } else { |
| target.$on(event, fn); |
| } |
| } |
| |
| function remove$1 (event, fn) { |
| target.$off(event, fn); |
| } |
| |
| function updateComponentListeners ( |
| vm, |
| listeners, |
| oldListeners |
| ) { |
| target = vm; |
| updateListeners(listeners, oldListeners || {}, add, remove$1, vm); |
| } |
| |
| function eventsMixin (Vue) { |
| var hookRE = /^hook:/; |
| Vue.prototype.$on = function (event, fn) { |
| var this$1 = this; |
| |
| var vm = this; |
| if (Array.isArray(event)) { |
| for (var i = 0, l = event.length; i < l; i++) { |
| this$1.$on(event[i], fn); |
| } |
| } else { |
| (vm._events[event] || (vm._events[event] = [])).push(fn); |
| // optimize hook:event cost by using a boolean flag marked at registration |
| // instead of a hash lookup |
| if (hookRE.test(event)) { |
| vm._hasHookEvent = true; |
| } |
| } |
| return vm |
| }; |
| |
| Vue.prototype.$once = function (event, fn) { |
| var vm = this; |
| function on () { |
| vm.$off(event, on); |
| fn.apply(vm, arguments); |
| } |
| on.fn = fn; |
| vm.$on(event, on); |
| return vm |
| }; |
| |
| Vue.prototype.$off = function (event, fn) { |
| var this$1 = this; |
| |
| var vm = this; |
| // all |
| if (!arguments.length) { |
| vm._events = Object.create(null); |
| return vm |
| } |
| // array of events |
| if (Array.isArray(event)) { |
| for (var i$1 = 0, l = event.length; i$1 < l; i$1++) { |
| this$1.$off(event[i$1], fn); |
| } |
| return vm |
| } |
| // specific event |
| var cbs = vm._events[event]; |
| if (!cbs) { |
| return vm |
| } |
| if (arguments.length === 1) { |
| vm._events[event] = null; |
| return vm |
| } |
| // specific handler |
| var cb; |
| var i = cbs.length; |
| while (i--) { |
| cb = cbs[i]; |
| if (cb === fn || cb.fn === fn) { |
| cbs.splice(i, 1); |
| break |
| } |
| } |
| return vm |
| }; |
| |
| Vue.prototype.$emit = function (event) { |
| var vm = this; |
| { |
| var lowerCaseEvent = event.toLowerCase(); |
| if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) { |
| tip( |
| "Event \"" + lowerCaseEvent + "\" is emitted in component " + |
| (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " + |
| "Note that HTML attributes are case-insensitive and you cannot use " + |
| "v-on to listen to camelCase events when using in-DOM templates. " + |
| "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"." |
| ); |
| } |
| } |
| var cbs = vm._events[event]; |
| if (cbs) { |
| cbs = cbs.length > 1 ? toArray(cbs) : cbs; |
| var args = toArray(arguments, 1); |
| for (var i = 0, l = cbs.length; i < l; i++) { |
| try { |
| cbs[i].apply(vm, args); |
| } catch (e) { |
| handleError(e, vm, ("event handler for \"" + event + "\"")); |
| } |
| } |
| } |
| return vm |
| }; |
| } |
| |
| /* */ |
| |
| /** |
| * Runtime helper for resolving raw children VNodes into a slot object. |
| */ |
| function resolveSlots ( |
| children, |
| context |
| ) { |
| var slots = {}; |
| if (!children) { |
| return slots |
| } |
| var defaultSlot = []; |
| for (var i = 0, l = children.length; i < l; i++) { |
| var child = children[i]; |
| // named slots should only be respected if the vnode was rendered in the |
| // same context. |
| if ((child.context === context || child.functionalContext === context) && |
| child.data && child.data.slot != null |
| ) { |
| var name = child.data.slot; |
| var slot = (slots[name] || (slots[name] = [])); |
| if (child.tag === 'template') { |
| slot.push.apply(slot, child.children); |
| } else { |
| slot.push(child); |
| } |
| } else { |
| defaultSlot.push(child); |
| } |
| } |
| // ignore whitespace |
| if (!defaultSlot.every(isWhitespace)) { |
| slots.default = defaultSlot; |
| } |
| return slots |
| } |
| |
| function isWhitespace (node) { |
| return node.isComment || node.text === ' ' |
| } |
| |
| function resolveScopedSlots ( |
| fns, // see flow/vnode |
| res |
| ) { |
| res = res || {}; |
| for (var i = 0; i < fns.length; i++) { |
| if (Array.isArray(fns[i])) { |
| resolveScopedSlots(fns[i], res); |
| } else { |
| res[fns[i].key] = fns[i].fn; |
| } |
| } |
| return res |
| } |
| |
| /* */ |
| |
| var activeInstance = null; |
| var isUpdatingChildComponent = false; |
| |
| function initLifecycle (vm) { |
| var options = vm.$options; |
| |
| // locate first non-abstract parent |
| var parent = options.parent; |
| if (parent && !options.abstract) { |
| while (parent.$options.abstract && parent.$parent) { |
| parent = parent.$parent; |
| } |
| parent.$children.push(vm); |
| } |
| |
| vm.$parent = parent; |
| vm.$root = parent ? parent.$root : vm; |
| |
| vm.$children = []; |
| vm.$refs = {}; |
| |
| vm._watcher = null; |
| vm._inactive = null; |
| vm._directInactive = false; |
| vm._isMounted = false; |
| vm._isDestroyed = false; |
| vm._isBeingDestroyed = false; |
| } |
| |
| function lifecycleMixin (Vue) { |
| Vue.prototype._update = function (vnode, hydrating) { |
| var vm = this; |
| if (vm._isMounted) { |
| callHook(vm, 'beforeUpdate'); |
| } |
| var prevEl = vm.$el; |
| var prevVnode = vm._vnode; |
| var prevActiveInstance = activeInstance; |
| activeInstance = vm; |
| vm._vnode = vnode; |
| // Vue.prototype.__patch__ is injected in entry points |
| // based on the rendering backend used. |
| if (!prevVnode) { |
| // initial render |
| vm.$el = vm.__patch__( |
| vm.$el, vnode, hydrating, false /* removeOnly */, |
| vm.$options._parentElm, |
| vm.$options._refElm |
| ); |
| // no need for the ref nodes after initial patch |
| // this prevents keeping a detached DOM tree in memory (#5851) |
| vm.$options._parentElm = vm.$options._refElm = null; |
| } else { |
| // updates |
| vm.$el = vm.__patch__(prevVnode, vnode); |
| } |
| activeInstance = prevActiveInstance; |
| // update __vue__ reference |
| if (prevEl) { |
| prevEl.__vue__ = null; |
| } |
| if (vm.$el) { |
| vm.$el.__vue__ = vm; |
| } |
| // if parent is an HOC, update its $el as well |
| if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) { |
| vm.$parent.$el = vm.$el; |
| } |
| // updated hook is called by the scheduler to ensure that children are |
| // updated in a parent's updated hook. |
| }; |
| |
| Vue.prototype.$forceUpdate = function () { |
| var vm = this; |
| if (vm._watcher) { |
| vm._watcher.update(); |
| } |
| }; |
| |
| Vue.prototype.$destroy = function () { |
| var vm = this; |
| if (vm._isBeingDestroyed) { |
| return |
| } |
| callHook(vm, 'beforeDestroy'); |
| vm._isBeingDestroyed = true; |
| // remove self from parent |
| var parent = vm.$parent; |
| if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) { |
| remove(parent.$children, vm); |
| } |
| // teardown watchers |
| if (vm._watcher) { |
| vm._watcher.teardown(); |
| } |
| var i = vm._watchers.length; |
| while (i--) { |
| vm._watchers[i].teardown(); |
| } |
| // remove reference from data ob |
| // frozen object may not have observer. |
| if (vm._data.__ob__) { |
| vm._data.__ob__.vmCount--; |
| } |
| // call the last hook... |
| vm._isDestroyed = true; |
| // invoke destroy hooks on current rendered tree |
| vm.__patch__(vm._vnode, null); |
| // fire destroyed hook |
| callHook(vm, 'destroyed'); |
| // turn off all instance listeners. |
| vm.$off(); |
| // remove __vue__ reference |
| if (vm.$el) { |
| vm.$el.__vue__ = null; |
| } |
| }; |
| } |
| |
| function mountComponent ( |
| vm, |
| el, |
| hydrating |
| ) { |
| vm.$el = el; |
| if (!vm.$options.render) { |
| vm.$options.render = createEmptyVNode; |
| { |
| /* istanbul ignore if */ |
| if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') || |
| vm.$options.el || el) { |
| warn( |
| 'You are using the runtime-only build of Vue where the template ' + |
| 'compiler is not available. Either pre-compile the templates into ' + |
| 'render functions, or use the compiler-included build.', |
| vm |
| ); |
| } else { |
| warn( |
| 'Failed to mount component: template or render function not defined.', |
| vm |
| ); |
| } |
| } |
| } |
| callHook(vm, 'beforeMount'); |
| |
| var updateComponent; |
| /* istanbul ignore if */ |
| if ("development" !== 'production' && config.performance && mark) { |
| updateComponent = function () { |
| var name = vm._name; |
| var id = vm._uid; |
| var startTag = "vue-perf-start:" + id; |
| var endTag = "vue-perf-end:" + id; |
| |
| mark(startTag); |
| var vnode = vm._render(); |
| mark(endTag); |
| measure((name + " render"), startTag, endTag); |
| |
| mark(startTag); |
| vm._update(vnode, hydrating); |
| mark(endTag); |
| measure((name + " patch"), startTag, endTag); |
| }; |
| } else { |
| updateComponent = function () { |
| vm._update(vm._render(), hydrating); |
| }; |
| } |
| |
| vm._watcher = new Watcher(vm, updateComponent, noop); |
| hydrating = false; |
| |
| // manually mounted instance, call mounted on self |
| // mounted is called for render-created child components in its inserted hook |
| if (vm.$vnode == null) { |
| vm._isMounted = true; |
| callHook(vm, 'mounted'); |
| } |
| return vm |
| } |
| |
| function updateChildComponent ( |
| vm, |
| propsData, |
| listeners, |
| parentVnode, |
| renderChildren |
| ) { |
| { |
| isUpdatingChildComponent = true; |
| } |
| |
| // determine whether component has slot children |
| // we need to do this before overwriting $options._renderChildren |
| var hasChildren = !!( |
| renderChildren || // has new static slots |
| vm.$options._renderChildren || // has old static slots |
| parentVnode.data.scopedSlots || // has new scoped slots |
| vm.$scopedSlots !== emptyObject // has old scoped slots |
| ); |
| |
| vm.$options._parentVnode = parentVnode; |
| vm.$vnode = parentVnode; // update vm's placeholder node without re-render |
| |
| if (vm._vnode) { // update child tree's parent |
| vm._vnode.parent = parentVnode; |
| } |
| vm.$options._renderChildren = renderChildren; |
| |
| // update $attrs and $listensers hash |
| // these are also reactive so they may trigger child update if the child |
| // used them during render |
| vm.$attrs = parentVnode.data && parentVnode.data.attrs; |
| vm.$listeners = listeners; |
| |
| // update props |
| if (propsData && vm.$options.props) { |
| observerState.shouldConvert = false; |
| var props = vm._props; |
| var propKeys = vm.$options._propKeys || []; |
| for (var i = 0; i < propKeys.length; i++) { |
| var key = propKeys[i]; |
| props[key] = validateProp(key, vm.$options.props, propsData, vm); |
| } |
| observerState.shouldConvert = true; |
| // keep a copy of raw propsData |
| vm.$options.propsData = propsData; |
| } |
| |
| // update listeners |
| if (listeners) { |
| var oldListeners = vm.$options._parentListeners; |
| vm.$options._parentListeners = listeners; |
| updateComponentListeners(vm, listeners, oldListeners); |
| } |
| // resolve slots + force update if has children |
| if (hasChildren) { |
| vm.$slots = resolveSlots(renderChildren, parentVnode.context); |
| vm.$forceUpdate(); |
| } |
| |
| { |
| isUpdatingChildComponent = false; |
| } |
| } |
| |
| function isInInactiveTree (vm) { |
| while (vm && (vm = vm.$parent)) { |
| if (vm._inactive) { return true } |
| } |
| return false |
| } |
| |
| function activateChildComponent (vm, direct) { |
| if (direct) { |
| vm._directInactive = false; |
| if (isInInactiveTree(vm)) { |
| return |
| } |
| } else if (vm._directInactive) { |
| return |
| } |
| if (vm._inactive || vm._inactive === null) { |
| vm._inactive = false; |
| for (var i = 0; i < vm.$children.length; i++) { |
| activateChildComponent(vm.$children[i]); |
| } |
| callHook(vm, 'activated'); |
| } |
| } |
| |
| function deactivateChildComponent (vm, direct) { |
| if (direct) { |
| vm._directInactive = true; |
| if (isInInactiveTree(vm)) { |
| return |
| } |
| } |
| if (!vm._inactive) { |
| vm._inactive = true; |
| for (var i = 0; i < vm.$children.length; i++) { |
| deactivateChildComponent(vm.$children[i]); |
| } |
| callHook(vm, 'deactivated'); |
| } |
| } |
| |
| function callHook (vm, hook) { |
| var handlers = vm.$options[hook]; |
| if (handlers) { |
| for (var i = 0, j = handlers.length; i < j; i++) { |
| try { |
| handlers[i].call(vm); |
| } catch (e) { |
| handleError(e, vm, (hook + " hook")); |
| } |
| } |
| } |
| if (vm._hasHookEvent) { |
| vm.$emit('hook:' + hook); |
| } |
| } |
| |
| /* */ |
| |
| |
| var MAX_UPDATE_COUNT = 100; |
| |
| var queue = []; |
| var activatedChildren = []; |
| var has = {}; |
| var circular = {}; |
| var waiting = false; |
| var flushing = false; |
| var index = 0; |
| |
| /** |
| * Reset the scheduler's state. |
| */ |
| function resetSchedulerState () { |
| index = queue.length = activatedChildren.length = 0; |
| has = {}; |
| { |
| circular = {}; |
| } |
| waiting = flushing = false; |
| } |
| |
| /** |
| * Flush both queues and run the watchers. |
| */ |
| function flushSchedulerQueue () { |
| flushing = true; |
| var watcher, id; |
| |
| // Sort queue before flush. |
| // This ensures that: |
| // 1. Components are updated from parent to child. (because parent is always |
| // created before the child) |
| // 2. A component's user watchers are run before its render watcher (because |
| // user watchers are created before the render watcher) |
| // 3. If a component is destroyed during a parent component's watcher run, |
| // its watchers can be skipped. |
| queue.sort(function (a, b) { return a.id - b.id; }); |
| |
| // do not cache length because more watchers might be pushed |
| // as we run existing watchers |
| for (index = 0; index < queue.length; index++) { |
| watcher = queue[index]; |
| id = watcher.id; |
| has[id] = null; |
| watcher.run(); |
| // in dev build, check and stop circular updates. |
| if ("development" !== 'production' && has[id] != null) { |
| circular[id] = (circular[id] || 0) + 1; |
| if (circular[id] > MAX_UPDATE_COUNT) { |
| warn( |
| 'You may have an infinite update loop ' + ( |
| watcher.user |
| ? ("in watcher with expression \"" + (watcher.expression) + "\"") |
| : "in a component render function." |
| ), |
| watcher.vm |
| ); |
| break |
| } |
| } |
| } |
| |
| // keep copies of post queues before resetting state |
| var activatedQueue = activatedChildren.slice(); |
| var updatedQueue = queue.slice(); |
| |
| resetSchedulerState(); |
| |
| // call component updated and activated hooks |
| callActivatedHooks(activatedQueue); |
| callUpdatedHooks(updatedQueue); |
| |
| // devtool hook |
| /* istanbul ignore if */ |
| if (devtools && config.devtools) { |
| devtools.emit('flush'); |
| } |
| } |
| |
| function callUpdatedHooks (queue) { |
| var i = queue.length; |
| while (i--) { |
| var watcher = queue[i]; |
| var vm = watcher.vm; |
| if (vm._watcher === watcher && vm._isMounted) { |
| callHook(vm, 'updated'); |
| } |
| } |
| } |
| |
| /** |
| * Queue a kept-alive component that was activated during patch. |
| * The queue will be processed after the entire tree has been patched. |
| */ |
| function queueActivatedComponent (vm) { |
| // setting _inactive to false here so that a render function can |
| // rely on checking whether it's in an inactive tree (e.g. router-view) |
| vm._inactive = false; |
| activatedChildren.push(vm); |
| } |
| |
| function callActivatedHooks (queue) { |
| for (var i = 0; i < queue.length; i++) { |
| queue[i]._inactive = true; |
| activateChildComponent(queue[i], true /* true */); |
| } |
| } |
| |
| /** |
| * Push a watcher into the watcher queue. |
| * Jobs with duplicate IDs will be skipped unless it's |
| * pushed when the queue is being flushed. |
| */ |
| function queueWatcher (watcher) { |
| var id = watcher.id; |
| if (has[id] == null) { |
| has[id] = true; |
| if (!flushing) { |
| queue.push(watcher); |
| } else { |
| // if already flushing, splice the watcher based on its id |
| // if already past its id, it will be run next immediately. |
| var i = queue.length - 1; |
| while (i > index && queue[i].id > watcher.id) { |
| i--; |
| } |
| queue.splice(i + 1, 0, watcher); |
| } |
| // queue the flush |
| if (!waiting) { |
| waiting = true; |
| nextTick(flushSchedulerQueue); |
| } |
| } |
| } |
| |
| /* */ |
| |
| var uid$2 = 0; |
| |
| /** |
| * A watcher parses an expression, collects dependencies, |
| * and fires callback when the expression value changes. |
| * This is used for both the $watch() api and directives. |
| */ |
| var Watcher = function Watcher ( |
| vm, |
| expOrFn, |
| cb, |
| options |
| ) { |
| this.vm = vm; |
| vm._watchers.push(this); |
| // options |
| if (options) { |
| this.deep = !!options.deep; |
| this.user = !!options.user; |
| this.lazy = !!options.lazy; |
| this.sync = !!options.sync; |
| } else { |
| this.deep = this.user = this.lazy = this.sync = false; |
| } |
| this.cb = cb; |
| this.id = ++uid$2; // uid for batching |
| this.active = true; |
| this.dirty = this.lazy; // for lazy watchers |
| this.deps = []; |
| this.newDeps = []; |
| this.depIds = new _Set(); |
| this.newDepIds = new _Set(); |
| this.expression = expOrFn.toString(); |
| // parse expression for getter |
| if (typeof expOrFn === 'function') { |
| this.getter = expOrFn; |
| } else { |
| this.getter = parsePath(expOrFn); |
| if (!this.getter) { |
| this.getter = function () {}; |
| "development" !== 'production' && warn( |
| "Failed watching path: \"" + expOrFn + "\" " + |
| 'Watcher only accepts simple dot-delimited paths. ' + |
| 'For full control, use a function instead.', |
| vm |
| ); |
| } |
| } |
| this.value = this.lazy |
| ? undefined |
| : this.get(); |
| }; |
| |
| /** |
| * Evaluate the getter, and re-collect dependencies. |
| */ |
| Watcher.prototype.get = function get () { |
| pushTarget(this); |
| var value; |
| var vm = this.vm; |
| try { |
| value = this.getter.call(vm, vm); |
| } catch (e) { |
| if (this.user) { |
| handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\"")); |
| } else { |
| throw e |
| } |
| } finally { |
| // "touch" every property so they are all tracked as |
| // dependencies for deep watching |
| if (this.deep) { |
| traverse(value); |
| } |
| popTarget(); |
| this.cleanupDeps(); |
| } |
| return value |
| }; |
| |
| /** |
| * Add a dependency to this directive. |
| */ |
| Watcher.prototype.addDep = function addDep (dep) { |
| var id = dep.id; |
| if (!this.newDepIds.has(id)) { |
| this.newDepIds.add(id); |
| this.newDeps.push(dep); |
| if (!this.depIds.has(id)) { |
| dep.addSub(this); |
| } |
| } |
| }; |
| |
| /** |
| * Clean up for dependency collection. |
| */ |
| Watcher.prototype.cleanupDeps = function cleanupDeps () { |
| var this$1 = this; |
| |
| var i = this.deps.length; |
| while (i--) { |
| var dep = this$1.deps[i]; |
| if (!this$1.newDepIds.has(dep.id)) { |
| dep.removeSub(this$1); |
| } |
| } |
| var tmp = this.depIds; |
| this.depIds = this.newDepIds; |
| this.newDepIds = tmp; |
| this.newDepIds.clear(); |
| tmp = this.deps; |
| this.deps = this.newDeps; |
| this.newDeps = tmp; |
| this.newDeps.length = 0; |
| }; |
| |
| /** |
| * Subscriber interface. |
| * Will be called when a dependency changes. |
| */ |
| Watcher.prototype.update = function update () { |
| /* istanbul ignore else */ |
| if (this.lazy) { |
| this.dirty = true; |
| } else if (this.sync) { |
| this.run(); |
| } else { |
| queueWatcher(this); |
| } |
| }; |
| |
| /** |
| * Scheduler job interface. |
| * Will be called by the scheduler. |
| */ |
| Watcher.prototype.run = function run () { |
| if (this.active) { |
| var value = this.get(); |
| if ( |
| value !== this.value || |
| // Deep watchers and watchers on Object/Arrays should fire even |
| // when the value is the same, because the value may |
| // have mutated. |
| isObject(value) || |
| this.deep |
| ) { |
| // set new value |
| var oldValue = this.value; |
| this.value = value; |
| if (this.user) { |
| try { |
| this.cb.call(this.vm, value, oldValue); |
| } catch (e) { |
| handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\"")); |
| } |
| } else { |
| this.cb.call(this.vm, value, oldValue); |
| } |
| } |
| } |
| }; |
| |
| /** |
| * Evaluate the value of the watcher. |
| * This only gets called for lazy watchers. |
| */ |
| Watcher.prototype.evaluate = function evaluate () { |
| this.value = this.get(); |
| this.dirty = false; |
| }; |
| |
| /** |
| * Depend on all deps collected by this watcher. |
| */ |
| Watcher.prototype.depend = function depend () { |
| var this$1 = this; |
| |
| var i = this.deps.length; |
| while (i--) { |
| this$1.deps[i].depend(); |
| } |
| }; |
| |
| /** |
| * Remove self from all dependencies' subscriber list. |
| */ |
| Watcher.prototype.teardown = function teardown () { |
| var this$1 = this; |
| |
| if (this.active) { |
| // remove self from vm's watcher list |
| // this is a somewhat expensive operation so we skip it |
| // if the vm is being destroyed. |
| if (!this.vm._isBeingDestroyed) { |
| remove(this.vm._watchers, this); |
| } |
| var i = this.deps.length; |
| while (i--) { |
| this$1.deps[i].removeSub(this$1); |
| } |
| this.active = false; |
| } |
| }; |
| |
| /** |
| * Recursively traverse an object to evoke all converted |
| * getters, so that every nested property inside the object |
| * is collected as a "deep" dependency. |
| */ |
| var seenObjects = new _Set(); |
| function traverse (val) { |
| seenObjects.clear(); |
| _traverse(val, seenObjects); |
| } |
| |
| function _traverse (val, seen) { |
| var i, keys; |
| var isA = Array.isArray(val); |
| if ((!isA && !isObject(val)) || !Object.isExtensible(val)) { |
| return |
| } |
| if (val.__ob__) { |
| var depId = val.__ob__.dep.id; |
| if (seen.has(depId)) { |
| return |
| } |
| seen.add(depId); |
| } |
| if (isA) { |
| i = val.length; |
| while (i--) { _traverse(val[i], seen); } |
| } else { |
| keys = Object.keys(val); |
| i = keys.length; |
| while (i--) { _traverse(val[keys[i]], seen); } |
| } |
| } |
| |
| /* */ |
| |
| var sharedPropertyDefinition = { |
| enumerable: true, |
| configurable: true, |
| get: noop, |
| set: noop |
| }; |
| |
| function proxy (target, sourceKey, key) { |
| sharedPropertyDefinition.get = function proxyGetter () { |
| return this[sourceKey][key] |
| }; |
| sharedPropertyDefinition.set = function proxySetter (val) { |
| this[sourceKey][key] = val; |
| }; |
| Object.defineProperty(target, key, sharedPropertyDefinition); |
| } |
| |
| function initState (vm) { |
| vm._watchers = []; |
| var opts = vm.$options; |
| if (opts.props) { initProps(vm, opts.props); } |
| if (opts.methods) { initMethods(vm, opts.methods); } |
| if (opts.data) { |
| initData(vm); |
| } else { |
| observe(vm._data = {}, true /* asRootData */); |
| } |
| if (opts.computed) { initComputed(vm, opts.computed); } |
| if (opts.watch && opts.watch !== nativeWatch) { |
| initWatch(vm, opts.watch); |
| } |
| } |
| |
| function checkOptionType (vm, name) { |
| var option = vm.$options[name]; |
| if (!isPlainObject(option)) { |
| warn( |
| ("component option \"" + name + "\" should be an object."), |
| vm |
| ); |
| } |
| } |
| |
| function initProps (vm, propsOptions) { |
| var propsData = vm.$options.propsData || {}; |
| var props = vm._props = {}; |
| // cache prop keys so that future props updates can iterate using Array |
| // instead of dynamic object key enumeration. |
| var keys = vm.$options._propKeys = []; |
| var isRoot = !vm.$parent; |
| // root instance props should be converted |
| observerState.shouldConvert = isRoot; |
| var loop = function ( key ) { |
| keys.push(key); |
| var value = validateProp(key, propsOptions, propsData, vm); |
| /* istanbul ignore else */ |
| { |
| if (isReservedAttribute(key) || config.isReservedAttr(key)) { |
| warn( |
| ("\"" + key + "\" is a reserved attribute and cannot be used as component prop."), |
| vm |
| ); |
| } |
| defineReactive$$1(props, key, value, function () { |
| if (vm.$parent && !isUpdatingChildComponent) { |
| warn( |
| "Avoid mutating a prop directly since the value will be " + |
| "overwritten whenever the parent component re-renders. " + |
| "Instead, use a data or computed property based on the prop's " + |
| "value. Prop being mutated: \"" + key + "\"", |
| vm |
| ); |
| } |
| }); |
| } |
| // static props are already proxied on the component's prototype |
| // during Vue.extend(). We only need to proxy props defined at |
| // instantiation here. |
| if (!(key in vm)) { |
| proxy(vm, "_props", key); |
| } |
| }; |
| |
| for (var key in propsOptions) { loop( key ); } |
| observerState.shouldConvert = true; |
| } |
| |
| function initData (vm) { |
| var data = vm.$options.data; |
| data = vm._data = typeof data === 'function' |
| ? getData(data, vm) |
| : data || {}; |
| if (!isPlainObject(data)) { |
| data = {}; |
| "development" !== 'production' && warn( |
| 'data functions should return an object:\n' + |
| 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function', |
| vm |
| ); |
| } |
| // proxy data on instance |
| var keys = Object.keys(data); |
| var props = vm.$options.props; |
| var methods = vm.$options.methods; |
| var i = keys.length; |
| while (i--) { |
| var key = keys[i]; |
| { |
| if (methods && hasOwn(methods, key)) { |
| warn( |
| ("method \"" + key + "\" has already been defined as a data property."), |
| vm |
| ); |
| } |
| } |
| if (props && hasOwn(props, key)) { |
| "development" !== 'production' && warn( |
| "The data property \"" + key + "\" is already declared as a prop. " + |
| "Use prop default value instead.", |
| vm |
| ); |
| } else if (!isReserved(key)) { |
| proxy(vm, "_data", key); |
| } |
| } |
| // observe data |
| observe(data, true /* asRootData */); |
| } |
| |
| function getData (data, vm) { |
| try { |
| return data.call(vm) |
| } catch (e) { |
| handleError(e, vm, "data()"); |
| return {} |
| } |
| } |
| |
| var computedWatcherOptions = { lazy: true }; |
| |
| function initComputed (vm, computed) { |
| "development" !== 'production' && checkOptionType(vm, 'computed'); |
| var watchers = vm._computedWatchers = Object.create(null); |
| |
| for (var key in computed) { |
| var userDef = computed[key]; |
| var getter = typeof userDef === 'function' ? userDef : userDef.get; |
| if ("development" !== 'production' && getter == null) { |
| warn( |
| ("Getter is missing for computed property \"" + key + "\"."), |
| vm |
| ); |
| } |
| // create internal watcher for the computed property. |
| watchers[key] = new Watcher(vm, getter || noop, noop, computedWatcherOptions); |
| |
| // component-defined computed properties are already defined on the |
| // component prototype. We only need to define computed properties defined |
| // at instantiation here. |
| if (!(key in vm)) { |
| defineComputed(vm, key, userDef); |
| } else { |
| if (key in vm.$data) { |
| warn(("The computed property \"" + key + "\" is already defined in data."), vm); |
| } else if (vm.$options.props && key in vm.$options.props) { |
| warn(("The computed property \"" + key + "\" is already defined as a prop."), vm); |
| } |
| } |
| } |
| } |
| |
| function defineComputed (target, key, userDef) { |
| if (typeof userDef === 'function') { |
| sharedPropertyDefinition.get = createComputedGetter(key); |
| sharedPropertyDefinition.set = noop; |
| } else { |
| sharedPropertyDefinition.get = userDef.get |
| ? userDef.cache !== false |
| ? createComputedGetter(key) |
| : userDef.get |
| : noop; |
| sharedPropertyDefinition.set = userDef.set |
| ? userDef.set |
| : noop; |
| } |
| if ("development" !== 'production' && |
| sharedPropertyDefinition.set === noop) { |
| sharedPropertyDefinition.set = function () { |
| warn( |
| ("Computed property \"" + key + "\" was assigned to but it has no setter."), |
| this |
| ); |
| }; |
| } |
| Object.defineProperty(target, key, sharedPropertyDefinition); |
| } |
| |
| function createComputedGetter (key) { |
| return function computedGetter () { |
| var watcher = this._computedWatchers && this._computedWatchers[key]; |
| if (watcher) { |
| if (watcher.dirty) { |
| watcher.evaluate(); |
| } |
| if (Dep.target) { |
| watcher.depend(); |
| } |
| return watcher.value |
| } |
| } |
| } |
| |
| function initMethods (vm, methods) { |
| "development" !== 'production' && checkOptionType(vm, 'methods'); |
| var props = vm.$options.props; |
| for (var key in methods) { |
| vm[key] = methods[key] == null ? noop : bind(methods[key], vm); |
| { |
| if (methods[key] == null) { |
| warn( |
| "method \"" + key + "\" has an undefined value in the component definition. " + |
| "Did you reference the function correctly?", |
| vm |
| ); |
| } |
| if (props && hasOwn(props, key)) { |
| warn( |
| ("method \"" + key + "\" has already been defined as a prop."), |
| vm |
| ); |
| } |
| } |
| } |
| } |
| |
| function initWatch (vm, watch) { |
| "development" !== 'production' && checkOptionType(vm, 'watch'); |
| for (var key in watch) { |
| var handler = watch[key]; |
| if (Array.isArray(handler)) { |
| for (var i = 0; i < handler.length; i++) { |
| createWatcher(vm, key, handler[i]); |
| } |
| } else { |
| createWatcher(vm, key, handler); |
| } |
| } |
| } |
| |
| function createWatcher ( |
| vm, |
| keyOrFn, |
| handler, |
| options |
| ) { |
| if (isPlainObject(handler)) { |
| options = handler; |
| handler = handler.handler; |
| } |
| if (typeof handler === 'string') { |
| handler = vm[handler]; |
| } |
| return vm.$watch(keyOrFn, handler, options) |
| } |
| |
| function stateMixin (Vue) { |
| // flow somehow has problems with directly declared definition object |
| // when using Object.defineProperty, so we have to procedurally build up |
| // the object here. |
| var dataDef = {}; |
| dataDef.get = function () { return this._data }; |
| var propsDef = {}; |
| propsDef.get = function () { return this._props }; |
| { |
| dataDef.set = function (newData) { |
| warn( |
| 'Avoid replacing instance root $data. ' + |
| 'Use nested data properties instead.', |
| this |
| ); |
| }; |
| propsDef.set = function () { |
| warn("$props is readonly.", this); |
| }; |
| } |
| Object.defineProperty(Vue.prototype, '$data', dataDef); |
| Object.defineProperty(Vue.prototype, '$props', propsDef); |
| |
| Vue.prototype.$set = set; |
| Vue.prototype.$delete = del; |
| |
| Vue.prototype.$watch = function ( |
| expOrFn, |
| cb, |
| options |
| ) { |
| var vm = this; |
| if (isPlainObject(cb)) { |
| return createWatcher(vm, expOrFn, cb, options) |
| } |
| options = options || {}; |
| options.user = true; |
| var watcher = new Watcher(vm, expOrFn, cb, options); |
| if (options.immediate) { |
| cb.call(vm, watcher.value); |
| } |
| return function unwatchFn () { |
| watcher.teardown(); |
| } |
| }; |
| } |
| |
| /* */ |
| |
| function initProvide (vm) { |
| var provide = vm.$options.provide; |
| if (provide) { |
| vm._provided = typeof provide === 'function' |
| ? provide.call(vm) |
| : provide; |
| } |
| } |
| |
| function initInjections (vm) { |
| var result = resolveInject(vm.$options.inject, vm); |
| if (result) { |
| observerState.shouldConvert = false; |
| Object.keys(result).forEach(function (key) { |
| /* istanbul ignore else */ |
| { |
| defineReactive$$1(vm, key, result[key], function () { |
| warn( |
| "Avoid mutating an injected value directly since the changes will be " + |
| "overwritten whenever the provided component re-renders. " + |
| "injection being mutated: \"" + key + "\"", |
| vm |
| ); |
| }); |
| } |
| }); |
| observerState.shouldConvert = true; |
| } |
| } |
| |
| function resolveInject (inject, vm) { |
| if (inject) { |
| // inject is :any because flow is not smart enough to figure out cached |
| var result = Object.create(null); |
| var keys = hasSymbol |
| ? Reflect.ownKeys(inject) |
| : Object.keys(inject); |
| |
| for (var i = 0; i < keys.length; i++) { |
| var key = keys[i]; |
| var provideKey = inject[key]; |
| var source = vm; |
| while (source) { |
| if (source._provided && provideKey in source._provided) { |
| result[key] = source._provided[provideKey]; |
| break |
| } |
| source = source.$parent; |
| } |
| if ("development" !== 'production' && !source) { |
| warn(("Injection \"" + key + "\" not found"), vm); |
| } |
| } |
| return result |
| } |
| } |
| |
| /* */ |
| |
| function createFunctionalComponent ( |
| Ctor, |
| propsData, |
| data, |
| context, |
| children |
| ) { |
| var props = {}; |
| var propOptions = Ctor.options.props; |
| if (isDef(propOptions)) { |
| for (var key in propOptions) { |
| props[key] = validateProp(key, propOptions, propsData || {}); |
| } |
| } else { |
| if (isDef(data.attrs)) { mergeProps(props, data.attrs); } |
| if (isDef(data.props)) { mergeProps(props, data.props); } |
| } |
| // ensure the createElement function in functional components |
| // gets a unique context - this is necessary for correct named slot check |
| var _context = Object.create(context); |
| var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); }; |
| var vnode = Ctor.options.render.call(null, h, { |
| data: data, |
| props: props, |
| children: children, |
| parent: context, |
| listeners: data.on || {}, |
| injections: resolveInject(Ctor.options.inject, context), |
| slots: function () { return resolveSlots(children, context); } |
| }); |
| if (vnode instanceof VNode) { |
| vnode.functionalContext = context; |
| vnode.functionalOptions = Ctor.options; |
| if (data.slot) { |
| (vnode.data || (vnode.data = {})).slot = data.slot; |
| } |
| } |
| return vnode |
| } |
| |
| function mergeProps (to, from) { |
| for (var key in from) { |
| to[camelize(key)] = from[key]; |
| } |
| } |
| |
| /* */ |
| |
| // hooks to be invoked on component VNodes during patch |
| var componentVNodeHooks = { |
| init: function init ( |
| vnode, |
| hydrating, |
| parentElm, |
| refElm |
| ) { |
| if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) { |
| var child = vnode.componentInstance = createComponentInstanceForVnode( |
| vnode, |
| activeInstance, |
| parentElm, |
| refElm |
| ); |
| child.$mount(hydrating ? vnode.elm : undefined, hydrating); |
| } else if (vnode.data.keepAlive) { |
| // kept-alive components, treat as a patch |
| var mountedNode = vnode; // work around flow |
| componentVNodeHooks.prepatch(mountedNode, mountedNode); |
| } |
| }, |
| |
| prepatch: function prepatch (oldVnode, vnode) { |
| var options = vnode.componentOptions; |
| var child = vnode.componentInstance = oldVnode.componentInstance; |
| updateChildComponent( |
| child, |
| options.propsData, // updated props |
| options.listeners, // updated listeners |
| vnode, // new parent vnode |
| options.children // new children |
| ); |
| }, |
| |
| insert: function insert (vnode) { |
| var context = vnode.context; |
| var componentInstance = vnode.componentInstance; |
| if (!componentInstance._isMounted) { |
| componentInstance._isMounted = true; |
| callHook(componentInstance, 'mounted'); |
| } |
| if (vnode.data.keepAlive) { |
| if (context._isMounted) { |
| // vue-router#1212 |
| // During updates, a kept-alive component's child components may |
| // change, so directly walking the tree here may call activated hooks |
| // on incorrect children. Instead we push them into a queue which will |
| // be processed after the whole patch process ended. |
| queueActivatedComponent(componentInstance); |
| } else { |
| activateChildComponent(componentInstance, true /* direct */); |
| } |
| } |
| }, |
| |
| destroy: function destroy (vnode) { |
| var componentInstance = vnode.componentInstance; |
| if (!componentInstance._isDestroyed) { |
| if (!vnode.data.keepAlive) { |
| componentInstance.$destroy(); |
| } else { |
| deactivateChildComponent(componentInstance, true /* direct */); |
| } |
| } |
| } |
| }; |
| |
| var hooksToMerge = Object.keys(componentVNodeHooks); |
| |
| function createComponent ( |
| Ctor, |
| data, |
| context, |
| children, |
| tag |
| ) { |
| if (isUndef(Ctor)) { |
| return |
| } |
| |
| var baseCtor = context.$options._base; |
| |
| // plain options object: turn it into a constructor |
| if (isObject(Ctor)) { |
| Ctor = baseCtor.extend(Ctor); |
| } |
| |
| // if at this stage it's not a constructor or an async component factory, |
| // reject. |
| if (typeof Ctor !== 'function') { |
| { |
| warn(("Invalid Component definition: " + (String(Ctor))), context); |
| } |
| return |
| } |
| |
| // async component |
| var asyncFactory; |
| if (isUndef(Ctor.cid)) { |
| asyncFactory = Ctor; |
| Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context); |
| if (Ctor === undefined) { |
| // return a placeholder node for async component, which is rendered |
| // as a comment node but preserves all the raw information for the node. |
| // the information will be used for async server-rendering and hydration. |
| return createAsyncPlaceholder( |
| asyncFactory, |
| data, |
| context, |
| children, |
| tag |
| ) |
| } |
| } |
| |
| data = data || {}; |
| |
| // resolve constructor options in case global mixins are applied after |
| // component constructor creation |
| resolveConstructorOptions(Ctor); |
| |
| // transform component v-model data into props & events |
| if (isDef(data.model)) { |
| transformModel(Ctor.options, data); |
| } |
| |
| // extract props |
| var propsData = extractPropsFromVNodeData(data, Ctor, tag); |
| |
| // functional component |
| if (isTrue(Ctor.options.functional)) { |
| return createFunctionalComponent(Ctor, propsData, data, context, children) |
| } |
| |
| // extract listeners, since these needs to be treated as |
| // child component listeners instead of DOM listeners |
| var listeners = data.on; |
| // replace with listeners with .native modifier |
| // so it gets processed during parent component patch. |
| data.on = data.nativeOn; |
| |
| if (isTrue(Ctor.options.abstract)) { |
| // abstract components do not keep anything |
| // other than props & listeners & slot |
| |
| // work around flow |
| var slot = data.slot; |
| data = {}; |
| if (slot) { |
| data.slot = slot; |
| } |
| } |
| |
| // merge component management hooks onto the placeholder node |
| mergeHooks(data); |
| |
| // return a placeholder vnode |
| var name = Ctor.options.name || tag; |
| var vnode = new VNode( |
| ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')), |
| data, undefined, undefined, undefined, context, |
| { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }, |
| asyncFactory |
| ); |
| return vnode |
| } |
| |
| function createComponentInstanceForVnode ( |
| vnode, // we know it's MountedComponentVNode but flow doesn't |
| parent, // activeInstance in lifecycle state |
| parentElm, |
| refElm |
| ) { |
| var vnodeComponentOptions = vnode.componentOptions; |
| var options = { |
| _isComponent: true, |
| parent: parent, |
| propsData: vnodeComponentOptions.propsData, |
| _componentTag: vnodeComponentOptions.tag, |
| _parentVnode: vnode, |
| _parentListeners: vnodeComponentOptions.listeners, |
| _renderChildren: vnodeComponentOptions.children, |
| _parentElm: parentElm || null, |
| _refElm: refElm || null |
| }; |
| // check inline-template render functions |
| var inlineTemplate = vnode.data.inlineTemplate; |
| if (isDef(inlineTemplate)) { |
| options.render = inlineTemplate.render; |
| options.staticRenderFns = inlineTemplate.staticRenderFns; |
| } |
| return new vnodeComponentOptions.Ctor(options) |
| } |
| |
| function mergeHooks (data) { |
| if (!data.hook) { |
| data.hook = {}; |
| } |
| for (var i = 0; i < hooksToMerge.length; i++) { |
| var key = hooksToMerge[i]; |
| var fromParent = data.hook[key]; |
| var ours = componentVNodeHooks[key]; |
| data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours; |
| } |
| } |
| |
| function mergeHook$1 (one, two) { |
| return function (a, b, c, d) { |
| one(a, b, c, d); |
| two(a, b, c, d); |
| } |
| } |
| |
| // transform component v-model info (value and callback) into |
| // prop and event handler respectively. |
| function transformModel (options, data) { |
| var prop = (options.model && options.model.prop) || 'value'; |
| var event = (options.model && options.model.event) || 'input';(data.props || (data.props = {}))[prop] = data.model.value; |
| var on = data.on || (data.on = {}); |
| if (isDef(on[event])) { |
| on[event] = [data.model.callback].concat(on[event]); |
| } else { |
| on[event] = data.model.callback; |
| } |
| } |
| |
| /* */ |
| |
| var SIMPLE_NORMALIZE = 1; |
| var ALWAYS_NORMALIZE = 2; |
| |
| // wrapper function for providing a more flexible interface |
| // without getting yelled at by flow |
| function createElement ( |
| context, |
| tag, |
| data, |
| children, |
| normalizationType, |
| alwaysNormalize |
| ) { |
| if (Array.isArray(data) || isPrimitive(data)) { |
| normalizationType = children; |
| children = data; |
| data = undefined; |
| } |
| if (isTrue(alwaysNormalize)) { |
| normalizationType = ALWAYS_NORMALIZE; |
| } |
| return _createElement(context, tag, data, children, normalizationType) |
| } |
| |
| function _createElement ( |
| context, |
| tag, |
| data, |
| children, |
| normalizationType |
| ) { |
| if (isDef(data) && isDef((data).__ob__)) { |
| "development" !== 'production' && warn( |
| "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" + |
| 'Always create fresh vnode data objects in each render!', |
| context |
| ); |
| return createEmptyVNode() |
| } |
| // object syntax in v-bind |
| if (isDef(data) && isDef(data.is)) { |
| tag = data.is; |
| } |
| if (!tag) { |
| // in case of component :is set to falsy value |
| return createEmptyVNode() |
| } |
| // warn against non-primitive key |
| if ("development" !== 'production' && |
| isDef(data) && isDef(data.key) && !isPrimitive(data.key) |
| ) { |
| warn( |
| 'Avoid using non-primitive value as key, ' + |
| 'use string/number value instead.', |
| context |
| ); |
| } |
| // support single function children as default scoped slot |
| if (Array.isArray(children) && |
| typeof children[0] === 'function' |
| ) { |
| data = data || {}; |
| data.scopedSlots = { default: children[0] }; |
| children.length = 0; |
| } |
| if (normalizationType === ALWAYS_NORMALIZE) { |
| children = normalizeChildren(children); |
| } else if (normalizationType === SIMPLE_NORMALIZE) { |
| children = simpleNormalizeChildren(children); |
| } |
| var vnode, ns; |
| if (typeof tag === 'string') { |
| var Ctor; |
| ns = config.getTagNamespace(tag); |
| if (config.isReservedTag(tag)) { |
| // platform built-in elements |
| vnode = new VNode( |
| config.parsePlatformTagName(tag), data, children, |
| undefined, undefined, context |
| ); |
| } else if (isDef(Ctor = resolveAsset(context.$options, 'components', tag))) { |
| // component |
| vnode = createComponent(Ctor, data, context, children, tag); |
| } else { |
| // unknown or unlisted namespaced elements |
| // check at runtime because it may get assigned a namespace when its |
| // parent normalizes children |
| vnode = new VNode( |
| tag, data, children, |
| undefined, undefined, context |
| ); |
| } |
| } else { |
| // direct component options / constructor |
| vnode = createComponent(tag, data, context, children); |
| } |
| if (isDef(vnode)) { |
| if (ns) { applyNS(vnode, ns); } |
| return vnode |
| } else { |
| return createEmptyVNode() |
| } |
| } |
| |
| function applyNS (vnode, ns) { |
| vnode.ns = ns; |
| if (vnode.tag === 'foreignObject') { |
| // use default namespace inside foreignObject |
| return |
| } |
| if (isDef(vnode.children)) { |
| for (var i = 0, l = vnode.children.length; i < l; i++) { |
| var child = vnode.children[i]; |
| if (isDef(child.tag) && isUndef(child.ns)) { |
| applyNS(child, ns); |
| } |
| } |
| } |
| } |
| |
| /* */ |
| |
| /** |
| * Runtime helper for rendering v-for lists. |
| */ |
| function renderList ( |
| val, |
| render |
| ) { |
| var ret, i, l, keys, key; |
| if (Array.isArray(val) || typeof val === 'string') { |
| ret = new Array(val.length); |
| for (i = 0, l = val.length; i < l; i++) { |
| ret[i] = render(val[i], i); |
| } |
| } else if (typeof val === 'number') { |
| ret = new Array(val); |
| for (i = 0; i < val; i++) { |
| ret[i] = render(i + 1, i); |
| } |
| } else if (isObject(val)) { |
| keys = Object.keys(val); |
| ret = new Array(keys.length); |
| for (i = 0, l = keys.length; i < l; i++) { |
| key = keys[i]; |
| ret[i] = render(val[key], key, i); |
| } |
| } |
| if (isDef(ret)) { |
| (ret)._isVList = true; |
| } |
| return ret |
| } |
| |
| /* */ |
| |
| /** |
| * Runtime helper for rendering <slot> |
| */ |
| function renderSlot ( |
| name, |
| fallback, |
| props, |
| bindObject |
| ) { |
| var scopedSlotFn = this.$scopedSlots[name]; |
| if (scopedSlotFn) { // scoped slot |
| props = props || {}; |
| if (bindObject) { |
| props = extend(extend({}, bindObject), props); |
| } |
| return scopedSlotFn(props) || fallback |
| } else { |
| var slotNodes = this.$slots[name]; |
| // warn duplicate slot usage |
| if (slotNodes && "development" !== 'production') { |
| slotNodes._rendered && warn( |
| "Duplicate presence of slot \"" + name + "\" found in the same render tree " + |
| "- this will likely cause render errors.", |
| this |
| ); |
| slotNodes._rendered = true; |
| } |
| return slotNodes || fallback |
| } |
| } |
| |
| /* */ |
| |
| /** |
| * Runtime helper for resolving filters |
| */ |
| function resolveFilter (id) { |
| return resolveAsset(this.$options, 'filters', id, true) || identity |
| } |
| |
| /* */ |
| |
| /** |
| * Runtime helper for checking keyCodes from config. |
| */ |
| function checkKeyCodes ( |
| eventKeyCode, |
| key, |
| builtInAlias |
| ) { |
| var keyCodes = config.keyCodes[key] || builtInAlias; |
| if (Array.isArray(keyCodes)) { |
| return keyCodes.indexOf(eventKeyCode) === -1 |
| } else { |
| return keyCodes !== eventKeyCode |
| } |
| } |
| |
| /* */ |
| |
| /** |
| * Runtime helper for merging v-bind="object" into a VNode's data. |
| */ |
| function bindObjectProps ( |
| data, |
| tag, |
| value, |
| asProp, |
| isSync |
| ) { |
| if (value) { |
| if (!isObject(value)) { |
| "development" !== 'production' && warn( |
| 'v-bind without argument expects an Object or Array value', |
| this |
| ); |
| } else { |
| if (Array.isArray(value)) { |
| value = toObject(value); |
| } |
| var hash; |
| var loop = function ( key ) { |
| if ( |
| key === 'class' || |
| key === 'style' || |
| isReservedAttribute(key) |
| ) { |
| hash = data; |
| } else { |
| var type = data.attrs && data.attrs.type; |
| hash = asProp || config.mustUseProp(tag, type, key) |
| ? data.domProps || (data.domProps = {}) |
| : data.attrs || (data.attrs = {}); |
| } |
| if (!(key in hash)) { |
| hash[key] = value[key]; |
| |
| if (isSync) { |
| var on = data.on || (data.on = {}); |
| on[("update:" + key)] = function ($event) { |
| value[key] = $event; |
| }; |
| } |
| } |
| }; |
| |
| for (var key in value) { loop( key ); } |
| } |
| } |
| return data |
| } |
| |
| /* */ |
| |
| /** |
| * Runtime helper for rendering static trees. |
| */ |
| function renderStatic ( |
| index, |
| isInFor |
| ) { |
| var tree = this._staticTrees[index]; |
| // if has already-rendered static tree and not inside v-for, |
| // we can reuse the same tree by doing a shallow clone. |
| if (tree && !isInFor) { |
| return Array.isArray(tree) |
| ? cloneVNodes(tree) |
| : cloneVNode(tree) |
| } |
| // otherwise, render a fresh tree. |
| tree = this._staticTrees[index] = |
| this.$options.staticRenderFns[index].call(this._renderProxy); |
| markStatic(tree, ("__static__" + index), false); |
| return tree |
| } |
| |
| /** |
| * Runtime helper for v-once. |
| * Effectively it means marking the node as static with a unique key. |
| */ |
| function markOnce ( |
| tree, |
| index, |
| key |
| ) { |
| markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true); |
| return tree |
| } |
| |
| function markStatic ( |
| tree, |
| key, |
| isOnce |
| ) { |
| if (Array.isArray(tree)) { |
| for (var i = 0; i < tree.length; i++) { |
| if (tree[i] && typeof tree[i] !== 'string') { |
| markStaticNode(tree[i], (key + "_" + i), isOnce); |
| } |
| } |
| } else { |
| markStaticNode(tree, key, isOnce); |
| } |
| } |
| |
| function markStaticNode (node, key, isOnce) { |
| node.isStatic = true; |
| node.key = key; |
| node.isOnce = isOnce; |
| } |
| |
| /* */ |
| |
| function bindObjectListeners (data, value) { |
| if (value) { |
| if (!isPlainObject(value)) { |
| "development" !== 'production' && warn( |
| 'v-on without argument expects an Object value', |
| this |
| ); |
| } else { |
| var on = data.on = data.on ? extend({}, data.on) : {}; |
| for (var key in value) { |
| var existing = on[key]; |
| var ours = value[key]; |
| on[key] = existing ? [].concat(ours, existing) : ours; |
| } |
| } |
| } |
| return data |
| } |
| |
| /* */ |
| |
| function initRender (vm) { |
| vm._vnode = null; // the root of the child tree |
| vm._staticTrees = null; |
| var parentVnode = vm.$vnode = vm.$options._parentVnode; // the placeholder node in parent tree |
| var renderContext = parentVnode && parentVnode.context; |
| vm.$slots = resolveSlots(vm.$options._renderChildren, renderContext); |
| vm.$scopedSlots = emptyObject; |
| // bind the createElement fn to this instance |
| // so that we get proper render context inside it. |
| // args order: tag, data, children, normalizationType, alwaysNormalize |
| // internal version is used by render functions compiled from templates |
| vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); }; |
| // normalization is always applied for the public version, used in |
| // user-written render functions. |
| vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); }; |
| |
| // $attrs & $listeners are exposed for easier HOC creation. |
| // they need to be reactive so that HOCs using them are always updated |
| var parentData = parentVnode && parentVnode.data; |
| /* istanbul ignore else */ |
| { |
| defineReactive$$1(vm, '$attrs', parentData && parentData.attrs, function () { |
| !isUpdatingChildComponent && warn("$attrs is readonly.", vm); |
| }, true); |
| defineReactive$$1(vm, '$listeners', vm.$options._parentListeners, function () { |
| !isUpdatingChildComponent && warn("$listeners is readonly.", vm); |
| }, true); |
| } |
| } |
| |
| function renderMixin (Vue) { |
| Vue.prototype.$nextTick = function (fn) { |
| return nextTick(fn, this) |
| }; |
| |
| Vue.prototype._render = function () { |
| var vm = this; |
| var ref = vm.$options; |
| var render = ref.render; |
| var staticRenderFns = ref.staticRenderFns; |
| var _parentVnode = ref._parentVnode; |
| |
| if (vm._isMounted) { |
| // clone slot nodes on re-renders |
| for (var key in vm.$slots) { |
| vm.$slots[key] = cloneVNodes(vm.$slots[key]); |
| } |
| } |
| |
| vm.$scopedSlots = (_parentVnode && _parentVnode.data.scopedSlots) || emptyObject; |
| |
| if (staticRenderFns && !vm._staticTrees) { |
| vm._staticTrees = []; |
| } |
| // set parent vnode. this allows render functions to have access |
| // to the data on the placeholder node. |
| vm.$vnode = _parentVnode; |
| // render self |
| var vnode; |
| try { |
| vnode = render.call(vm._renderProxy, vm.$createElement); |
| } catch (e) { |
| handleError(e, vm, "render function"); |
| // return error render result, |
| // or previous vnode to prevent render error causing blank component |
| /* istanbul ignore else */ |
| { |
| vnode = vm.$options.renderError |
| ? vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e) |
| : vm._vnode; |
| } |
| } |
| // return empty vnode in case the render function errored out |
| if (!(vnode instanceof VNode)) { |
| if ("development" !== 'production' && Array.isArray(vnode)) { |
| warn( |
| 'Multiple root nodes returned from render function. Render function ' + |
| 'should return a single root node.', |
| vm |
| ); |
| } |
| vnode = createEmptyVNode(); |
| } |
| // set parent |
| vnode.parent = _parentVnode; |
| return vnode |
| }; |
| |
| // internal render helpers. |
| // these are exposed on the instance prototype to reduce generated render |
| // code size. |
| Vue.prototype._o = markOnce; |
| Vue.prototype._n = toNumber; |
| Vue.prototype._s = toString; |
| Vue.prototype._l = renderList; |
| Vue.prototype._t = renderSlot; |
| Vue.prototype._q = looseEqual; |
| Vue.prototype._i = looseIndexOf; |
| Vue.prototype._m = renderStatic; |
| Vue.prototype._f = resolveFilter; |
| Vue.prototype._k = checkKeyCodes; |
| Vue.prototype._b = bindObjectProps; |
| Vue.prototype._v = createTextVNode; |
| Vue.prototype._e = createEmptyVNode; |
| Vue.prototype._u = resolveScopedSlots; |
| Vue.prototype._g = bindObjectListeners; |
| } |
| |
| /* */ |
| |
| var uid = 0; |
| |
| function initMixin (Vue) { |
| Vue.prototype._init = function (options) { |
| var vm = this; |
| // a uid |
| vm._uid = uid++; |
| |
| var startTag, endTag; |
| /* istanbul ignore if */ |
| if ("development" !== 'production' && config.performance && mark) { |
| startTag = "vue-perf-init:" + (vm._uid); |
| endTag = "vue-perf-end:" + (vm._uid); |
| mark(startTag); |
| } |
| |
| // a flag to avoid this being observed |
| vm._isVue = true; |
| // merge options |
| if (options && options._isComponent) { |
| // optimize internal component instantiation |
| // since dynamic options merging is pretty slow, and none of the |
| // internal component options needs special treatment. |
| initInternalComponent(vm, options); |
| } else { |
| vm.$options = mergeOptions( |
| resolveConstructorOptions(vm.constructor), |
| options || {}, |
| vm |
| ); |
| } |
| /* istanbul ignore else */ |
| { |
| initProxy(vm); |
| } |
| // expose real self |
| vm._self = vm; |
| initLifecycle(vm); |
| initEvents(vm); |
| initRender(vm); |
| callHook(vm, 'beforeCreate'); |
| initInjections(vm); // resolve injections before data/props |
| initState(vm); |
| initProvide(vm); // resolve provide after data/props |
| callHook(vm, 'created'); |
| |
| /* istanbul ignore if */ |
| if ("development" !== 'production' && config.performance && mark) { |
| vm._name = formatComponentName(vm, false); |
| mark(endTag); |
| measure(((vm._name) + " init"), startTag, endTag); |
| } |
| |
| if (vm.$options.el) { |
| vm.$mount(vm.$options.el); |
| } |
| }; |
| } |
| |
| function initInternalComponent (vm, options) { |
| var opts = vm.$options = Object.create(vm.constructor.options); |
| // doing this because it's faster than dynamic enumeration. |
| opts.parent = options.parent; |
| opts.propsData = options.propsData; |
| opts._parentVnode = options._parentVnode; |
| opts._parentListeners = options._parentListeners; |
| opts._renderChildren = options._renderChildren; |
| opts._componentTag = options._componentTag; |
| opts._parentElm = options._parentElm; |
| opts._refElm = options._refElm; |
| if (options.render) { |
| opts.render = options.render; |
| opts.staticRenderFns = options.staticRenderFns; |
| } |
| } |
| |
| function resolveConstructorOptions (Ctor) { |
| var options = Ctor.options; |
| if (Ctor.super) { |
| var superOptions = resolveConstructorOptions(Ctor.super); |
| var cachedSuperOptions = Ctor.superOptions; |
| if (superOptions !== cachedSuperOptions) { |
| // super option changed, |
| // need to resolve new options. |
| Ctor.superOptions = superOptions; |
| // check if there are any late-modified/attached options (#4976) |
| var modifiedOptions = resolveModifiedOptions(Ctor); |
| // update base extend options |
| if (modifiedOptions) { |
| extend(Ctor.extendOptions, modifiedOptions); |
| } |
| options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions); |
| if (options.name) { |
| options.components[options.name] = Ctor; |
| } |
| } |
| } |
| return options |
| } |
| |
| function resolveModifiedOptions (Ctor) { |
| var modified; |
| var latest = Ctor.options; |
| var extended = Ctor.extendOptions; |
| var sealed = Ctor.sealedOptions; |
| for (var key in latest) { |
| if (latest[key] !== sealed[key]) { |
| if (!modified) { modified = {}; } |
| modified[key] = dedupe(latest[key], extended[key], sealed[key]); |
| } |
| } |
| return modified |
| } |
| |
| function dedupe (latest, extended, sealed) { |
| // compare latest and sealed to ensure lifecycle hooks won't be duplicated |
| // between merges |
| if (Array.isArray(latest)) { |
| var res = []; |
| sealed = Array.isArray(sealed) ? sealed : [sealed]; |
| extended = Array.isArray(extended) ? extended : [extended]; |
| for (var i = 0; i < latest.length; i++) { |
| // push original options and not sealed options to exclude duplicated options |
| if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) { |
| res.push(latest[i]); |
| } |
| } |
| return res |
| } else { |
| return latest |
| } |
| } |
| |
| function Vue$2 (options) { |
| if ("development" !== 'production' && |
| !(this instanceof Vue$2) |
| ) { |
| warn('Vue is a constructor and should be called with the `new` keyword'); |
| } |
| this._init(options); |
| } |
| |
| initMixin(Vue$2); |
| stateMixin(Vue$2); |
| eventsMixin(Vue$2); |
| lifecycleMixin(Vue$2); |
| renderMixin(Vue$2); |
| |
| /* */ |
| |
| function initUse (Vue) { |
| Vue.use = function (plugin) { |
| var installedPlugins = (this._installedPlugins || (this._installedPlugins = [])); |
| if (installedPlugins.indexOf(plugin) > -1) { |
| return this |
| } |
| |
| // additional parameters |
| var args = toArray(arguments, 1); |
| args.unshift(this); |
| if (typeof plugin.install === 'function') { |
| plugin.install.apply(plugin, args); |
| } else if (typeof plugin === 'function') { |
| plugin.apply(null, args); |
| } |
| installedPlugins.push(plugin); |
| return this |
| }; |
| } |
| |
| /* */ |
| |
| function initMixin$1 (Vue) { |
| Vue.mixin = function (mixin) { |
| this.options = mergeOptions(this.options, mixin); |
| return this |
| }; |
| } |
| |
| /* */ |
| |
| function initExtend (Vue) { |
| /** |
| * Each instance constructor, including Vue, has a unique |
| * cid. This enables us to create wrapped "child |
| * constructors" for prototypal inheritance and cache them. |
| */ |
| Vue.cid = 0; |
| var cid = 1; |
| |
| /** |
| * Class inheritance |
| */ |
| Vue.extend = function (extendOptions) { |
| extendOptions = extendOptions || {}; |
| var Super = this; |
| var SuperId = Super.cid; |
| var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {}); |
| if (cachedCtors[SuperId]) { |
| return cachedCtors[SuperId] |
| } |
| |
| var name = extendOptions.name || Super.options.name; |
| { |
| if (!/^[a-zA-Z][\w-]*$/.test(name)) { |
| warn( |
| 'Invalid component name: "' + name + '". Component names ' + |
| 'can only contain alphanumeric characters and the hyphen, ' + |
| 'and must start with a letter.' |
| ); |
| } |
| } |
| |
| var Sub = function VueComponent (options) { |
| this._init(options); |
| }; |
| Sub.prototype = Object.create(Super.prototype); |
| Sub.prototype.constructor = Sub; |
| Sub.cid = cid++; |
| Sub.options = mergeOptions( |
| Super.options, |
| extendOptions |
| ); |
| Sub['super'] = Super; |
| |
| // For props and computed properties, we define the proxy getters on |
| // the Vue instances at extension time, on the extended prototype. This |
| // avoids Object.defineProperty calls for each instance created. |
| if (Sub.options.props) { |
| initProps$1(Sub); |
| } |
| if (Sub.options.computed) { |
| initComputed$1(Sub); |
| } |
| |
| // allow further extension/mixin/plugin usage |
| Sub.extend = Super.extend; |
| Sub.mixin = Super.mixin; |
| Sub.use = Super.use; |
| |
| // create asset registers, so extended classes |
| // can have their private assets too. |
| ASSET_TYPES.forEach(function (type) { |
| Sub[type] = Super[type]; |
| }); |
| // enable recursive self-lookup |
| if (name) { |
| Sub.options.components[name] = Sub; |
| } |
| |
| // keep a reference to the super options at extension time. |
| // later at instantiation we can check if Super's options have |
| // been updated. |
| Sub.superOptions = Super.options; |
| Sub.extendOptions = extendOptions; |
| Sub.sealedOptions = extend({}, Sub.options); |
| |
| // cache constructor |
| cachedCtors[SuperId] = Sub; |
| return Sub |
| }; |
| } |
| |
| function initProps$1 (Comp) { |
| var props = Comp.options.props; |
| for (var key in props) { |
| proxy(Comp.prototype, "_props", key); |
| } |
| } |
| |
| function initComputed$1 (Comp) { |
| var computed = Comp.options.computed; |
| for (var key in computed) { |
| defineComputed(Comp.prototype, key, computed[key]); |
| } |
| } |
| |
| /* */ |
| |
| function initAssetRegisters (Vue) { |
| /** |
| * Create asset registration methods. |
| */ |
| ASSET_TYPES.forEach(function (type) { |
| Vue[type] = function ( |
| id, |
| definition |
| ) { |
| if (!definition) { |
| return this.options[type + 's'][id] |
| } else { |
| /* istanbul ignore if */ |
| { |
| if (type === 'component' && config.isReservedTag(id)) { |
| warn( |
| 'Do not use built-in or reserved HTML elements as component ' + |
| 'id: ' + id |
| ); |
| } |
| } |
| if (type === 'component' && isPlainObject(definition)) { |
| definition.name = definition.name || id; |
| definition = this.options._base.extend(definition); |
| } |
| if (type === 'directive' && typeof definition === 'function') { |
| definition = { bind: definition, update: definition }; |
| } |
| this.options[type + 's'][id] = definition; |
| return definition |
| } |
| }; |
| }); |
| } |
| |
| /* */ |
| |
| var patternTypes = [String, RegExp, Array]; |
| |
| function getComponentName (opts) { |
| return opts && (opts.Ctor.options.name || opts.tag) |
| } |
| |
| function matches (pattern, name) { |
| if (Array.isArray(pattern)) { |
| return pattern.indexOf(name) > -1 |
| } else if (typeof pattern === 'string') { |
| return pattern.split(',').indexOf(name) > -1 |
| } else if (isRegExp(pattern)) { |
| return pattern.test(name) |
| } |
| /* istanbul ignore next */ |
| return false |
| } |
| |
| function pruneCache (cache, current, filter) { |
| for (var key in cache) { |
| var cachedNode = cache[key]; |
| if (cachedNode) { |
| var name = getComponentName(cachedNode.componentOptions); |
| if (name && !filter(name)) { |
| if (cachedNode !== current) { |
| pruneCacheEntry(cachedNode); |
| } |
| cache[key] = null; |
| } |
| } |
| } |
| } |
| |
| function pruneCacheEntry (vnode) { |
| if (vnode) { |
| vnode.componentInstance.$destroy(); |
| } |
| } |
| |
| var KeepAlive = { |
| name: 'keep-alive', |
| abstract: true, |
| |
| props: { |
| include: patternTypes, |
| exclude: patternTypes |
| }, |
| |
| created: function created () { |
| this.cache = Object.create(null); |
| }, |
| |
| destroyed: function destroyed () { |
| var this$1 = this; |
| |
| for (var key in this$1.cache) { |
| pruneCacheEntry(this$1.cache[key]); |
| } |
| }, |
| |
| watch: { |
| include: function include (val) { |
| pruneCache(this.cache, this._vnode, function (name) { return matches(val, name); }); |
| }, |
| exclude: function exclude (val) { |
| pruneCache(this.cache, this._vnode, function (name) { return !matches(val, name); }); |
| } |
| }, |
| |
| render: function render () { |
| var vnode = getFirstComponentChild(this.$slots.default); |
| var componentOptions = vnode && vnode.componentOptions; |
| if (componentOptions) { |
| // check pattern |
| var name = getComponentName(componentOptions); |
| if (name && ( |
| (this.include && !matches(this.include, name)) || |
| (this.exclude && matches(this.exclude, name)) |
| )) { |
| return vnode |
| } |
| var key = vnode.key == null |
| // same constructor may get registered as different local components |
| // so cid alone is not enough (#3269) |
| ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '') |
| : vnode.key; |
| if (this.cache[key]) { |
| vnode.componentInstance = this.cache[key].componentInstance; |
| } else { |
| this.cache[key] = vnode; |
| } |
| vnode.data.keepAlive = true; |
| } |
| return vnode |
| } |
| }; |
| |
| var builtInComponents = { |
| KeepAlive: KeepAlive |
| }; |
| |
| /* */ |
| |
| function initGlobalAPI (Vue) { |
| // config |
| var configDef = {}; |
| configDef.get = function () { return config; }; |
| { |
| configDef.set = function () { |
| warn( |
| 'Do not replace the Vue.config object, set individual fields instead.' |
| ); |
| }; |
| } |
| Object.defineProperty(Vue, 'config', configDef); |
| |
| // exposed util methods. |
| // NOTE: these are not considered part of the public API - avoid relying on |
| // them unless you are aware of the risk. |
| Vue.util = { |
| warn: warn, |
| extend: extend, |
| mergeOptions: mergeOptions, |
| defineReactive: defineReactive$$1 |
| }; |
| |
| Vue.set = set; |
| Vue.delete = del; |
| Vue.nextTick = nextTick; |
| |
| Vue.options = Object.create(null); |
| ASSET_TYPES.forEach(function (type) { |
| Vue.options[type + 's'] = Object.create(null); |
| }); |
| |
| // this is used to identify the "base" constructor to extend all plain-object |
| // components with in Weex's multi-instance scenarios. |
| Vue.options._base = Vue; |
| |
| extend(Vue.options.components, builtInComponents); |
| |
| initUse(Vue); |
| initMixin$1(Vue); |
| initExtend(Vue); |
| initAssetRegisters(Vue); |
| } |
| |
| initGlobalAPI(Vue$2); |
| |
| Object.defineProperty(Vue$2.prototype, '$isServer', { |
| get: isServerRendering |
| }); |
| |
| Object.defineProperty(Vue$2.prototype, '$ssrContext', { |
| get: function get () { |
| /* istanbul ignore next */ |
| return this.$vnode && this.$vnode.ssrContext |
| } |
| }); |
| |
| Vue$2.version = '2.4.2'; |
| |
| /* globals renderer */ |
| // renderer is injected by weex factory wrapper |
| |
| var namespaceMap = {}; |
| |
| function createElement$1 (tagName) { |
| return new renderer.Element(tagName) |
| } |
| |
| function createElementNS (namespace, tagName) { |
| return new renderer.Element(namespace + ':' + tagName) |
| } |
| |
| function createTextNode (text) { |
| return new renderer.TextNode(text) |
| } |
| |
| function createComment (text) { |
| return new renderer.Comment(text) |
| } |
| |
| function insertBefore (node, target, before) { |
| if (target.nodeType === 3) { |
| if (node.type === 'text') { |
| node.setAttr('value', target.text); |
| target.parentNode = node; |
| } else { |
| var text = createElement$1('text'); |
| text.setAttr('value', target.text); |
| node.insertBefore(text, before); |
| } |
| return |
| } |
| node.insertBefore(target, before); |
| } |
| |
| function removeChild (node, child) { |
| if (child.nodeType === 3) { |
| node.setAttr('value', ''); |
| return |
| } |
| node.removeChild(child); |
| } |
| |
| function appendChild (node, child) { |
| if (child.nodeType === 3) { |
| if (node.type === 'text') { |
| node.setAttr('value', child.text); |
| child.parentNode = node; |
| } else { |
| var text = createElement$1('text'); |
| text.setAttr('value', child.text); |
| node.appendChild(text); |
| } |
| return |
| } |
| |
| node.appendChild(child); |
| } |
| |
| function parentNode (node) { |
| return node.parentNode |
| } |
| |
| function nextSibling (node) { |
| return node.nextSibling |
| } |
| |
| function tagName (node) { |
| return node.type |
| } |
| |
| function setTextContent (node, text) { |
| node.parentNode.setAttr('value', text); |
| } |
| |
| function setAttribute (node, key, val) { |
| node.setAttr(key, val); |
| } |
| |
| |
| var nodeOps = Object.freeze({ |
| namespaceMap: namespaceMap, |
| createElement: createElement$1, |
| createElementNS: createElementNS, |
| createTextNode: createTextNode, |
| createComment: createComment, |
| insertBefore: insertBefore, |
| removeChild: removeChild, |
| appendChild: appendChild, |
| parentNode: parentNode, |
| nextSibling: nextSibling, |
| tagName: tagName, |
| setTextContent: setTextContent, |
| setAttribute: setAttribute |
| }); |
| |
| /* */ |
| |
| var ref = { |
| create: function create (_, vnode) { |
| registerRef(vnode); |
| }, |
| update: function update (oldVnode, vnode) { |
| if (oldVnode.data.ref !== vnode.data.ref) { |
| registerRef(oldVnode, true); |
| registerRef(vnode); |
| } |
| }, |
| destroy: function destroy (vnode) { |
| registerRef(vnode, true); |
| } |
| }; |
| |
| function registerRef (vnode, isRemoval) { |
| var key = vnode.data.ref; |
| if (!key) { return } |
| |
| var vm = vnode.context; |
| var ref = vnode.componentInstance || vnode.elm; |
| var refs = vm.$refs; |
| if (isRemoval) { |
| if (Array.isArray(refs[key])) { |
| remove(refs[key], ref); |
| } else if (refs[key] === ref) { |
| refs[key] = undefined; |
| } |
| } else { |
| if (vnode.data.refInFor) { |
| if (!Array.isArray(refs[key])) { |
| refs[key] = [ref]; |
| } else if (refs[key].indexOf(ref) < 0) { |
| // $flow-disable-line |
| refs[key].push(ref); |
| } |
| } else { |
| refs[key] = ref; |
| } |
| } |
| } |
| |
| /** |
| * Virtual DOM patching algorithm based on Snabbdom by |
| * Simon Friis Vindum (@paldepind) |
| * Licensed under the MIT License |
| * https://github.com/paldepind/snabbdom/blob/master/LICENSE |
| * |
| * modified by Evan You (@yyx990803) |
| * |
| |
| /* |
| * Not type-checking this because this file is perf-critical and the cost |
| * of making flow understand it is not worth it. |
| */ |
| |
| var emptyNode = new VNode('', {}, []); |
| |
| var hooks = ['create', 'activate', 'update', 'remove', 'destroy']; |
| |
| function sameVnode (a, b) { |
| return ( |
| a.key === b.key && ( |
| ( |
| a.tag === b.tag && |
| a.isComment === b.isComment && |
| isDef(a.data) === isDef(b.data) && |
| sameInputType(a, b) |
| ) || ( |
| isTrue(a.isAsyncPlaceholder) && |
| a.asyncFactory === b.asyncFactory && |
| isUndef(b.asyncFactory.error) |
| ) |
| ) |
| ) |
| } |
| |
| // Some browsers do not support dynamically changing type for <input> |
| // so they need to be treated as different nodes |
| function sameInputType (a, b) { |
| if (a.tag !== 'input') { return true } |
| var i; |
| var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type; |
| var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type; |
| return typeA === typeB |
| } |
| |
| function createKeyToOldIdx (children, beginIdx, endIdx) { |
| var i, key; |
| var map = {}; |
| for (i = beginIdx; i <= endIdx; ++i) { |
| key = children[i].key; |
| if (isDef(key)) { map[key] = i; } |
| } |
| return map |
| } |
| |
| function createPatchFunction (backend) { |
| var i, j; |
| var cbs = {}; |
| |
| var modules = backend.modules; |
| var nodeOps = backend.nodeOps; |
| |
| for (i = 0; i < hooks.length; ++i) { |
| cbs[hooks[i]] = []; |
| for (j = 0; j < modules.length; ++j) { |
| if (isDef(modules[j][hooks[i]])) { |
| cbs[hooks[i]].push(modules[j][hooks[i]]); |
| } |
| } |
| } |
| |
| function emptyNodeAt (elm) { |
| return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm) |
| } |
| |
| function createRmCb (childElm, listeners) { |
| function remove$$1 () { |
| if (--remove$$1.listeners === 0) { |
| removeNode(childElm); |
| } |
| } |
| remove$$1.listeners = listeners; |
| return remove$$1 |
| } |
| |
| function removeNode (el) { |
| var parent = nodeOps.parentNode(el); |
| // element may have already been removed due to v-html / v-text |
| if (isDef(parent)) { |
| nodeOps.removeChild(parent, el); |
| } |
| } |
| |
| var inPre = 0; |
| function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) { |
| vnode.isRootInsert = !nested; // for transition enter check |
| if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) { |
| return |
| } |
| |
| var data = vnode.data; |
| var children = vnode.children; |
| var tag = vnode.tag; |
| if (isDef(tag)) { |
| { |
| if (data && data.pre) { |
| inPre++; |
| } |
| if ( |
| !inPre && |
| !vnode.ns && |
| !(config.ignoredElements.length && config.ignoredElements.indexOf(tag) > -1) && |
| config.isUnknownElement(tag) |
| ) { |
| warn( |
| 'Unknown custom element: <' + tag + '> - did you ' + |
| 'register the component correctly? For recursive components, ' + |
| 'make sure to provide the "name" option.', |
| vnode.context |
| ); |
| } |
| } |
| vnode.elm = vnode.ns |
| ? nodeOps.createElementNS(vnode.ns, tag) |
| : nodeOps.createElement(tag, vnode); |
| setScope(vnode); |
| |
| /* istanbul ignore if */ |
| { |
| // in Weex, the default insertion order is parent-first. |
| // List items can be optimized to use children-first insertion |
| // with append="tree". |
| var appendAsTree = isDef(data) && isTrue(data.appendAsTree); |
| if (!appendAsTree) { |
| if (isDef(data)) { |
| invokeCreateHooks(vnode, insertedVnodeQueue); |
| } |
| insert(parentElm, vnode.elm, refElm); |
| } |
| createChildren(vnode, children, insertedVnodeQueue); |
| if (appendAsTree) { |
| if (isDef(data)) { |
| invokeCreateHooks(vnode, insertedVnodeQueue); |
| } |
| insert(parentElm, vnode.elm, refElm); |
| } |
| } |
| |
| if ("development" !== 'production' && data && data.pre) { |
| inPre--; |
| } |
| } else if (isTrue(vnode.isComment)) { |
| vnode.elm = nodeOps.createComment(vnode.text); |
| insert(parentElm, vnode.elm, refElm); |
| } else { |
| vnode.elm = nodeOps.createTextNode(vnode.text); |
| insert(parentElm, vnode.elm, refElm); |
| } |
| } |
| |
| function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) { |
| var i = vnode.data; |
| if (isDef(i)) { |
| var isReactivated = isDef(vnode.componentInstance) && i.keepAlive; |
| if (isDef(i = i.hook) && isDef(i = i.init)) { |
| i(vnode, false /* hydrating */, parentElm, refElm); |
| } |
| // after calling the init hook, if the vnode is a child component |
| // it should've created a child instance and mounted it. the child |
| // component also has set the placeholder vnode's elm. |
| // in that case we can just return the element and be done. |
| if (isDef(vnode.componentInstance)) { |
| initComponent(vnode, insertedVnodeQueue); |
| if (isTrue(isReactivated)) { |
| reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm); |
| } |
| return true |
| } |
| } |
| } |
| |
| function initComponent (vnode, insertedVnodeQueue) { |
| if (isDef(vnode.data.pendingInsert)) { |
| insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert); |
| vnode.data.pendingInsert = null; |
| } |
| vnode.elm = vnode.componentInstance.$el; |
| if (isPatchable(vnode)) { |
| invokeCreateHooks(vnode, insertedVnodeQueue); |
| setScope(vnode); |
| } else { |
| // empty component root. |
| // skip all element-related modules except for ref (#3455) |
| registerRef(vnode); |
| // make sure to invoke the insert hook |
| insertedVnodeQueue.push(vnode); |
| } |
| } |
| |
| function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) { |
| var i; |
| // hack for #4339: a reactivated component with inner transition |
| // does not trigger because the inner node's created hooks are not called |
| // again. It's not ideal to involve module-specific logic in here but |
| // there doesn't seem to be a better way to do it. |
| var innerNode = vnode; |
| while (innerNode.componentInstance) { |
| innerNode = innerNode.componentInstance._vnode; |
| if (isDef(i = innerNode.data) && isDef(i = i.transition)) { |
| for (i = 0; i < cbs.activate.length; ++i) { |
| cbs.activate[i](emptyNode, innerNode); |
| } |
| insertedVnodeQueue.push(innerNode); |
| break |
| } |
| } |
| // unlike a newly created component, |
| // a reactivated keep-alive component doesn't insert itself |
| insert(parentElm, vnode.elm, refElm); |
| } |
| |
| function insert (parent, elm, ref$$1) { |
| if (isDef(parent)) { |
| if (isDef(ref$$1)) { |
| if (ref$$1.parentNode === parent) { |
| nodeOps.insertBefore(parent, elm, ref$$1); |
| } |
| } else { |
| nodeOps.appendChild(parent, elm); |
| } |
| } |
| } |
| |
| function createChildren (vnode, children, insertedVnodeQueue) { |
| if (Array.isArray(children)) { |
| for (var i = 0; i < children.length; ++i) { |
| createElm(children[i], insertedVnodeQueue, vnode.elm, null, true); |
| } |
| } else if (isPrimitive(vnode.text)) { |
| nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(vnode.text)); |
| } |
| } |
| |
| function isPatchable (vnode) { |
| while (vnode.componentInstance) { |
| vnode = vnode.componentInstance._vnode; |
| } |
| return isDef(vnode.tag) |
| } |
| |
| function invokeCreateHooks (vnode, insertedVnodeQueue) { |
| for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) { |
| cbs.create[i$1](emptyNode, vnode); |
| } |
| i = vnode.data.hook; // Reuse variable |
| if (isDef(i)) { |
| if (isDef(i.create)) { i.create(emptyNode, vnode); } |
| if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); } |
| } |
| } |
| |
| // set scope id attribute for scoped CSS. |
| // this is implemented as a special case to avoid the overhead |
| // of going through the normal attribute patching process. |
| function setScope (vnode) { |
| var i; |
| var ancestor = vnode; |
| while (ancestor) { |
| if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) { |
| nodeOps.setAttribute(vnode.elm, i, ''); |
| } |
| ancestor = ancestor.parent; |
| } |
| // for slot content they should also get the scopeId from the host instance. |
| if (isDef(i = activeInstance) && |
| i !== vnode.context && |
| isDef(i = i.$options._scopeId) |
| ) { |
| nodeOps.setAttribute(vnode.elm, i, ''); |
| } |
| } |
| |
| function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) { |
| for (; startIdx <= endIdx; ++startIdx) { |
| createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm); |
| } |
| } |
| |
| function invokeDestroyHook (vnode) { |
| var i, j; |
| var data = vnode.data; |
| if (isDef(data)) { |
| if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); } |
| for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); } |
| } |
| if (isDef(i = vnode.children)) { |
| for (j = 0; j < vnode.children.length; ++j) { |
| invokeDestroyHook(vnode.children[j]); |
| } |
| } |
| } |
| |
| function removeVnodes (parentElm, vnodes, startIdx, endIdx) { |
| for (; startIdx <= endIdx; ++startIdx) { |
| var ch = vnodes[startIdx]; |
| if (isDef(ch)) { |
| if (isDef(ch.tag)) { |
| removeAndInvokeRemoveHook(ch); |
| invokeDestroyHook(ch); |
| } else { // Text node |
| removeNode(ch.elm); |
| } |
| } |
| } |
| } |
| |
| function removeAndInvokeRemoveHook (vnode, rm) { |
| if (isDef(rm) || isDef(vnode.data)) { |
| var i; |
| var listeners = cbs.remove.length + 1; |
| if (isDef(rm)) { |
| // we have a recursively passed down rm callback |
| // increase the listeners count |
| rm.listeners += listeners; |
| } else { |
| // directly removing |
| rm = createRmCb(vnode.elm, listeners); |
| } |
| // recursively invoke hooks on child component root node |
| if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) { |
| removeAndInvokeRemoveHook(i, rm); |
| } |
| for (i = 0; i < cbs.remove.length; ++i) { |
| cbs.remove[i](vnode, rm); |
| } |
| if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) { |
| i(vnode, rm); |
| } else { |
| rm(); |
| } |
| } else { |
| removeNode(vnode.elm); |
| } |
| } |
| |
| function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) { |
| var oldStartIdx = 0; |
| var newStartIdx = 0; |
| var oldEndIdx = oldCh.length - 1; |
| var oldStartVnode = oldCh[0]; |
| var oldEndVnode = oldCh[oldEndIdx]; |
| var newEndIdx = newCh.length - 1; |
| var newStartVnode = newCh[0]; |
| var newEndVnode = newCh[newEndIdx]; |
| var oldKeyToIdx, idxInOld, elmToMove, refElm; |
| |
| // removeOnly is a special flag used only by <transition-group> |
| // to ensure removed elements stay in correct relative positions |
| // during leaving transitions |
| var canMove = !removeOnly; |
| |
| while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { |
| if (isUndef(oldStartVnode)) { |
| oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left |
| } else if (isUndef(oldEndVnode)) { |
| oldEndVnode = oldCh[--oldEndIdx]; |
| } else if (sameVnode(oldStartVnode, newStartVnode)) { |
| patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue); |
| oldStartVnode = oldCh[++oldStartIdx]; |
| newStartVnode = newCh[++newStartIdx]; |
| } else if (sameVnode(oldEndVnode, newEndVnode)) { |
| patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue); |
| oldEndVnode = oldCh[--oldEndIdx]; |
| newEndVnode = newCh[--newEndIdx]; |
| } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right |
| patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue); |
| canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm)); |
| oldStartVnode = oldCh[++oldStartIdx]; |
| newEndVnode = newCh[--newEndIdx]; |
| } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left |
| patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue); |
| canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm); |
| oldEndVnode = oldCh[--oldEndIdx]; |
| newStartVnode = newCh[++newStartIdx]; |
| } else { |
| if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); } |
| idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null; |
| if (isUndef(idxInOld)) { // New element |
| createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm); |
| newStartVnode = newCh[++newStartIdx]; |
| } else { |
| elmToMove = oldCh[idxInOld]; |
| /* istanbul ignore if */ |
| if ("development" !== 'production' && !elmToMove) { |
| warn( |
| 'It seems there are duplicate keys that is causing an update error. ' + |
| 'Make sure each v-for item has a unique key.' |
| ); |
| } |
| if (sameVnode(elmToMove, newStartVnode)) { |
| patchVnode(elmToMove, newStartVnode, insertedVnodeQueue); |
| oldCh[idxInOld] = undefined; |
| canMove && nodeOps.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm); |
| newStartVnode = newCh[++newStartIdx]; |
| } else { |
| // same key but different element. treat as new element |
| createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm); |
| newStartVnode = newCh[++newStartIdx]; |
| } |
| } |
| } |
| } |
| if (oldStartIdx > oldEndIdx) { |
| refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm; |
| addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue); |
| } else if (newStartIdx > newEndIdx) { |
| removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); |
| } |
| } |
| |
| function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) { |
| if (oldVnode === vnode) { |
| return |
| } |
| |
| var elm = vnode.elm = oldVnode.elm; |
| |
| if (isTrue(oldVnode.isAsyncPlaceholder)) { |
| if (isDef(vnode.asyncFactory.resolved)) { |
| hydrate(oldVnode.elm, vnode, insertedVnodeQueue); |
| } else { |
| vnode.isAsyncPlaceholder = true; |
| } |
| return |
| } |
| |
| // reuse element for static trees. |
| // note we only do this if the vnode is cloned - |
| // if the new node is not cloned it means the render functions have been |
| // reset by the hot-reload-api and we need to do a proper re-render. |
| if (isTrue(vnode.isStatic) && |
| isTrue(oldVnode.isStatic) && |
| vnode.key === oldVnode.key && |
| (isTrue(vnode.isCloned) || isTrue(vnode.isOnce)) |
| ) { |
| vnode.componentInstance = oldVnode.componentInstance; |
| return |
| } |
| |
| var i; |
| var data = vnode.data; |
| if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) { |
| i(oldVnode, vnode); |
| } |
| |
| var oldCh = oldVnode.children; |
| var ch = vnode.children; |
| if (isDef(data) && isPatchable(vnode)) { |
| for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); } |
| if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); } |
| } |
| if (isUndef(vnode.text)) { |
| if (isDef(oldCh) && isDef(ch)) { |
| if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); } |
| } else if (isDef(ch)) { |
| if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); } |
| addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue); |
| } else if (isDef(oldCh)) { |
| removeVnodes(elm, oldCh, 0, oldCh.length - 1); |
| } else if (isDef(oldVnode.text)) { |
| nodeOps.setTextContent(elm, ''); |
| } |
| } else if (oldVnode.text !== vnode.text) { |
| nodeOps.setTextContent(elm, vnode.text); |
| } |
| if (isDef(data)) { |
| if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); } |
| } |
| } |
| |
| function invokeInsertHook (vnode, queue, initial) { |
| // delay insert hooks for component root nodes, invoke them after the |
| // element is really inserted |
| if (isTrue(initial) && isDef(vnode.parent)) { |
| vnode.parent.data.pendingInsert = queue; |
| } else { |
| for (var i = 0; i < queue.length; ++i) { |
| queue[i].data.hook.insert(queue[i]); |
| } |
| } |
| } |
| |
| var bailed = false; |
| // list of modules that can skip create hook during hydration because they |
| // are already rendered on the client or has no need for initialization |
| var isRenderedModule = makeMap('attrs,style,class,staticClass,staticStyle,key'); |
| |
| // Note: this is a browser-only function so we can assume elms are DOM nodes. |
| function hydrate (elm, vnode, insertedVnodeQueue) { |
| if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) { |
| vnode.elm = elm; |
| vnode.isAsyncPlaceholder = true; |
| return true |
| } |
| { |
| if (!assertNodeMatch(elm, vnode)) { |
| return false |
| } |
| } |
| vnode.elm = elm; |
| var tag = vnode.tag; |
| var data = vnode.data; |
| var children = vnode.children; |
| if (isDef(data)) { |
| if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); } |
| if (isDef(i = vnode.componentInstance)) { |
| // child component. it should have hydrated its own tree. |
| initComponent(vnode, insertedVnodeQueue); |
| return true |
| } |
| } |
| if (isDef(tag)) { |
| if (isDef(children)) { |
| // empty element, allow client to pick up and populate children |
| if (!elm.hasChildNodes()) { |
| createChildren(vnode, children, insertedVnodeQueue); |
| } else { |
| var childrenMatch = true; |
| var childNode = elm.firstChild; |
| for (var i$1 = 0; i$1 < children.length; i$1++) { |
| if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue)) { |
| childrenMatch = false; |
| break |
| } |
| childNode = childNode.nextSibling; |
| } |
| // if childNode is not null, it means the actual childNodes list is |
| // longer than the virtual children list. |
| if (!childrenMatch || childNode) { |
| if ("development" !== 'production' && |
| typeof console !== 'undefined' && |
| !bailed |
| ) { |
| bailed = true; |
| console.warn('Parent: ', elm); |
| console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children); |
| } |
| return false |
| } |
| } |
| } |
| if (isDef(data)) { |
| for (var key in data) { |
| if (!isRenderedModule(key)) { |
| invokeCreateHooks(vnode, insertedVnodeQueue); |
| break |
| } |
| } |
| } |
| } else if (elm.data !== vnode.text) { |
| elm.data = vnode.text; |
| } |
| return true |
| } |
| |
| function assertNodeMatch (node, vnode) { |
| if (isDef(vnode.tag)) { |
| return ( |
| vnode.tag.indexOf('vue-component') === 0 || |
| vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase()) |
| ) |
| } else { |
| return node.nodeType === (vnode.isComment ? 8 : 3) |
| } |
| } |
| |
| return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) { |
| if (isUndef(vnode)) { |
| if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); } |
| return |
| } |
| |
| var isInitialPatch = false; |
| var insertedVnodeQueue = []; |
| |
| if (isUndef(oldVnode)) { |
| // empty mount (likely as component), create new root element |
| isInitialPatch = true; |
| createElm(vnode, insertedVnodeQueue, parentElm, refElm); |
| } else { |
| var isRealElement = isDef(oldVnode.nodeType); |
| if (!isRealElement && sameVnode(oldVnode, vnode)) { |
| // patch existing root node |
| patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly); |
| } else { |
| if (isRealElement) { |
| // mounting to a real element |
| // check if this is server-rendered content and if we can perform |
| // a successful hydration. |
| if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) { |
| oldVnode.removeAttribute(SSR_ATTR); |
| hydrating = true; |
| } |
| if (isTrue(hydrating)) { |
| if (hydrate(oldVnode, vnode, insertedVnodeQueue)) { |
| invokeInsertHook(vnode, insertedVnodeQueue, true); |
| return oldVnode |
| } else { |
| warn( |
| 'The client-side rendered virtual DOM tree is not matching ' + |
| 'server-rendered content. This is likely caused by incorrect ' + |
| 'HTML markup, for example nesting block-level elements inside ' + |
| '<p>, or missing <tbody>. Bailing hydration and performing ' + |
| 'full client-side render.' |
| ); |
| } |
| } |
| // either not server-rendered, or hydration failed. |
| // create an empty node and replace it |
| oldVnode = emptyNodeAt(oldVnode); |
| } |
| // replacing existing element |
| var oldElm = oldVnode.elm; |
| var parentElm$1 = nodeOps.parentNode(oldElm); |
| createElm( |
| vnode, |
| insertedVnodeQueue, |
| // extremely rare edge case: do not insert if old element is in a |
| // leaving transition. Only happens when combining transition + |
| // keep-alive + HOCs. (#4590) |
| oldElm._leaveCb ? null : parentElm$1, |
| nodeOps.nextSibling(oldElm) |
| ); |
| |
| if (isDef(vnode.parent)) { |
| // component root element replaced. |
| // update parent placeholder node element, recursively |
| var ancestor = vnode.parent; |
| while (ancestor) { |
| ancestor.elm = vnode.elm; |
| ancestor = ancestor.parent; |
| } |
| if (isPatchable(vnode)) { |
| for (var i = 0; i < cbs.create.length; ++i) { |
| cbs.create[i](emptyNode, vnode.parent); |
| } |
| } |
| } |
| |
| if (isDef(parentElm$1)) { |
| removeVnodes(parentElm$1, [oldVnode], 0, 0); |
| } else if (isDef(oldVnode.tag)) { |
| invokeDestroyHook(oldVnode); |
| } |
| } |
| } |
| |
| invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch); |
| return vnode.elm |
| } |
| } |
| |
| /* */ |
| |
| var directives = { |
| create: updateDirectives, |
| update: updateDirectives, |
| destroy: function unbindDirectives (vnode) { |
| updateDirectives(vnode, emptyNode); |
| } |
| }; |
| |
| function updateDirectives (oldVnode, vnode) { |
| if (oldVnode.data.directives || vnode.data.directives) { |
| _update(oldVnode, vnode); |
| } |
| } |
| |
| function _update (oldVnode, vnode) { |
| var isCreate = oldVnode === emptyNode; |
| var isDestroy = vnode === emptyNode; |
| var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context); |
| var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context); |
| |
| var dirsWithInsert = []; |
| var dirsWithPostpatch = []; |
| |
| var key, oldDir, dir; |
| for (key in newDirs) { |
| oldDir = oldDirs[key]; |
| dir = newDirs[key]; |
| if (!oldDir) { |
| // new directive, bind |
| callHook$1(dir, 'bind', vnode, oldVnode); |
| if (dir.def && dir.def.inserted) { |
| dirsWithInsert.push(dir); |
| } |
| } else { |
| // existing directive, update |
| dir.oldValue = oldDir.value; |
| callHook$1(dir, 'update', vnode, oldVnode); |
| if (dir.def && dir.def.componentUpdated) { |
| dirsWithPostpatch.push(dir); |
| } |
| } |
| } |
| |
| if (dirsWithInsert.length) { |
| var callInsert = function () { |
| for (var i = 0; i < dirsWithInsert.length; i++) { |
| callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode); |
| } |
| }; |
| if (isCreate) { |
| mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', callInsert); |
| } else { |
| callInsert(); |
| } |
| } |
| |
| if (dirsWithPostpatch.length) { |
| mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'postpatch', function () { |
| for (var i = 0; i < dirsWithPostpatch.length; i++) { |
| callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode); |
| } |
| }); |
| } |
| |
| if (!isCreate) { |
| for (key in oldDirs) { |
| if (!newDirs[key]) { |
| // no longer present, unbind |
| callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy); |
| } |
| } |
| } |
| } |
| |
| var emptyModifiers = Object.create(null); |
| |
| function normalizeDirectives$1 ( |
| dirs, |
| vm |
| ) { |
| var res = Object.create(null); |
| if (!dirs) { |
| return res |
| } |
| var i, dir; |
| for (i = 0; i < dirs.length; i++) { |
| dir = dirs[i]; |
| if (!dir.modifiers) { |
| dir.modifiers = emptyModifiers; |
| } |
| res[getRawDirName(dir)] = dir; |
| dir.def = resolveAsset(vm.$options, 'directives', dir.name, true); |
| } |
| return res |
| } |
| |
| function getRawDirName (dir) { |
| return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.'))) |
| } |
| |
| function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) { |
| var fn = dir.def && dir.def[hook]; |
| if (fn) { |
| try { |
| fn(vnode.elm, dir, vnode, oldVnode, isDestroy); |
| } catch (e) { |
| handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook")); |
| } |
| } |
| } |
| |
| var baseModules = [ |
| ref, |
| directives |
| ]; |
| |
| /* */ |
| |
| function updateAttrs (oldVnode, vnode) { |
| if (!oldVnode.data.attrs && !vnode.data.attrs) { |
| return |
| } |
| var key, cur, old; |
| var elm = vnode.elm; |
| var oldAttrs = oldVnode.data.attrs || {}; |
| var attrs = vnode.data.attrs || {}; |
| // clone observed objects, as the user probably wants to mutate it |
| if (attrs.__ob__) { |
| attrs = vnode.data.attrs = extend({}, attrs); |
| } |
| |
| for (key in attrs) { |
| cur = attrs[key]; |
| old = oldAttrs[key]; |
| if (old !== cur) { |
| elm.setAttr(key, cur); |
| } |
| } |
| for (key in oldAttrs) { |
| if (attrs[key] == null) { |
| elm.setAttr(key); |
| } |
| } |
| } |
| |
| var attrs = { |
| create: updateAttrs, |
| update: updateAttrs |
| }; |
| |
| /* */ |
| |
| function updateClass (oldVnode, vnode) { |
| var el = vnode.elm; |
| var ctx = vnode.context; |
| |
| var data = vnode.data; |
| var oldData = oldVnode.data; |
| if (!data.staticClass && |
| !data.class && |
| (!oldData || (!oldData.staticClass && !oldData.class)) |
| ) { |
| return |
| } |
| |
| var oldClassList = []; |
| // unlike web, weex vnode staticClass is an Array |
| var oldStaticClass = oldData.staticClass; |
| if (oldStaticClass) { |
| oldClassList.push.apply(oldClassList, oldStaticClass); |
| } |
| if (oldData.class) { |
| oldClassList.push.apply(oldClassList, oldData.class); |
| } |
| |
| var classList = []; |
| // unlike web, weex vnode staticClass is an Array |
| var staticClass = data.staticClass; |
| if (staticClass) { |
| classList.push.apply(classList, staticClass); |
| } |
| if (data.class) { |
| classList.push.apply(classList, data.class); |
| } |
| |
| var style = getStyle(oldClassList, classList, ctx); |
| for (var key in style) { |
| el.setStyle(key, style[key]); |
| } |
| } |
| |
| function getStyle (oldClassList, classList, ctx) { |
| // style is a weex-only injected object |
| // compiled from <style> tags in weex files |
| var stylesheet = ctx.$options.style || {}; |
| var result = {}; |
| classList.forEach(function (name) { |
| var style = stylesheet[name]; |
| extend(result, style); |
| }); |
| oldClassList.forEach(function (name) { |
| var style = stylesheet[name]; |
| for (var key in style) { |
| if (!result.hasOwnProperty(key)) { |
| result[key] = ''; |
| } |
| } |
| }); |
| return result |
| } |
| |
| var klass = { |
| create: updateClass, |
| update: updateClass |
| }; |
| |
| /* */ |
| |
| var target$1; |
| |
| function add$1 ( |
| event, |
| handler, |
| once, |
| capture |
| ) { |
| if (capture) { |
| console.log('Weex do not support event in bubble phase.'); |
| return |
| } |
| if (once) { |
| var oldHandler = handler; |
| var _target = target$1; // save current target element in closure |
| handler = function (ev) { |
| var res = arguments.length === 1 |
| ? oldHandler(ev) |
| : oldHandler.apply(null, arguments); |
| if (res !== null) { |
| remove$2(event, null, null, _target); |
| } |
| }; |
| } |
| target$1.addEvent(event, handler); |
| } |
| |
| function remove$2 ( |
| event, |
| handler, |
| capture, |
| _target |
| ) { |
| (_target || target$1).removeEvent(event); |
| } |
| |
| function updateDOMListeners (oldVnode, vnode) { |
| if (!oldVnode.data.on && !vnode.data.on) { |
| return |
| } |
| var on = vnode.data.on || {}; |
| var oldOn = oldVnode.data.on || {}; |
| target$1 = vnode.elm; |
| updateListeners(on, oldOn, add$1, remove$2, vnode.context); |
| } |
| |
| var events = { |
| create: updateDOMListeners, |
| update: updateDOMListeners |
| }; |
| |
| /* */ |
| |
| var normalize = cached(camelize); |
| |
| function createStyle (oldVnode, vnode) { |
| if (!vnode.data.staticStyle) { |
| updateStyle(oldVnode, vnode); |
| return |
| } |
| var elm = vnode.elm; |
| var staticStyle = vnode.data.staticStyle; |
| for (var name in staticStyle) { |
| if (staticStyle[name]) { |
| elm.setStyle(normalize(name), staticStyle[name]); |
| } |
| } |
| updateStyle(oldVnode, vnode); |
| } |
| |
| function updateStyle (oldVnode, vnode) { |
| if (!oldVnode.data.style && !vnode.data.style) { |
| return |
| } |
| var cur, name; |
| var elm = vnode.elm; |
| var oldStyle = oldVnode.data.style || {}; |
| var style = vnode.data.style || {}; |
| |
| var needClone = style.__ob__; |
| |
| // handle array syntax |
| if (Array.isArray(style)) { |
| style = vnode.data.style = toObject$1(style); |
| } |
| |
| // clone the style for future updates, |
| // in case the user mutates the style object in-place. |
| if (needClone) { |
| style = vnode.data.style = extend({}, style); |
| } |
| |
| for (name in oldStyle) { |
| if (!style[name]) { |
| elm.setStyle(normalize(name), ''); |
| } |
| } |
| for (name in style) { |
| cur = style[name]; |
| elm.setStyle(normalize(name), cur); |
| } |
| } |
| |
| function toObject$1 (arr) { |
| var res = {}; |
| for (var i = 0; i < arr.length; i++) { |
| if (arr[i]) { |
| extend(res, arr[i]); |
| } |
| } |
| return res |
| } |
| |
| var style = { |
| create: createStyle, |
| update: updateStyle |
| }; |
| |
| /* */ |
| |
| /** |
| * Add class with compatibility for SVG since classList is not supported on |
| * SVG elements in IE |
| */ |
| |
| |
| /** |
| * Remove class with compatibility for SVG since classList is not supported on |
| * SVG elements in IE |
| */ |
| |
| /* */ |
| |
| function resolveTransition (def$$1) { |
| if (!def$$1) { |
| return |
| } |
| /* istanbul ignore else */ |
| if (typeof def$$1 === 'object') { |
| var res = {}; |
| if (def$$1.css !== false) { |
| extend(res, autoCssTransition(def$$1.name || 'v')); |
| } |
| extend(res, def$$1); |
| return res |
| } else if (typeof def$$1 === 'string') { |
| return autoCssTransition(def$$1) |
| } |
| } |
| |
| var autoCssTransition = cached(function (name) { |
| return { |
| enterClass: (name + "-enter"), |
| enterToClass: (name + "-enter-to"), |
| enterActiveClass: (name + "-enter-active"), |
| leaveClass: (name + "-leave"), |
| leaveToClass: (name + "-leave-to"), |
| leaveActiveClass: (name + "-leave-active") |
| } |
| }); |
| |
| |
| // Transition property/event sniffing |
| |
| |
| |
| |
| // binding to window is necessary to make hot reload work in IE in strict mode |
| var raf = inBrowser && window.requestAnimationFrame |
| ? window.requestAnimationFrame.bind(window) |
| : setTimeout; |
| |
| var transition = { |
| create: enter, |
| activate: enter, |
| remove: leave |
| }; |
| |
| function enter (_, vnode) { |
| var el = vnode.elm; |
| |
| // call leave callback now |
| if (el._leaveCb) { |
| el._leaveCb.cancelled = true; |
| el._leaveCb(); |
| } |
| |
| var data = resolveTransition(vnode.data.transition); |
| if (!data) { |
| return |
| } |
| |
| /* istanbul ignore if */ |
| if (el._enterCb) { |
| return |
| } |
| |
| var enterClass = data.enterClass; |
| var enterToClass = data.enterToClass; |
| var enterActiveClass = data.enterActiveClass; |
| var appearClass = data.appearClass; |
| var appearToClass = data.appearToClass; |
| var appearActiveClass = data.appearActiveClass; |
| var beforeEnter = data.beforeEnter; |
| var enter = data.enter; |
| var afterEnter = data.afterEnter; |
| var enterCancelled = data.enterCancelled; |
| var beforeAppear = data.beforeAppear; |
| var appear = data.appear; |
| var afterAppear = data.afterAppear; |
| var appearCancelled = data.appearCancelled; |
| |
| var context = activeInstance; |
| var transitionNode = activeInstance.$vnode; |
| while (transitionNode && transitionNode.parent) { |
| transitionNode = transitionNode.parent; |
| context = transitionNode.context; |
| } |
| |
| var isAppear = !context._isMounted || !vnode.isRootInsert; |
| |
| if (isAppear && !appear && appear !== '') { |
| return |
| } |
| |
| var startClass = isAppear ? appearClass : enterClass; |
| var toClass = isAppear ? appearToClass : enterToClass; |
| var activeClass = isAppear ? appearActiveClass : enterActiveClass; |
| var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter; |
| var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter; |
| var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter; |
| var enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled; |
| |
| var userWantsControl = |
| enterHook && |
| // enterHook may be a bound method which exposes |
| // the length of original fn as _length |
| (enterHook._length || enterHook.length) > 1; |
| |
| var stylesheet = vnode.context.$options.style || {}; |
| var startState = stylesheet[startClass]; |
| var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][activeClass]) || {}; |
| var endState = getEnterTargetState(el, stylesheet, startClass, toClass, activeClass, vnode.context); |
| var needAnimation = Object.keys(endState).length > 0; |
| |
| var cb = el._enterCb = once(function () { |
| if (cb.cancelled) { |
| enterCancelledHook && enterCancelledHook(el); |
| } else { |
| afterEnterHook && afterEnterHook(el); |
| } |
| el._enterCb = null; |
| }); |
| |
| // We need to wait until the native element has been inserted, but currently |
| // there's no API to do that. So we have to wait "one frame" - not entirely |
| // sure if this is guaranteed to be enough (e.g. on slow devices?) |
| setTimeout(function () { |
| var parent = el.parentNode; |
| var pendingNode = parent && parent._pending && parent._pending[vnode.key]; |
| if (pendingNode && |
| pendingNode.context === vnode.context && |
| pendingNode.tag === vnode.tag && |
| pendingNode.elm._leaveCb |
| ) { |
| pendingNode.elm._leaveCb(); |
| } |
| enterHook && enterHook(el, cb); |
| |
| if (needAnimation) { |
| var animation = vnode.context.$requireWeexModule('animation'); |
| animation.transition(el.ref, { |
| styles: endState, |
| duration: transitionProperties.duration || 0, |
| delay: transitionProperties.delay || 0, |
| timingFunction: transitionProperties.timingFunction || 'linear' |
| }, userWantsControl ? noop : cb); |
| } else if (!userWantsControl) { |
| cb(); |
| } |
| }, 16); |
| |
| // start enter transition |
| beforeEnterHook && beforeEnterHook(el); |
| |
| if (startState) { |
| for (var key in startState) { |
| el.setStyle(key, startState[key]); |
| } |
| } |
| |
| if (!needAnimation && !userWantsControl) { |
| cb(); |
| } |
| } |
| |
| function leave (vnode, rm) { |
| var el = vnode.elm; |
| |
| // call enter callback now |
| if (el._enterCb) { |
| el._enterCb.cancelled = true; |
| el._enterCb(); |
| } |
| |
| var data = resolveTransition(vnode.data.transition); |
| if (!data) { |
| return rm() |
| } |
| |
| if (el._leaveCb) { |
| return |
| } |
| |
| var leaveClass = data.leaveClass; |
| var leaveToClass = data.leaveToClass; |
| var leaveActiveClass = data.leaveActiveClass; |
| var beforeLeave = data.beforeLeave; |
| var leave = data.leave; |
| var afterLeave = data.afterLeave; |
| var leaveCancelled = data.leaveCancelled; |
| var delayLeave = data.delayLeave; |
| |
| var userWantsControl = |
| leave && |
| // leave hook may be a bound method which exposes |
| // the length of original fn as _length |
| (leave._length || leave.length) > 1; |
| |
| var stylesheet = vnode.context.$options.style || {}; |
| var startState = stylesheet[leaveClass]; |
| var endState = stylesheet[leaveToClass] || stylesheet[leaveActiveClass]; |
| var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][leaveActiveClass]) || {}; |
| |
| var cb = el._leaveCb = once(function () { |
| if (el.parentNode && el.parentNode._pending) { |
| el.parentNode._pending[vnode.key] = null; |
| } |
| if (cb.cancelled) { |
| leaveCancelled && leaveCancelled(el); |
| } else { |
| rm(); |
| afterLeave && afterLeave(el); |
| } |
| el._leaveCb = null; |
| }); |
| |
| if (delayLeave) { |
| delayLeave(performLeave); |
| } else { |
| performLeave(); |
| } |
| |
| function performLeave () { |
| var animation = vnode.context.$requireWeexModule('animation'); |
| // the delayed leave may have already been cancelled |
| if (cb.cancelled) { |
| return |
| } |
| // record leaving element |
| if (!vnode.data.show) { |
| (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode; |
| } |
| beforeLeave && beforeLeave(el); |
| |
| if (startState) { |
| animation.transition(el.ref, { |
| styles: startState |
| }, next); |
| } else { |
| next(); |
| } |
| |
| function next () { |
| animation.transition(el.ref, { |
| styles: endState, |
| duration: transitionProperties.duration || 0, |
| delay: transitionProperties.delay || 0, |
| timingFunction: transitionProperties.timingFunction || 'linear' |
| }, userWantsControl ? noop : cb); |
| } |
| |
| leave && leave(el, cb); |
| if (!endState && !userWantsControl) { |
| cb(); |
| } |
| } |
| } |
| |
| // determine the target animation style for an entering transition. |
| function getEnterTargetState (el, stylesheet, startClass, endClass, activeClass, vm) { |
| var targetState = {}; |
| var startState = stylesheet[startClass]; |
| var endState = stylesheet[endClass]; |
| var activeState = stylesheet[activeClass]; |
| // 1. fallback to element's default styling |
| if (startState) { |
| for (var key in startState) { |
| targetState[key] = el.style[key]; |
| if ( |
| "development" !== 'production' && |
| targetState[key] == null && |
| (!activeState || activeState[key] == null) && |
| (!endState || endState[key] == null) |
| ) { |
| warn( |
| "transition property \"" + key + "\" is declared in enter starting class (." + startClass + "), " + |
| "but not declared anywhere in enter ending class (." + endClass + "), " + |
| "enter active cass (." + activeClass + ") or the element's default styling. " + |
| "Note in Weex, CSS properties need explicit values to be transitionable." |
| ); |
| } |
| } |
| } |
| // 2. if state is mixed in active state, extract them while excluding |
| // transition properties |
| if (activeState) { |
| for (var key$1 in activeState) { |
| if (key$1.indexOf('transition') !== 0) { |
| targetState[key$1] = activeState[key$1]; |
| } |
| } |
| } |
| // 3. explicit endState has highest priority |
| if (endState) { |
| extend(targetState, endState); |
| } |
| return targetState |
| } |
| |
| var platformModules = [ |
| attrs, |
| klass, |
| events, |
| style, |
| transition |
| ]; |
| |
| /* */ |
| |
| // the directive module should be applied last, after all |
| // built-in modules have been applied. |
| var modules = platformModules.concat(baseModules); |
| |
| var patch = createPatchFunction({ |
| nodeOps: nodeOps, |
| modules: modules, |
| LONG_LIST_THRESHOLD: 10 |
| }); |
| |
| var platformDirectives = { |
| }; |
| |
| function getVNodeType (vnode) { |
| if (!vnode.tag) { |
| return '' |
| } |
| return vnode.tag.replace(/vue\-component\-(\d+\-)?/, '') |
| } |
| |
| function isSimpleSpan (vnode) { |
| return vnode.children && vnode.children.length === 1 && !vnode.children[0].tag |
| } |
| |
| var cssLengthRE = /^([+-]?[0-9]+(\.[0-9]+)?)(px|em|ex|%|in|cm|mm|pt|pc)$/i; |
| function trimCSSUnit (prop) { |
| var res = String(prop).match(cssLengthRE); |
| if (res) { |
| return Number(res[1]) |
| } |
| return prop |
| } |
| |
| function parseStyle (vnode) { |
| if (!vnode || !vnode.data) { |
| return |
| } |
| |
| var ref = vnode.data; |
| var staticStyle = ref.staticStyle; |
| var staticClass = ref.staticClass; |
| if (vnode.data.style || vnode.data.class || staticStyle || staticClass) { |
| var styles = Object.assign({}, staticStyle, vnode.data.style); |
| |
| var cssMap = vnode.context.$options.style || {}; |
| var classList = [].concat(staticClass, vnode.data.class); |
| classList.forEach(function (name) { |
| if (name && cssMap[name]) { |
| Object.assign(styles, cssMap[name]); |
| } |
| }); |
| |
| for (var key in styles) { |
| styles[key] = trimCSSUnit(styles[key]); |
| } |
| return styles |
| } |
| } |
| |
| function convertVNodeChildren (children) { |
| if (!children.length) { |
| return |
| } |
| |
| return children.map(function (vnode) { |
| var type = getVNodeType(vnode); |
| var props = { type: type }; |
| |
| // convert raw text node |
| if (!type) { |
| props.type = 'span'; |
| props.attr = { |
| value: (vnode.text || '').trim() |
| }; |
| } else { |
| props.style = parseStyle(vnode); |
| if (vnode.data) { |
| props.attr = vnode.data.attrs; |
| if (vnode.data.on) { |
| props.events = vnode.data.on; |
| } |
| } |
| |
| if (type === 'span' && isSimpleSpan(vnode)) { |
| props.attr = props.attr || {}; |
| props.attr.value = vnode.children[0].text.trim(); |
| return props |
| } |
| } |
| |
| if (vnode.children && vnode.children.length) { |
| props.children = convertVNodeChildren(vnode.children); |
| } |
| |
| return props |
| }) |
| } |
| |
| var Richtext = { |
| name: 'richtext', |
| // abstract: true, |
| render: function render (h) { |
| return h('weex:richtext', { |
| on: this._events, |
| attrs: { |
| value: convertVNodeChildren(this.$options._renderChildren || []) |
| } |
| }) |
| } |
| }; |
| |
| /* */ |
| |
| // Provides transition support for a single element/component. |
| // supports transition mode (out-in / in-out) |
| |
| var transitionProps = { |
| name: String, |
| appear: Boolean, |
| css: Boolean, |
| mode: String, |
| type: String, |
| enterClass: String, |
| leaveClass: String, |
| enterToClass: String, |
| leaveToClass: String, |
| enterActiveClass: String, |
| leaveActiveClass: String, |
| appearClass: String, |
| appearActiveClass: String, |
| appearToClass: String, |
| duration: [Number, String, Object] |
| }; |
| |
| // in case the child is also an abstract component, e.g. <keep-alive> |
| // we want to recursively retrieve the real component to be rendered |
| function getRealChild (vnode) { |
| var compOptions = vnode && vnode.componentOptions; |
| if (compOptions && compOptions.Ctor.options.abstract) { |
| return getRealChild(getFirstComponentChild(compOptions.children)) |
| } else { |
| return vnode |
| } |
| } |
| |
| function extractTransitionData (comp) { |
| var data = {}; |
| var options = comp.$options; |
| // props |
| for (var key in options.propsData) { |
| data[key] = comp[key]; |
| } |
| // events. |
| // extract listeners and pass them directly to the transition methods |
| var listeners = options._parentListeners; |
| for (var key$1 in listeners) { |
| data[camelize(key$1)] = listeners[key$1]; |
| } |
| return data |
| } |
| |
| function placeholder (h, rawChild) { |
| if (/\d-keep-alive$/.test(rawChild.tag)) { |
| return h('keep-alive', { |
| props: rawChild.componentOptions.propsData |
| }) |
| } |
| } |
| |
| function hasParentTransition (vnode) { |
| while ((vnode = vnode.parent)) { |
| if (vnode.data.transition) { |
| return true |
| } |
| } |
| } |
| |
| function isSameChild (child, oldChild) { |
| return oldChild.key === child.key && oldChild.tag === child.tag |
| } |
| |
| function isAsyncPlaceholder (node) { |
| return node.isComment && node.asyncFactory |
| } |
| |
| var Transition$1 = { |
| name: 'transition', |
| props: transitionProps, |
| abstract: true, |
| |
| render: function render (h) { |
| var this$1 = this; |
| |
| var children = this.$options._renderChildren; |
| if (!children) { |
| return |
| } |
| |
| // filter out text nodes (possible whitespaces) |
| children = children.filter(function (c) { return c.tag || isAsyncPlaceholder(c); }); |
| /* istanbul ignore if */ |
| if (!children.length) { |
| return |
| } |
| |
| // warn multiple elements |
| if ("development" !== 'production' && children.length > 1) { |
| warn( |
| '<transition> can only be used on a single element. Use ' + |
| '<transition-group> for lists.', |
| this.$parent |
| ); |
| } |
| |
| var mode = this.mode; |
| |
| // warn invalid mode |
| if ("development" !== 'production' && |
| mode && mode !== 'in-out' && mode !== 'out-in' |
| ) { |
| warn( |
| 'invalid <transition> mode: ' + mode, |
| this.$parent |
| ); |
| } |
| |
| var rawChild = children[0]; |
| |
| // if this is a component root node and the component's |
| // parent container node also has transition, skip. |
| if (hasParentTransition(this.$vnode)) { |
| return rawChild |
| } |
| |
| // apply transition data to child |
| // use getRealChild() to ignore abstract components e.g. keep-alive |
| var child = getRealChild(rawChild); |
| /* istanbul ignore if */ |
| if (!child) { |
| return rawChild |
| } |
| |
| if (this._leaving) { |
| return placeholder(h, rawChild) |
| } |
| |
| // ensure a key that is unique to the vnode type and to this transition |
| // component instance. This key will be used to remove pending leaving nodes |
| // during entering. |
| var id = "__transition-" + (this._uid) + "-"; |
| child.key = child.key == null |
| ? child.isComment |
| ? id + 'comment' |
| : id + child.tag |
| : isPrimitive(child.key) |
| ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key) |
| : child.key; |
| |
| var data = (child.data || (child.data = {})).transition = extractTransitionData(this); |
| var oldRawChild = this._vnode; |
| var oldChild = getRealChild(oldRawChild); |
| |
| // mark v-show |
| // so that the transition module can hand over the control to the directive |
| if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) { |
| child.data.show = true; |
| } |
| |
| if ( |
| oldChild && |
| oldChild.data && |
| !isSameChild(child, oldChild) && |
| !isAsyncPlaceholder(oldChild) |
| ) { |
| // replace old child transition data with fresh one |
| // important for dynamic transitions! |
| var oldData = oldChild && (oldChild.data.transition = extend({}, data)); |
| // handle transition mode |
| if (mode === 'out-in') { |
| // return placeholder node and queue update when leave finishes |
| this._leaving = true; |
| mergeVNodeHook(oldData, 'afterLeave', function () { |
| this$1._leaving = false; |
| this$1.$forceUpdate(); |
| }); |
| return placeholder(h, rawChild) |
| } else if (mode === 'in-out') { |
| if (isAsyncPlaceholder(child)) { |
| return oldRawChild |
| } |
| var delayedLeave; |
| var performLeave = function () { delayedLeave(); }; |
| mergeVNodeHook(data, 'afterEnter', performLeave); |
| mergeVNodeHook(data, 'enterCancelled', performLeave); |
| mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; }); |
| } |
| } |
| |
| return rawChild |
| } |
| }; |
| |
| // reuse same transition component logic from web |
| |
| var props = extend({ |
| tag: String, |
| moveClass: String |
| }, transitionProps); |
| |
| delete props.mode; |
| |
| var TransitionGroup = { |
| props: props, |
| |
| created: function created () { |
| var dom = this.$requireWeexModule('dom'); |
| this.getPosition = function (el) { return new Promise(function (resolve, reject) { |
| dom.getComponentRect(el.ref, function (res) { |
| if (!res.result) { |
| reject(new Error(("failed to get rect for element: " + (el.tag)))); |
| } else { |
| resolve(res.size); |
| } |
| }); |
| }); }; |
| |
| var animation = this.$requireWeexModule('animation'); |
| this.animate = function (el, options) { return new Promise(function (resolve) { |
| animation.transition(el.ref, options, resolve); |
| }); }; |
| }, |
| |
| render: function render (h) { |
| var tag = this.tag || this.$vnode.data.tag || 'span'; |
| var map = Object.create(null); |
| var prevChildren = this.prevChildren = this.children; |
| var rawChildren = this.$slots.default || []; |
| var children = this.children = []; |
| var transitionData = extractTransitionData(this); |
| |
| for (var i = 0; i < rawChildren.length; i++) { |
| var c = rawChildren[i]; |
| if (c.tag) { |
| if (c.key != null && String(c.key).indexOf('__vlist') !== 0) { |
| children.push(c); |
| map[c.key] = c |
| ;(c.data || (c.data = {})).transition = transitionData; |
| } else { |
| var opts = c.componentOptions; |
| var name = opts |
| ? (opts.Ctor.options.name || opts.tag) |
| : c.tag; |
| warn(("<transition-group> children must be keyed: <" + name + ">")); |
| } |
| } |
| } |
| |
| if (prevChildren) { |
| var kept = []; |
| var removed = []; |
| prevChildren.forEach(function (c) { |
| c.data.transition = transitionData; |
| |
| // TODO: record before patch positions |
| |
| if (map[c.key]) { |
| kept.push(c); |
| } else { |
| removed.push(c); |
| } |
| }); |
| this.kept = h(tag, null, kept); |
| this.removed = removed; |
| } |
| |
| return h(tag, null, children) |
| }, |
| |
| beforeUpdate: function beforeUpdate () { |
| // force removing pass |
| this.__patch__( |
| this._vnode, |
| this.kept, |
| false, // hydrating |
| true // removeOnly (!important, avoids unnecessary moves) |
| ); |
| this._vnode = this.kept; |
| }, |
| |
| updated: function updated () { |
| var children = this.prevChildren; |
| var moveClass = this.moveClass || ((this.name || 'v') + '-move'); |
| var moveData = children.length && this.getMoveData(children[0].context, moveClass); |
| if (!moveData) { |
| return |
| } |
| |
| // TODO: finish implementing move animations once |
| // we have access to sync getComponentRect() |
| |
| // children.forEach(callPendingCbs) |
| |
| // Promise.all(children.map(c => { |
| // const oldPos = c.data.pos |
| // const newPos = c.data.newPos |
| // const dx = oldPos.left - newPos.left |
| // const dy = oldPos.top - newPos.top |
| // if (dx || dy) { |
| // c.data.moved = true |
| // return this.animate(c.elm, { |
| // styles: { |
| // transform: `translate(${dx}px,${dy}px)` |
| // } |
| // }) |
| // } |
| // })).then(() => { |
| // children.forEach(c => { |
| // if (c.data.moved) { |
| // this.animate(c.elm, { |
| // styles: { |
| // transform: '' |
| // }, |
| // duration: moveData.duration || 0, |
| // delay: moveData.delay || 0, |
| // timingFunction: moveData.timingFunction || 'linear' |
| // }) |
| // } |
| // }) |
| // }) |
| }, |
| |
| methods: { |
| getMoveData: function getMoveData (context, moveClass) { |
| var stylesheet = context.$options.style || {}; |
| return stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][moveClass] |
| } |
| } |
| }; |
| |
| // function callPendingCbs (c) { |
| // /* istanbul ignore if */ |
| // if (c.elm._moveCb) { |
| // c.elm._moveCb() |
| // } |
| // /* istanbul ignore if */ |
| // if (c.elm._enterCb) { |
| // c.elm._enterCb() |
| // } |
| // } |
| |
| var platformComponents = { |
| Richtext: Richtext, |
| Transition: Transition$1, |
| TransitionGroup: TransitionGroup |
| }; |
| |
| /* globals renderer */ |
| |
| var isReservedTag = makeMap( |
| 'template,script,style,element,content,slot,link,meta,svg,view,' + |
| 'a,div,img,image,text,span,input,switch,textarea,spinner,select,' + |
| 'slider,slider-neighbor,indicator,canvas,' + |
| 'list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,' + |
| 'video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown', |
| true |
| ); |
| |
| // Elements that you can, intentionally, leave open (and which close themselves) |
| // more flexable than web |
| var canBeLeftOpenTag = makeMap( |
| 'web,spinner,switch,video,textarea,canvas,' + |
| 'indicator,marquee,countdown', |
| true |
| ); |
| |
| var isRuntimeComponent = makeMap( |
| 'richtext,trisition,trisition-group', |
| true |
| ); |
| |
| var isUnaryTag = makeMap( |
| 'embed,img,image,input,link,meta', |
| true |
| ); |
| |
| function mustUseProp () { /* console.log('mustUseProp') */ } |
| |
| function isUnknownElement () { /* console.log('isUnknownElement') */ } |
| |
| function query (el, document) { |
| // renderer is injected by weex factory wrapper |
| var placeholder = new renderer.Comment('root'); |
| placeholder.hasAttribute = placeholder.removeAttribute = function () {}; // hack for patch |
| document.documentElement.appendChild(placeholder); |
| return placeholder |
| } |
| |
| /* */ |
| |
| // install platform specific utils |
| Vue$2.config.mustUseProp = mustUseProp; |
| Vue$2.config.isReservedTag = isReservedTag; |
| Vue$2.config.isRuntimeComponent = isRuntimeComponent; |
| Vue$2.config.isUnknownElement = isUnknownElement; |
| |
| // install platform runtime directives and components |
| Vue$2.options.directives = platformDirectives; |
| Vue$2.options.components = platformComponents; |
| |
| // install platform patch function |
| Vue$2.prototype.__patch__ = patch; |
| |
| // wrap mount |
| Vue$2.prototype.$mount = function ( |
| el, |
| hydrating |
| ) { |
| return mountComponent( |
| this, |
| el && query(el, this.$document), |
| hydrating |
| ) |
| }; |
| |
| // this entry is built and wrapped with a factory function |
| // used to generate a fresh copy of Vue for every Weex instance. |
| |
| exports.Vue = Vue$2; |
| |
| }; |
| }); |
| |
| var index = createCommonjsModule(function (module, exports) { |
| 'use strict'; |
| |
| Object.defineProperty(exports, '__esModule', { value: true }); |
| |
| var latestNodeId = 1; |
| |
| function TextNode (text) { |
| this.instanceId = ''; |
| this.nodeId = latestNodeId++; |
| this.parentNode = null; |
| this.nodeType = 3; |
| this.text = text; |
| } |
| |
| // this will be preserved during build |
| var VueFactory = factory; |
| |
| var instances = {}; |
| var modules = {}; |
| var components = {}; |
| |
| var renderer = { |
| TextNode: TextNode, |
| instances: instances, |
| modules: modules, |
| components: components |
| }; |
| |
| /** |
| * Prepare framework config, basically about the virtual-DOM and JS bridge. |
| * @param {object} cfg |
| */ |
| function init (cfg) { |
| renderer.Document = cfg.Document; |
| renderer.Element = cfg.Element; |
| renderer.Comment = cfg.Comment; |
| renderer.compileBundle = cfg.compileBundle; |
| } |
| |
| /** |
| * Reset framework config and clear all registrations. |
| */ |
| function reset () { |
| clear(instances); |
| clear(modules); |
| clear(components); |
| delete renderer.Document; |
| delete renderer.Element; |
| delete renderer.Comment; |
| delete renderer.compileBundle; |
| } |
| |
| /** |
| * Delete all keys of an object. |
| * @param {object} obj |
| */ |
| function clear (obj) { |
| for (var key in obj) { |
| delete obj[key]; |
| } |
| } |
| |
| /** |
| * Create an instance with id, code, config and external data. |
| * @param {string} instanceId |
| * @param {string} appCode |
| * @param {object} config |
| * @param {object} data |
| * @param {object} env { info, config, services } |
| */ |
| function createInstance ( |
| instanceId, |
| appCode, |
| config, |
| data, |
| env |
| ) { |
| if ( appCode === void 0 ) { appCode = ''; } |
| if ( config === void 0 ) { config = {}; } |
| if ( env === void 0 ) { env = {}; } |
| |
| // Virtual-DOM object. |
| var document = new renderer.Document(instanceId, config.bundleUrl); |
| |
| var instance = instances[instanceId] = { |
| instanceId: instanceId, config: config, data: data, |
| document: document |
| }; |
| |
| // Prepare native module getter and HTML5 Timer APIs. |
| var moduleGetter = genModuleGetter(instanceId); |
| var timerAPIs = getInstanceTimer(instanceId, moduleGetter); |
| |
| // Prepare `weex` instance variable. |
| var weexInstanceVar = { |
| config: config, |
| document: document, |
| supports: supports, |
| requireModule: moduleGetter |
| }; |
| Object.freeze(weexInstanceVar); |
| |
| // Each instance has a independent `Vue` module instance |
| var Vue = instance.Vue = createVueModuleInstance(instanceId, moduleGetter); |
| |
| // The function which create a closure the JS Bundle will run in. |
| // It will declare some instance variables like `Vue`, HTML5 Timer APIs etc. |
| var instanceVars = Object.assign({ |
| Vue: Vue, |
| weex: weexInstanceVar |
| }, timerAPIs, env.services); |
| |
| appCode = "(function(global){ \n" + appCode + "\n })(Object.create(this))"; |
| |
| if (!callFunctionNative(instanceVars, appCode)) { |
| // If failed to compile functionBody on native side, |
| // fallback to 'callFunction()'. |
| callFunction(instanceVars, appCode); |
| } |
| |
| // Send `createFinish` signal in next tick. |
| timerAPIs.setTimeout(function () { |
| instance.document.taskCenter.send('dom', { action: 'createFinish' }, []); |
| }, 0); |
| |
| return instance |
| } |
| |
| /** |
| * Destroy an instance with id. It will make sure all memory of |
| * this instance released and no more leaks. |
| * @param {string} instanceId |
| */ |
| function destroyInstance (instanceId) { |
| var instance = instances[instanceId]; |
| if (instance && instance.app instanceof instance.Vue) { |
| instance.document.destroy(); |
| instance.app.$destroy(); |
| } |
| delete instances[instanceId]; |
| } |
| |
| /** |
| * Refresh an instance with id and new top-level component data. |
| * It will use `Vue.set` on all keys of the new data. So it's better |
| * define all possible meaningful keys when instance created. |
| * @param {string} instanceId |
| * @param {object} data |
| */ |
| function refreshInstance (instanceId, data) { |
| var instance = instances[instanceId]; |
| if (!instance || !(instance.app instanceof instance.Vue)) { |
| return new Error(("refreshInstance: instance " + instanceId + " not found!")) |
| } |
| for (var key in data) { |
| instance.Vue.set(instance.app, key, data[key]); |
| } |
| // Finally `refreshFinish` signal needed. |
| instance.document.taskCenter.send('dom', { action: 'refreshFinish' }, []); |
| } |
| |
| /** |
| * Get the JSON object of the root element. |
| * @param {string} instanceId |
| */ |
| function getRoot (instanceId) { |
| var instance = instances[instanceId]; |
| if (!instance || !(instance.app instanceof instance.Vue)) { |
| return new Error(("getRoot: instance " + instanceId + " not found!")) |
| } |
| return instance.app.$el.toJSON() |
| } |
| |
| var jsHandlers = { |
| fireEvent: function (id) { |
| var arguments$1 = arguments; |
| |
| var args = [], len = arguments.length - 1; |
| while ( len-- > 0 ) { args[ len ] = arguments$1[ len + 1 ]; } |
| |
| return fireEvent.apply(void 0, [ instances[id] ].concat( args )) |
| }, |
| callback: function (id) { |
| var arguments$1 = arguments; |
| |
| var args = [], len = arguments.length - 1; |
| while ( len-- > 0 ) { args[ len ] = arguments$1[ len + 1 ]; } |
| |
| return callback.apply(void 0, [ instances[id] ].concat( args )) |
| } |
| }; |
| |
| function fireEvent (instance, nodeId, type, e, domChanges) { |
| var el = instance.document.getRef(nodeId); |
| if (el) { |
| return instance.document.fireEvent(el, type, e, domChanges) |
| } |
| return new Error(("invalid element reference \"" + nodeId + "\"")) |
| } |
| |
| function callback (instance, callbackId, data, ifKeepAlive) { |
| var result = instance.document.taskCenter.callback(callbackId, data, ifKeepAlive); |
| instance.document.taskCenter.send('dom', { action: 'updateFinish' }, []); |
| return result |
| } |
| |
| /** |
| * Accept calls from native (event or callback). |
| * |
| * @param {string} id |
| * @param {array} tasks list with `method` and `args` |
| */ |
| function receiveTasks (id, tasks) { |
| var instance = instances[id]; |
| if (instance && Array.isArray(tasks)) { |
| var results = []; |
| tasks.forEach(function (task) { |
| var handler = jsHandlers[task.method]; |
| var args = [].concat( task.args ); |
| /* istanbul ignore else */ |
| if (typeof handler === 'function') { |
| args.unshift(id); |
| results.push(handler.apply(void 0, args)); |
| } |
| }); |
| return results |
| } |
| return new Error(("invalid instance id \"" + id + "\" or tasks")) |
| } |
| |
| /** |
| * Register native modules information. |
| * @param {object} newModules |
| */ |
| function registerModules (newModules) { |
| var loop = function ( name ) { |
| if (!modules[name]) { |
| modules[name] = {}; |
| } |
| newModules[name].forEach(function (method) { |
| if (typeof method === 'string') { |
| modules[name][method] = true; |
| } else { |
| modules[name][method.name] = method.args; |
| } |
| }); |
| }; |
| |
| for (var name in newModules) { loop( name ); } |
| } |
| |
| /** |
| * Check whether the module or the method has been registered. |
| * @param {String} module name |
| * @param {String} method name (optional) |
| */ |
| function isRegisteredModule (name, method) { |
| if (typeof method === 'string') { |
| return !!(modules[name] && modules[name][method]) |
| } |
| return !!modules[name] |
| } |
| |
| /** |
| * Register native components information. |
| * @param {array} newComponents |
| */ |
| function registerComponents (newComponents) { |
| if (Array.isArray(newComponents)) { |
| newComponents.forEach(function (component) { |
| if (!component) { |
| return |
| } |
| if (typeof component === 'string') { |
| components[component] = true; |
| } else if (typeof component === 'object' && typeof component.type === 'string') { |
| components[component.type] = component; |
| } |
| }); |
| } |
| } |
| |
| /** |
| * Check whether the component has been registered. |
| * @param {String} component name |
| */ |
| function isRegisteredComponent (name) { |
| return !!components[name] |
| } |
| |
| /** |
| * Detects whether Weex supports specific features. |
| * @param {String} condition |
| */ |
| function supports (condition) { |
| if (typeof condition !== 'string') { return null } |
| |
| var res = condition.match(/^@(\w+)\/(\w+)(\.(\w+))?$/i); |
| if (res) { |
| var type = res[1]; |
| var name = res[2]; |
| var method = res[4]; |
| switch (type) { |
| case 'module': return isRegisteredModule(name, method) |
| case 'component': return isRegisteredComponent(name) |
| } |
| } |
| |
| return null |
| } |
| |
| /** |
| * Create a fresh instance of Vue for each Weex instance. |
| */ |
| function createVueModuleInstance (instanceId, moduleGetter) { |
| var exports = {}; |
| VueFactory(exports, renderer); |
| var Vue = exports.Vue; |
| |
| var instance = instances[instanceId]; |
| |
| // patch reserved tag detection to account for dynamically registered |
| // components |
| var weexRegex = /^weex:/i; |
| var isReservedTag = Vue.config.isReservedTag || (function () { return false; }); |
| var isRuntimeComponent = Vue.config.isRuntimeComponent || (function () { return false; }); |
| Vue.config.isReservedTag = function (name) { |
| return (!isRuntimeComponent(name) && components[name]) || |
| isReservedTag(name) || |
| weexRegex.test(name) |
| }; |
| Vue.config.parsePlatformTagName = function (name) { return name.replace(weexRegex, ''); }; |
| |
| // expose weex-specific info |
| Vue.prototype.$instanceId = instanceId; |
| Vue.prototype.$document = instance.document; |
| |
| // expose weex native module getter on subVue prototype so that |
| // vdom runtime modules can access native modules via vnode.context |
| Vue.prototype.$requireWeexModule = moduleGetter; |
| |
| // Hack `Vue` behavior to handle instance information and data |
| // before root component created. |
| Vue.mixin({ |
| beforeCreate: function beforeCreate () { |
| var options = this.$options; |
| // root component (vm) |
| if (options.el) { |
| // set external data of instance |
| var dataOption = options.data; |
| var internalData = (typeof dataOption === 'function' ? dataOption() : dataOption) || {}; |
| options.data = Object.assign(internalData, instance.data); |
| // record instance by id |
| instance.app = this; |
| } |
| } |
| }); |
| |
| /** |
| * @deprecated Just instance variable `weex.config` |
| * Get instance config. |
| * @return {object} |
| */ |
| Vue.prototype.$getConfig = function () { |
| if (instance.app instanceof Vue) { |
| return instance.config |
| } |
| }; |
| |
| return Vue |
| } |
| |
| /** |
| * Generate native module getter. Each native module has several |
| * methods to call. And all the behaviors is instance-related. So |
| * this getter will return a set of methods which additionally |
| * send current instance id to native when called. |
| * @param {string} instanceId |
| * @return {function} |
| */ |
| function genModuleGetter (instanceId) { |
| var instance = instances[instanceId]; |
| return function (name) { |
| var nativeModule = modules[name] || []; |
| var output = {}; |
| var loop = function ( methodName ) { |
| Object.defineProperty(output, methodName, { |
| enumerable: true, |
| configurable: true, |
| get: function proxyGetter () { |
| return function () { |
| var arguments$1 = arguments; |
| |
| var args = [], len = arguments.length; |
| while ( len-- ) { args[ len ] = arguments$1[ len ]; } |
| |
| return instance.document.taskCenter.send('module', { module: name, method: methodName }, args) |
| } |
| }, |
| set: function proxySetter (val) { |
| if (typeof val === 'function') { |
| return instance.document.taskCenter.send('module', { module: name, method: methodName }, [val]) |
| } |
| } |
| }); |
| }; |
| |
| for (var methodName in nativeModule) { loop( methodName ); } |
| return output |
| } |
| } |
| |
| /** |
| * Generate HTML5 Timer APIs. An important point is that the callback |
| * will be converted into callback id when sent to native. So the |
| * framework can make sure no side effect of the callback happened after |
| * an instance destroyed. |
| * @param {[type]} instanceId [description] |
| * @param {[type]} moduleGetter [description] |
| * @return {[type]} [description] |
| */ |
| function getInstanceTimer (instanceId, moduleGetter) { |
| var instance = instances[instanceId]; |
| var timer = moduleGetter('timer'); |
| var timerAPIs = { |
| setTimeout: function () { |
| var arguments$1 = arguments; |
| |
| var args = [], len = arguments.length; |
| while ( len-- ) { args[ len ] = arguments$1[ len ]; } |
| |
| var handler = function () { |
| args[0].apply(args, args.slice(2)); |
| }; |
| |
| timer.setTimeout(handler, args[1]); |
| return instance.document.taskCenter.callbackManager.lastCallbackId.toString() |
| }, |
| setInterval: function () { |
| var arguments$1 = arguments; |
| |
| var args = [], len = arguments.length; |
| while ( len-- ) { args[ len ] = arguments$1[ len ]; } |
| |
| var handler = function () { |
| args[0].apply(args, args.slice(2)); |
| }; |
| |
| timer.setInterval(handler, args[1]); |
| return instance.document.taskCenter.callbackManager.lastCallbackId.toString() |
| }, |
| clearTimeout: function (n) { |
| timer.clearTimeout(n); |
| }, |
| clearInterval: function (n) { |
| timer.clearInterval(n); |
| } |
| }; |
| return timerAPIs |
| } |
| |
| /** |
| * Call a new function body with some global objects. |
| * @param {object} globalObjects |
| * @param {string} code |
| * @return {any} |
| */ |
| function callFunction (globalObjects, body) { |
| var globalKeys = []; |
| var globalValues = []; |
| for (var key in globalObjects) { |
| globalKeys.push(key); |
| globalValues.push(globalObjects[key]); |
| } |
| globalKeys.push(body); |
| |
| var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) )); |
| return result.apply(void 0, globalValues) |
| } |
| |
| /** |
| * Call a new function generated on the V8 native side. |
| * |
| * This function helps speed up bundle compiling. Normally, the V8 |
| * engine needs to download, parse, and compile a bundle on every |
| * visit. If 'compileBundle()' is available on native side, |
| * the downloding, parsing, and compiling steps would be skipped. |
| * @param {object} globalObjects |
| * @param {string} body |
| * @return {boolean} |
| */ |
| function callFunctionNative (globalObjects, body) { |
| if (typeof renderer.compileBundle !== 'function') { |
| return false |
| } |
| |
| var fn = void 0; |
| var isNativeCompileOk = false; |
| var script = '(function ('; |
| var globalKeys = []; |
| var globalValues = []; |
| for (var key in globalObjects) { |
| globalKeys.push(key); |
| globalValues.push(globalObjects[key]); |
| } |
| for (var i = 0; i < globalKeys.length - 1; ++i) { |
| script += globalKeys[i]; |
| script += ','; |
| } |
| script += globalKeys[globalKeys.length - 1]; |
| script += ') {'; |
| script += body; |
| script += '} )'; |
| |
| try { |
| var weex = globalObjects.weex || {}; |
| var config = weex.config || {}; |
| fn = renderer.compileBundle(script, |
| config.bundleUrl, |
| config.bundleDigest, |
| config.codeCachePath); |
| if (fn && typeof fn === 'function') { |
| fn.apply(void 0, globalValues); |
| isNativeCompileOk = true; |
| } |
| } catch (e) { |
| console.error(e); |
| } |
| |
| return isNativeCompileOk |
| } |
| |
| exports.init = init; |
| exports.reset = reset; |
| exports.createInstance = createInstance; |
| exports.destroyInstance = destroyInstance; |
| exports.refreshInstance = refreshInstance; |
| exports.getRoot = getRoot; |
| exports.receiveTasks = receiveTasks; |
| exports.registerModules = registerModules; |
| exports.isRegisteredModule = isRegisteredModule; |
| exports.registerComponents = registerComponents; |
| exports.isRegisteredComponent = isRegisteredComponent; |
| exports.supports = supports; |
| }); |
| |
| var index$1 = unwrapExports(index); |
| var supports = index.supports; |
| var isRegisteredComponent = index.isRegisteredComponent; |
| var registerComponents = index.registerComponents; |
| var isRegisteredModule = index.isRegisteredModule; |
| var registerModules = index.registerModules; |
| var receiveTasks$1 = index.receiveTasks; |
| var getRoot$1 = index.getRoot; |
| var refreshInstance = index.refreshInstance; |
| var destroyInstance$1 = index.destroyInstance; |
| var createInstance$2 = index.createInstance; |
| var reset = index.reset; |
| var init$4 = index.init; |
| |
| var Vue = Object.freeze({ |
| default: index$1, |
| __moduleExports: index, |
| supports: supports, |
| isRegisteredComponent: isRegisteredComponent, |
| registerComponents: registerComponents, |
| isRegisteredModule: isRegisteredModule, |
| registerModules: registerModules, |
| receiveTasks: receiveTasks$1, |
| getRoot: getRoot$1, |
| refreshInstance: refreshInstance, |
| destroyInstance: destroyInstance$1, |
| createInstance: createInstance$2, |
| reset: reset, |
| init: init$4 |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview The api for invoking with "$" prefix |
| */ |
| |
| /** |
| * @deprecated use $vm instead |
| * find the vm by id |
| * Note: there is only one id in whole component |
| * @param {string} id |
| * @return {Vm} |
| */ |
| function $ (id) { |
| console.warn('[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead'); |
| var info = this._ids[id]; |
| if (info) { |
| return info.vm |
| } |
| } |
| |
| /** |
| * find the element by id |
| * Note: there is only one id in whole component |
| * @param {string} id |
| * @return {Element} |
| */ |
| function $el (id) { |
| var info = this._ids[id]; |
| if (info) { |
| return info.el |
| } |
| } |
| |
| /** |
| * find the vm of the custom component by id |
| * Note: there is only one id in whole component |
| * @param {string} id |
| * @return {Vm} |
| */ |
| function $vm (id) { |
| var info = this._ids[id]; |
| if (info) { |
| return info.vm |
| } |
| } |
| |
| /** |
| * Fire when differ rendering finished |
| * |
| * @param {Function} fn |
| */ |
| function $renderThen (fn) { |
| var app = this._app; |
| var differ = app.differ; |
| return differ.then(function () { |
| fn(); |
| }) |
| } |
| |
| /** |
| * scroll an element specified by id into view, |
| * moreover specify a number of offset optionally |
| * @param {string} id |
| * @param {number} offset |
| */ |
| function $scrollTo (id, offset) { |
| console.warn('[JS Framework] Vm#$scrollTo is deprecated, ' + |
| 'please use "require(\'@weex-module/dom\')' + |
| '.scrollTo(el, options)" instead'); |
| var el = this.$el(id); |
| if (el) { |
| var dom = this._app.requireModule('dom'); |
| dom.scrollToElement(el.ref, { offset: offset }); |
| } |
| } |
| |
| /** |
| * perform transition animation on an element specified by id |
| * @param {string} id |
| * @param {object} options |
| * @param {object} options.styles |
| * @param {object} options.duration(ms) |
| * @param {object} [options.timingFunction] |
| * @param {object} [options.delay=0(ms)] |
| * @param {Function} callback |
| */ |
| function $transition (id, options, callback) { |
| var this$1 = this; |
| |
| var el = this.$el(id); |
| if (el && options && options.styles) { |
| var animation = this._app.requireModule('animation'); |
| animation.transition(el.ref, options, function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| this$1._setStyle(el, options.styles); |
| callback && callback.apply(void 0, args); |
| }); |
| } |
| } |
| |
| /** |
| * get some config |
| * @return {object} some config for app instance |
| * @property {string} bundleUrl |
| * @property {boolean} debug |
| * @property {object} env |
| * @property {string} env.weexVersion(ex. 1.0.0) |
| * @property {string} env.appName(ex. TB/TM) |
| * @property {string} env.appVersion(ex. 5.0.0) |
| * @property {string} env.platform(ex. iOS/Android) |
| * @property {string} env.osVersion(ex. 7.0.0) |
| * @property {string} env.deviceModel **native only** |
| * @property {number} env.[deviceWidth=750] |
| * @property {number} env.deviceHeight |
| */ |
| function $getConfig (callback) { |
| var config = this._app.options; |
| if (typeof callback === 'function') { |
| console.warn('[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, ' + |
| 'this api now can directly RETURN config info.'); |
| callback(config); |
| } |
| return config |
| } |
| |
| /** |
| * @deprecated |
| * request network via http protocol |
| * @param {object} params |
| * @param {Function} callback |
| */ |
| function $sendHttp (params, callback) { |
| console.warn('[JS Framework] Vm#$sendHttp is deprecated, ' + |
| 'please use "require(\'@weex-module/stream\')' + |
| '.sendHttp(params, callback)" instead'); |
| var stream = this._app.requireModule('stream'); |
| stream.sendHttp(params, callback); |
| } |
| |
| /** |
| * @deprecated |
| * open a url |
| * @param {string} url |
| */ |
| function $openURL (url) { |
| console.warn('[JS Framework] Vm#$openURL is deprecated, ' + |
| 'please use "require(\'@weex-module/event\')' + |
| '.openURL(url)" instead'); |
| var event = this._app.requireModule('event'); |
| event.openURL(url); |
| } |
| |
| /** |
| * @deprecated |
| * set a title for page |
| * @param {string} title |
| */ |
| function $setTitle (title) { |
| console.warn('[JS Framework] Vm#$setTitle is deprecated, ' + |
| 'please use "require(\'@weex-module/pageInfo\')' + |
| '.setTitle(title)" instead'); |
| var pageInfo = this._app.requireModule('pageInfo'); |
| pageInfo.setTitle(title); |
| } |
| |
| /** |
| * @deprecated use "require('@weex-module/moduleName') instead" |
| * invoke a native method by specifing the name of module and method |
| * @param {string} moduleName |
| * @param {string} methodName |
| * @param {...*} the rest arguments |
| */ |
| function $call (moduleName, methodName) { |
| var args = [], len = arguments.length - 2; |
| while ( len-- > 0 ) args[ len ] = arguments[ len + 2 ]; |
| |
| console.warn('[JS Framework] Vm#$call is deprecated, ' + |
| 'please use "require(\'@weex-module/moduleName\')" instead'); |
| var module = this._app.requireModule(moduleName); |
| if (module && module[methodName]) { |
| module[methodName].apply(module, args); |
| } |
| } |
| |
| |
| var methods$1 = Object.freeze({ |
| $: $, |
| $el: $el, |
| $vm: $vm, |
| $renderThen: $renderThen, |
| $scrollTo: $scrollTo, |
| $transition: $transition, |
| $getConfig: $getConfig, |
| $sendHttp: $sendHttp, |
| $openURL: $openURL, |
| $setTitle: $setTitle, |
| $call: $call |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * Mix properties into target object. |
| * |
| * @param {Object} to |
| * @param {Object} from |
| */ |
| |
| function extend (target) { |
| var src = [], len = arguments.length - 1; |
| while ( len-- > 0 ) src[ len ] = arguments[ len + 1 ]; |
| |
| /* istanbul ignore else */ |
| if (typeof Object.assign === 'function') { |
| Object.assign.apply(Object, [ target ].concat( src )); |
| } |
| else { |
| var first = src.shift(); |
| for (var key in first) { |
| target[key] = first[key]; |
| } |
| if (src.length) { |
| extend.apply(void 0, [ target ].concat( src )); |
| } |
| } |
| return target |
| } |
| |
| /** |
| * Define a property. |
| * |
| * @param {Object} obj |
| * @param {String} key |
| * @param {*} val |
| * @param {Boolean} [enumerable] |
| */ |
| |
| function def$1 (obj, key, val, enumerable) { |
| Object.defineProperty(obj, key, { |
| value: val, |
| enumerable: !!enumerable, |
| writable: true, |
| configurable: true |
| }); |
| } |
| |
| /** |
| * Remove an item from an array |
| * |
| * @param {Array} arr |
| * @param {*} item |
| */ |
| |
| function remove$1 (arr, item) { |
| if (arr.length) { |
| var index = arr.indexOf(item); |
| if (index > -1) { |
| return arr.splice(index, 1) |
| } |
| } |
| } |
| |
| /** |
| * Check whether the object has the property. |
| * |
| * @param {Object} obj |
| * @param {String} key |
| * @return {Boolean} |
| */ |
| var hasOwnProperty$1 = Object.prototype.hasOwnProperty; |
| function hasOwn (obj, key) { |
| return hasOwnProperty$1.call(obj, key) |
| } |
| |
| /** |
| * Simple bind, faster than native |
| * |
| * @param {Function} fn |
| * @param {Object} ctx |
| * @return {Function} |
| */ |
| |
| function bind (fn, ctx) { |
| return function (a) { |
| var l = arguments.length; |
| return l |
| ? l > 1 |
| ? fn.apply(ctx, arguments) |
| : fn.call(ctx, a) |
| : fn.call(ctx) |
| } |
| } |
| |
| /** |
| * Convert an Array-like object to a real Array. |
| * |
| * @param {Array-like} list |
| * @param {Number} [start] - start index |
| * @return {Array} |
| */ |
| |
| function toArray (list, start) { |
| start = start || 0; |
| var i = list.length - start; |
| var ret = new Array(i); |
| while (i--) { |
| ret[i] = list[i + start]; |
| } |
| return ret |
| } |
| |
| /** |
| * Quick object check - this is primarily used to tell |
| * Objects from primitive values when we know the value |
| * is a JSON-compliant type. |
| * |
| * @param {*} obj |
| * @return {Boolean} |
| */ |
| |
| function isObject$4 (obj) { |
| return obj !== null && typeof obj === 'object' |
| } |
| |
| /** |
| * Strict object type check. Only returns true |
| * for plain JavaScript objects. |
| * |
| * @param {*} obj |
| * @return {Boolean} |
| */ |
| |
| var toString$2 = Object.prototype.toString; |
| var OBJECT_STRING = '[object Object]'; |
| function isPlainObject (obj) { |
| return toString$2.call(obj) === OBJECT_STRING |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * Check if a string starts with $ or _ |
| * |
| * @param {String} str |
| * @return {Boolean} |
| */ |
| |
| function isReserved (str) { |
| var c = (str + '').charCodeAt(0); |
| return c === 0x24 || c === 0x5F |
| } |
| |
| // can we use __proto__? |
| var hasProto = '__proto__' in {}; |
| |
| var _Set; |
| /* istanbul ignore next */ |
| if (typeof Set !== 'undefined' && Set.toString().match(/native code/)) { |
| // use native Set when available. |
| _Set = Set; |
| } |
| else { |
| // a non-standard Set polyfill that only works with primitive keys. |
| _Set = function () { |
| this.set = Object.create(null); |
| }; |
| _Set.prototype.has = function (key) { |
| return this.set[key] !== undefined |
| }; |
| _Set.prototype.add = function (key) { |
| if (key == null || this.set[key]) { |
| return |
| } |
| this.set[key] = 1; |
| }; |
| _Set.prototype.clear = function () { |
| this.set = Object.create(null); |
| }; |
| } |
| |
| /** |
| * Polyfill in iOS7 by native because the JavaScript polyfill has memory problem. |
| * @return {object} |
| */ |
| |
| function createNewSet () { |
| /* istanbul ignore next */ |
| /* eslint-disable */ |
| if (typeof nativeSet === 'object') { |
| return nativeSet.create() |
| } |
| /* eslint-enable */ |
| return new _Set() |
| } |
| |
| /** |
| * Create a cached version of a pure function. |
| * |
| * @param {Function} fn |
| * @return {Function} |
| */ |
| |
| |
| |
| |
| |
| |
| |
| function typof$1 (v) { |
| var s = Object.prototype.toString.call(v); |
| return s.substring(8, s.length - 1).toLowerCase() |
| } |
| |
| // weex name rules |
| |
| var WEEX_COMPONENT_REG = /^@weex-component\//; |
| var WEEX_MODULE_REG = /^@weex-module\//; |
| var NORMAL_MODULE_REG = /^\.{1,2}\//; |
| var JS_SURFIX_REG = /\.js$/; |
| |
| var isWeexComponent = function (name) { return !!name.match(WEEX_COMPONENT_REG); }; |
| var isWeexModule = function (name) { return !!name.match(WEEX_MODULE_REG); }; |
| var isNormalModule = function (name) { return !!name.match(NORMAL_MODULE_REG); }; |
| var isNpmModule = function (name) { return !isWeexComponent(name) && !isWeexModule(name) && !isNormalModule(name); }; |
| |
| function removeWeexPrefix (str) { |
| var result = str.replace(WEEX_COMPONENT_REG, '').replace(WEEX_MODULE_REG, ''); |
| return result |
| } |
| |
| function removeJSSurfix (str) { |
| return str.replace(JS_SURFIX_REG, '') |
| } |
| |
| /* eslint-disable */ |
| |
| |
| var uid$2 = 0; |
| |
| /** |
| * A dep is an observable that can have multiple |
| * directives subscribing to it. |
| * |
| * @constructor |
| */ |
| |
| function Dep () { |
| this.id = uid$2++; |
| this.subs = []; |
| } |
| |
| // the current target watcher being evaluated. |
| // this is globally unique because there could be only one |
| // watcher being evaluated at any time. |
| Dep.target = null; |
| var targetStack = []; |
| |
| function pushTarget (_target) { |
| if (Dep.target) { targetStack.push(Dep.target); } |
| Dep.target = _target; |
| } |
| |
| function popTarget () { |
| Dep.target = targetStack.pop(); |
| } |
| |
| function resetTarget () { |
| Dep.target = null; |
| targetStack = []; |
| } |
| |
| /** |
| * Add a directive subscriber. |
| * |
| * @param {Directive} sub |
| */ |
| |
| Dep.prototype.addSub = function (sub) { |
| this.subs.push(sub); |
| }; |
| |
| /** |
| * Remove a directive subscriber. |
| * |
| * @param {Directive} sub |
| */ |
| |
| Dep.prototype.removeSub = function (sub) { |
| remove$1(this.subs, sub); |
| }; |
| |
| /** |
| * Add self as a dependency to the target watcher. |
| */ |
| |
| Dep.prototype.depend = function () { |
| if (Dep.target) { |
| Dep.target.addDep(this); |
| } |
| }; |
| |
| /** |
| * Notify all subscribers of a new value. |
| */ |
| |
| Dep.prototype.notify = function () { |
| // stablize the subscriber list first |
| var subs = this.subs.slice(); |
| for (var i = 0, l = subs.length; i < l; i++) { |
| subs[i].update(); |
| } |
| }; |
| |
| /* eslint-disable */ |
| |
| |
| // import { pushWatcher } from './batcher' |
| var uid$1 = 0; |
| |
| /** |
| * A watcher parses an expression, collects dependencies, |
| * and fires callback when the expression value changes. |
| * This is used for both the $watch() api and directives. |
| * |
| * @param {Vue} vm |
| * @param {String|Function} expOrFn |
| * @param {Function} cb |
| * @param {Object} options |
| * - {Array} filters |
| * - {Boolean} twoWay |
| * - {Boolean} deep |
| * - {Boolean} user |
| * - {Boolean} sync |
| * - {Boolean} lazy |
| * - {Function} [preProcess] |
| * - {Function} [postProcess] |
| * @constructor |
| */ |
| |
| function Watcher (vm, expOrFn, cb, options) { |
| // mix in options |
| if (options) { |
| extend(this, options); |
| } |
| var isFn = typeof expOrFn === 'function'; |
| this.vm = vm; |
| vm._watchers.push(this); |
| this.expression = expOrFn; |
| this.cb = cb; |
| this.id = ++uid$1; // uid for batching |
| this.active = true; |
| this.dirty = this.lazy; // for lazy watchers |
| this.deps = []; |
| this.newDeps = []; |
| this.depIds = createNewSet(); // new Set() |
| this.newDepIds = createNewSet(); // new Set() |
| // parse expression for getter |
| if (isFn) { |
| this.getter = expOrFn; |
| } |
| this.value = this.lazy |
| ? undefined |
| : this.get(); |
| // state for avoiding false triggers for deep and Array |
| // watchers during vm._digest() |
| this.queued = this.shallow = false; |
| } |
| |
| /** |
| * Evaluate the getter, and re-collect dependencies. |
| */ |
| |
| Watcher.prototype.get = function () { |
| pushTarget(this); |
| var value = this.getter.call(this.vm, this.vm); |
| // "touch" every property so they are all tracked as |
| // dependencies for deep watching |
| if (this.deep) { |
| traverse(value); |
| } |
| popTarget(); |
| this.cleanupDeps(); |
| return value |
| }; |
| |
| /** |
| * Add a dependency to this directive. |
| * |
| * @param {Dep} dep |
| */ |
| |
| Watcher.prototype.addDep = function (dep) { |
| var id = dep.id; |
| if (!this.newDepIds.has(id)) { |
| this.newDepIds.add(id); |
| this.newDeps.push(dep); |
| if (!this.depIds.has(id)) { |
| dep.addSub(this); |
| } |
| } |
| }; |
| |
| /** |
| * Clean up for dependency collection. |
| */ |
| |
| Watcher.prototype.cleanupDeps = function () { |
| var this$1 = this; |
| |
| var i = this.deps.length; |
| while (i--) { |
| var dep = this$1.deps[i]; |
| if (!this$1.newDepIds.has(dep.id)) { |
| dep.removeSub(this$1); |
| } |
| } |
| var tmp = this.depIds; |
| this.depIds = this.newDepIds; |
| this.newDepIds = tmp; |
| this.newDepIds.clear(); |
| tmp = this.deps; |
| this.deps = this.newDeps; |
| this.newDeps = tmp; |
| this.newDeps.length = 0; |
| }; |
| |
| /** |
| * Subscriber interface. |
| * Will be called when a dependency changes. |
| * |
| * @param {Boolean} shallow |
| */ |
| |
| Watcher.prototype.update = function (shallow) { |
| if (this.lazy) { |
| this.dirty = true; |
| } else { |
| this.run(); |
| } |
| // } else if (this.sync) { |
| // this.run() |
| // } else { |
| // // if queued, only overwrite shallow with non-shallow, |
| // // but not the other way around. |
| // this.shallow = this.queued |
| // ? shallow |
| // ? this.shallow |
| // : false |
| // : !!shallow |
| // this.queued = true |
| // pushWatcher(this) |
| // } |
| }; |
| |
| /** |
| * Batcher job interface. |
| * Will be called by the batcher. |
| */ |
| |
| Watcher.prototype.run = function () { |
| if (this.active) { |
| var value = this.get(); |
| if ( |
| value !== this.value || |
| // Deep watchers and watchers on Object/Arrays should fire even |
| // when the value is the same, because the value may |
| // have mutated; but only do so if this is a |
| // non-shallow update (caused by a vm digest). |
| ((isObject$4(value) || this.deep) && !this.shallow) |
| ) { |
| // set new value |
| var oldValue = this.value; |
| this.value = value; |
| this.cb.call(this.vm, value, oldValue); |
| } |
| this.queued = this.shallow = false; |
| } |
| }; |
| |
| /** |
| * Evaluate the value of the watcher. |
| * This only gets called for lazy watchers. |
| */ |
| |
| Watcher.prototype.evaluate = function () { |
| this.value = this.get(); |
| this.dirty = false; |
| }; |
| |
| /** |
| * Depend on all deps collected by this watcher. |
| */ |
| |
| Watcher.prototype.depend = function () { |
| var this$1 = this; |
| |
| var i = this.deps.length; |
| while (i--) { |
| this$1.deps[i].depend(); |
| } |
| }; |
| |
| /** |
| * Remove self from all dependencies' subcriber list. |
| */ |
| |
| Watcher.prototype.teardown = function () { |
| var this$1 = this; |
| |
| if (this.active) { |
| // remove self from vm's watcher list |
| // this is a somewhat expensive operation so we skip it |
| // if the vm is being destroyed or is performing a v-for |
| // re-render (the watcher list is then filtered by v-for). |
| if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) { |
| remove$1(this.vm._watchers, this); |
| } |
| var i = this.deps.length; |
| while (i--) { |
| this$1.deps[i].removeSub(this$1); |
| } |
| this.active = false; |
| this.vm = this.cb = this.value = null; |
| } |
| }; |
| |
| /** |
| * Recrusively traverse an object to evoke all converted |
| * getters, so that every nested property inside the object |
| * is collected as a "deep" dependency. |
| * |
| * @param {*} val |
| * @param {Set} seen |
| */ |
| |
| var seenObjects = createNewSet(); // new Set() |
| /* istanbul ignore next */ |
| function traverse (val, seen) { |
| var i, keys, isA, isO; |
| if (!seen) { |
| seen = seenObjects; |
| seen.clear(); |
| } |
| isA = Array.isArray(val); |
| isO = isObject$4(val); |
| if (isA || isO) { |
| if (val.__ob__) { |
| var depId = val.__ob__.dep.id; |
| if (seen.has(depId)) { |
| return |
| } else { |
| seen.add(depId); |
| } |
| } |
| if (isA) { |
| i = val.length; |
| while (i--) { traverse(val[i], seen); } |
| } else if (isO) { |
| keys = Object.keys(val); |
| i = keys.length; |
| while (i--) { traverse(val[keys[i]], seen); } |
| } |
| } |
| } |
| |
| /* eslint-disable */ |
| |
| |
| var arrayProto = Array.prototype; |
| var arrayMethods = Object.create(arrayProto);[ |
| 'push', |
| 'pop', |
| 'shift', |
| 'unshift', |
| 'splice', |
| 'sort', |
| 'reverse' |
| ] |
| .forEach(function (method) { |
| // cache original method |
| var original = arrayProto[method]; |
| def$1(arrayMethods, method, function mutator () { |
| var arguments$1 = arguments; |
| |
| // avoid leaking arguments: |
| // http://jsperf.com/closure-with-arguments |
| var i = arguments.length; |
| var args = new Array(i); |
| while (i--) { |
| args[i] = arguments$1[i]; |
| } |
| var result = original.apply(this, args); |
| var ob = this.__ob__; |
| var inserted; |
| switch (method) { |
| case 'push': |
| inserted = args; |
| break |
| case 'unshift': |
| inserted = args; |
| break |
| case 'splice': |
| inserted = args.slice(2); |
| break |
| } |
| if (inserted) { ob.observeArray(inserted); } |
| // notify change |
| ob.dep.notify(); |
| return result |
| }); |
| }); |
| |
| /** |
| * Swap the element at the given index with a new value |
| * and emits corresponding event. |
| * |
| * @param {Number} index |
| * @param {*} val |
| * @return {*} - replaced element |
| */ |
| |
| def$1( |
| arrayProto, |
| '$set', |
| function $set (index, val) { |
| console.warn("[JS Framework] \"Array.prototype.$set\" is not a standard API," |
| + " it will be removed in the next version."); |
| if (index >= this.length) { |
| this.length = index + 1; |
| } |
| return this.splice(index, 1, val)[0] |
| } |
| ); |
| |
| /** |
| * Convenience method to remove the element at given index. |
| * |
| * @param {Number} index |
| * @param {*} val |
| */ |
| |
| def$1( |
| arrayProto, |
| '$remove', |
| function $remove (index) { |
| console.warn("[JS Framework] \"Array.prototype.$remove\" is not a standard API," |
| + " it will be removed in the next version."); |
| /* istanbul ignore if */ |
| if (!this.length) { return } |
| /* istanbul ignore else */ |
| if (typeof index !== 'number') { |
| index = this.indexOf(index); |
| } |
| /* istanbul ignore else */ |
| if (index > -1) { |
| this.splice(index, 1); |
| } |
| } |
| ); |
| |
| /* eslint-disable */ |
| |
| |
| var arrayKeys = Object.getOwnPropertyNames(arrayMethods); |
| |
| /** |
| * Observer class that are attached to each observed |
| * object. Once attached, the observer converts target |
| * object's property keys into getter/setters that |
| * collect dependencies and dispatches updates. |
| * |
| * @param {Array|Object} value |
| * @constructor |
| */ |
| |
| function Observer$1 (value) { |
| this.value = value; |
| this.dep = new Dep(); |
| def$1(value, '__ob__', this); |
| if (Array.isArray(value)) { |
| var augment = hasProto |
| ? protoAugment |
| : copyAugment; |
| augment(value, arrayMethods, arrayKeys); |
| this.observeArray(value); |
| } else { |
| this.walk(value); |
| } |
| } |
| |
| // Instance methods |
| |
| /** |
| * Walk through each property and convert them into |
| * getter/setters. This method should only be called when |
| * value type is Object. |
| * |
| * @param {Object} obj |
| */ |
| |
| Observer$1.prototype.walk = function (obj) { |
| var this$1 = this; |
| |
| for (var key in obj) { |
| this$1.convert(key, obj[key]); |
| } |
| }; |
| |
| /** |
| * Observe a list of Array items. |
| * |
| * @param {Array} items |
| */ |
| |
| Observer$1.prototype.observeArray = function (items) { |
| for (var i = 0, l = items.length; i < l; i++) { |
| observe(items[i]); |
| } |
| }; |
| |
| /** |
| * Convert a property into getter/setter so we can emit |
| * the events when the property is accessed/changed. |
| * |
| * @param {String} key |
| * @param {*} val |
| */ |
| |
| Observer$1.prototype.convert = function (key, val) { |
| defineReactive(this.value, key, val); |
| }; |
| |
| /** |
| * Add an owner vm, so that when $set/$delete mutations |
| * happen we can notify owner vms to proxy the keys and |
| * digest the watchers. This is only called when the object |
| * is observed as an instance's root $data. |
| * |
| * @param {Vue} vm |
| */ |
| |
| Observer$1.prototype.addVm = function (vm) { |
| (this.vms || (this.vms = [])).push(vm); |
| }; |
| |
| /** |
| * Remove an owner vm. This is called when the object is |
| * swapped out as an instance's $data object. |
| * |
| * @param {Vue} vm |
| */ |
| |
| /* istanbul ignore next */ |
| Observer$1.prototype.removeVm = function (vm) { |
| remove$1(this.vms, vm); |
| }; |
| |
| // helpers |
| |
| /** |
| * Augment an target Object or Array by intercepting |
| * the prototype chain using __proto__ |
| * |
| * @param {Object|Array} target |
| * @param {Object} src |
| */ |
| |
| function protoAugment (target, src) { |
| /* eslint-disable no-proto */ |
| target.__proto__ = src; |
| /* eslint-enable no-proto */ |
| } |
| |
| /** |
| * Augment an target Object or Array by defining |
| * hidden properties. |
| * |
| * @param {Object|Array} target |
| * @param {Object} proto |
| */ |
| |
| /* istanbul ignore next */ |
| function copyAugment (target, src, keys) { |
| for (var i = 0, l = keys.length; i < l; i++) { |
| var key = keys[i]; |
| def$1(target, key, src[key]); |
| } |
| } |
| |
| /** |
| * Attempt to create an observer instance for a value, |
| * returns the new observer if successfully observed, |
| * or the existing observer if the value already has one. |
| * |
| * @param {*} value |
| * @param {Vue} [vm] |
| * @return {Observer|undefined} |
| * @static |
| */ |
| |
| function observe (value, vm) { |
| if (!isObject$4(value)) { |
| return |
| } |
| var ob; |
| if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer$1) { |
| ob = value.__ob__; |
| } else if ( |
| (Array.isArray(value) || isPlainObject(value)) && |
| Object.isExtensible(value) && |
| !value._isVue |
| ) { |
| ob = new Observer$1(value); |
| } |
| if (ob && vm) { |
| ob.addVm(vm); |
| } |
| return ob |
| } |
| |
| /** |
| * Define a reactive property on an Object. |
| * |
| * @param {Object} obj |
| * @param {String} key |
| * @param {*} val |
| */ |
| |
| function defineReactive (obj, key, val) { |
| var dep = new Dep(); |
| |
| var property = Object.getOwnPropertyDescriptor(obj, key); |
| if (property && property.configurable === false) { |
| return |
| } |
| |
| // cater for pre-defined getter/setters |
| var getter = property && property.get; |
| var setter = property && property.set; |
| |
| var childOb = observe(val); |
| Object.defineProperty(obj, key, { |
| enumerable: true, |
| configurable: true, |
| get: function reactiveGetter () { |
| var value = getter ? getter.call(obj) : val; |
| if (Dep.target) { |
| dep.depend(); |
| if (childOb) { |
| childOb.dep.depend(); |
| } |
| if (Array.isArray(value)) { |
| for (var e = (void 0), i = 0, l = value.length; i < l; i++) { |
| e = value[i]; |
| e && e.__ob__ && e.__ob__.dep.depend(); |
| } |
| } |
| } |
| return value |
| }, |
| set: function reactiveSetter (newVal) { |
| var value = getter ? getter.call(obj) : val; |
| if (newVal === value) { |
| return |
| } |
| if (setter) { |
| setter.call(obj, newVal); |
| } else { |
| val = newVal; |
| } |
| childOb = observe(newVal); |
| dep.notify(); |
| } |
| }); |
| } |
| |
| /** |
| * Set a property on an object. Adds the new property and |
| * triggers change notification if the property doesn't |
| * already exist. |
| * |
| * @param {Object} obj |
| * @param {String} key |
| * @param {*} val |
| * @public |
| */ |
| |
| /* istanbul ignore next */ |
| function set$1 (obj, key, val) { |
| if (Array.isArray(obj)) { |
| return obj.splice(key, 1, val) |
| } |
| if (hasOwn(obj, key)) { |
| obj[key] = val; |
| return |
| } |
| if (obj._isVue) { |
| set$1(obj._data, key, val); |
| return |
| } |
| var ob = obj.__ob__; |
| if (!ob) { |
| obj[key] = val; |
| return |
| } |
| ob.convert(key, val); |
| ob.dep.notify(); |
| if (ob.vms) { |
| var i = ob.vms.length; |
| while (i--) { |
| var vm = ob.vms[i]; |
| proxy(vm, key); |
| // vm.$forceUpdate() |
| } |
| } |
| return val |
| } |
| |
| /** |
| * Delete a property and trigger change if necessary. |
| * |
| * @param {Object} obj |
| * @param {String} key |
| */ |
| |
| /* istanbul ignore next */ |
| function del (obj, key) { |
| if (!hasOwn(obj, key)) { |
| return |
| } |
| delete obj[key]; |
| var ob = obj.__ob__; |
| |
| if (!ob) { |
| if (obj._isVue) { |
| delete obj._data[key]; |
| // obj.$forceUpdate() |
| } |
| return |
| } |
| ob.dep.notify(); |
| if (ob.vms) { |
| var i = ob.vms.length; |
| while (i--) { |
| var vm = ob.vms[i]; |
| unproxy(vm, key); |
| // vm.$forceUpdate() |
| } |
| } |
| } |
| |
| var KEY_WORDS = ['$index', '$value', '$event']; |
| function proxy (vm, key) { |
| if (KEY_WORDS.indexOf(key) > -1 || !isReserved(key)) { |
| Object.defineProperty(vm, key, { |
| configurable: true, |
| enumerable: true, |
| get: function proxyGetter () { |
| return vm._data[key] |
| }, |
| set: function proxySetter (val) { |
| vm._data[key] = val; |
| } |
| }); |
| } |
| } |
| |
| /* istanbul ignore next */ |
| function unproxy (vm, key) { |
| if (!isReserved(key)) { |
| delete vm[key]; |
| } |
| } |
| |
| /* eslint-disable */ |
| |
| |
| function initState (vm) { |
| vm._watchers = []; |
| initData(vm); |
| initComputed(vm); |
| initMethods(vm); |
| } |
| |
| function initData (vm) { |
| var data = vm._data; |
| |
| if (!isPlainObject(data)) { |
| data = {}; |
| } |
| // proxy data on instance |
| var keys = Object.keys(data); |
| var i = keys.length; |
| while (i--) { |
| proxy(vm, keys[i]); |
| } |
| // observe data |
| observe(data, vm); |
| } |
| |
| /* istanbul ignore next */ |
| function noop$1 () { |
| } |
| |
| function initComputed (vm) { |
| var computed = vm._computed; |
| if (computed) { |
| for (var key in computed) { |
| var userDef = computed[key]; |
| var def$$1 = { |
| enumerable: true, |
| configurable: true |
| }; |
| if (typeof userDef === 'function') { |
| def$$1.get = makeComputedGetter(userDef, vm); |
| def$$1.set = noop$1; |
| } else { |
| def$$1.get = userDef.get |
| ? userDef.cache !== false |
| ? makeComputedGetter(userDef.get, vm) |
| : bind(userDef.get, vm) |
| : noop$1; |
| def$$1.set = userDef.set |
| ? bind(userDef.set, vm) |
| : noop$1; |
| } |
| Object.defineProperty(vm, key, def$$1); |
| } |
| } |
| } |
| |
| function makeComputedGetter (getter, owner) { |
| var watcher = new Watcher(owner, getter, null, { |
| lazy: true |
| }); |
| return function computedGetter () { |
| if (watcher.dirty) { |
| watcher.evaluate(); |
| } |
| if (Dep.target) { |
| watcher.depend(); |
| } |
| return watcher.value |
| } |
| } |
| |
| function initMethods (vm) { |
| var methods = vm._methods; |
| if (methods) { |
| for (var key in methods) { |
| vm[key] = methods[key]; |
| } |
| } |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // @todo: It should be registered by native from `registerComponents()`. |
| |
| var config$3 = { |
| nativeComponentMap: { |
| text: true, |
| image: true, |
| container: true, |
| slider: { |
| type: 'slider', |
| append: 'tree' |
| }, |
| cell: { |
| type: 'cell', |
| append: 'tree' |
| } |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * Directive Parser |
| */ |
| |
| var nativeComponentMap = config$3.nativeComponentMap; |
| |
| var SETTERS = { |
| attr: 'setAttr', |
| style: 'setStyle', |
| event: 'addEvent' |
| }; |
| |
| /** |
| * apply the native component's options(specified by template.type) |
| * to the template |
| */ |
| function applyNaitveComponentOptions (template) { |
| var type = template.type; |
| var options = nativeComponentMap[type]; |
| |
| if (typeof options === 'object') { |
| for (var key in options) { |
| if (template[key] == null) { |
| template[key] = options[key]; |
| } |
| else if (typof$1(template[key]) === 'object' && |
| typof$1(options[key]) === 'object') { |
| for (var subkey in options[key]) { |
| if (template[key][subkey] == null) { |
| template[key][subkey] = options[key][subkey]; |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * bind all id, attr, classnames, style, events to an element |
| */ |
| function bindElement (vm, el, template) { |
| setId(vm, el, template.id, vm); |
| setAttr$1(vm, el, template.attr); |
| setClass(vm, el, template.classList); |
| setStyle$1(vm, el, template.style); |
| bindEvents$1(vm, el, template.events); |
| } |
| |
| /** |
| * bind all props to sub vm and bind all style, events to the root element |
| * of the sub vm if it doesn't have a replaced multi-node fragment |
| */ |
| function bindSubVm (vm, subVm, template, repeatItem) { |
| subVm = subVm || {}; |
| template = template || {}; |
| |
| var options = subVm._options || {}; |
| |
| // bind props |
| var props = options.props; |
| |
| if (Array.isArray(props)) { |
| props = props.reduce(function (result, value) { |
| result[value] = true; |
| return result |
| }, {}); |
| } |
| |
| mergeProps(repeatItem, props, vm, subVm); |
| mergeProps(template.attr, props, vm, subVm); |
| } |
| |
| /** |
| * merge class and styles from vm to sub vm. |
| */ |
| function bindSubVmAfterInitialized (vm, subVm, template, target) { |
| if ( target === void 0 ) target = {}; |
| |
| mergeClassStyle(template.classList, vm, subVm); |
| mergeStyle(template.style, vm, subVm); |
| |
| // bind subVm to the target element |
| if (target.children) { |
| target.children[target.children.length - 1]._vm = subVm; |
| } |
| else { |
| target._vm = subVm; |
| } |
| } |
| |
| /** |
| * Bind props from vm to sub vm and watch their updates. |
| */ |
| function mergeProps (target, props, vm, subVm) { |
| if (!target) { |
| return |
| } |
| var loop = function ( key ) { |
| if (!props || props[key]) { |
| var value = target[key]; |
| if (typeof value === 'function') { |
| var returnValue = watch(vm, value, function (v) { |
| subVm[key] = v; |
| }); |
| subVm[key] = returnValue; |
| } |
| else { |
| subVm[key] = value; |
| } |
| } |
| }; |
| |
| for (var key in target) loop( key ); |
| } |
| |
| /** |
| * Bind style from vm to sub vm and watch their updates. |
| */ |
| function mergeStyle (target, vm, subVm) { |
| var loop = function ( key ) { |
| var value = target[key]; |
| if (typeof value === 'function') { |
| var returnValue = watch(vm, value, function (v) { |
| if (subVm._rootEl) { |
| subVm._rootEl.setStyle(key, v); |
| } |
| }); |
| subVm._rootEl.setStyle(key, returnValue); |
| } |
| else { |
| if (subVm._rootEl) { |
| subVm._rootEl.setStyle(key, value); |
| } |
| } |
| }; |
| |
| for (var key in target) loop( key ); |
| } |
| |
| /** |
| * Bind class & style from vm to sub vm and watch their updates. |
| */ |
| function mergeClassStyle (target, vm, subVm) { |
| var css = vm._options && vm._options.style || {}; |
| |
| /* istanbul ignore if */ |
| if (!subVm._rootEl) { |
| return |
| } |
| |
| var className = '@originalRootEl'; |
| css[className] = subVm._rootEl.classStyle; |
| |
| function addClassName (list, name) { |
| if (typof$1(list) === 'array') { |
| list.unshift(name); |
| } |
| } |
| |
| if (typeof target === 'function') { |
| var value = watch(vm, target, function (v) { |
| addClassName(v, className); |
| setClassStyle$1(subVm._rootEl, css, v); |
| }); |
| addClassName(value, className); |
| setClassStyle$1(subVm._rootEl, css, value); |
| } |
| else if (target != null) { |
| addClassName(target, className); |
| setClassStyle$1(subVm._rootEl, css, target); |
| } |
| } |
| |
| /** |
| * bind id to an element |
| * each id is unique in a whole vm |
| */ |
| function setId (vm, el, id, target) { |
| var map = Object.create(null); |
| |
| Object.defineProperties(map, { |
| vm: { |
| value: target, |
| writable: false, |
| configurable: false |
| }, |
| el: { |
| get: function () { return el || target._rootEl; }, |
| configurable: false |
| } |
| }); |
| |
| if (typeof id === 'function') { |
| var handler = id; |
| id = handler.call(vm); |
| if (id || id === 0) { |
| vm._ids[id] = map; |
| } |
| watch(vm, handler, function (newId) { |
| if (newId) { |
| vm._ids[newId] = map; |
| } |
| }); |
| } |
| else if (id && typeof id === 'string') { |
| vm._ids[id] = map; |
| } |
| } |
| |
| /** |
| * bind attr to an element |
| */ |
| function setAttr$1 (vm, el, attr) { |
| bindDir(vm, el, 'attr', attr); |
| } |
| |
| function setClassStyle$1 (el, css, classList) { |
| if (typeof classList === 'string') { |
| classList = classList.split(/\s+/); |
| } |
| classList.forEach(function (name, i) { |
| classList.splice.apply(classList, [ i, 1 ].concat( name.split(/\s+/) )); |
| }); |
| var classStyle = {}; |
| var length = classList.length; |
| |
| var loop = function ( i ) { |
| var style = css[classList[i]]; |
| if (style) { |
| Object.keys(style).forEach(function (key) { |
| classStyle[key] = style[key]; |
| }); |
| } |
| }; |
| |
| for (var i = 0; i < length; i++) loop( i ); |
| el.setClassStyle(classStyle); |
| } |
| |
| /** |
| * bind classnames to an element |
| */ |
| function setClass (vm, el, classList) { |
| if (typeof classList !== 'function' && !Array.isArray(classList)) { |
| return |
| } |
| if (Array.isArray(classList) && !classList.length) { |
| el.setClassStyle({}); |
| return |
| } |
| |
| var style = vm._options && vm._options.style || {}; |
| if (typeof classList === 'function') { |
| var value = watch(vm, classList, function (v) { |
| setClassStyle$1(el, style, v); |
| }); |
| setClassStyle$1(el, style, value); |
| } |
| else { |
| setClassStyle$1(el, style, classList); |
| } |
| } |
| |
| /** |
| * bind style to an element |
| */ |
| function setStyle$1 (vm, el, style) { |
| bindDir(vm, el, 'style', style); |
| } |
| |
| /** |
| * add an event type and handler to an element and generate a dom update |
| */ |
| function setEvent (vm, el, type, handler) { |
| el.addEvent(type, bind(handler, vm)); |
| } |
| |
| /** |
| * add all events of an element |
| */ |
| function bindEvents$1 (vm, el, events) { |
| if (!events) { |
| return |
| } |
| var keys = Object.keys(events); |
| var i = keys.length; |
| while (i--) { |
| var key = keys[i]; |
| var handler = events[key]; |
| if (typeof handler === 'string') { |
| handler = vm[handler]; |
| /* istanbul ignore if */ |
| if (!handler) { |
| console.warn(("[JS Framework] The event handler \"" + handler + "\" is not defined.")); |
| } |
| } |
| setEvent(vm, el, key, handler); |
| } |
| } |
| |
| /** |
| * set a series of members as a kind of an element |
| * for example: style, attr, ... |
| * if the value is a function then bind the data changes |
| */ |
| function bindDir (vm, el, name, data) { |
| if (!data) { |
| return |
| } |
| var keys = Object.keys(data); |
| var i = keys.length; |
| while (i--) { |
| var key = keys[i]; |
| var value = data[key]; |
| if (typeof value === 'function') { |
| bindKey(vm, el, name, key, value); |
| } |
| else { |
| el[SETTERS[name]](key, value); |
| } |
| } |
| } |
| |
| /** |
| * bind data changes to a certain key to a name series in an element |
| */ |
| function bindKey (vm, el, name, key, calc) { |
| var methodName = SETTERS[name]; |
| // watch the calc, and returns a value by calc.call() |
| var value = watch(vm, calc, function (value) { |
| function handler () { |
| el[methodName](key, value); |
| } |
| var differ = vm && vm._app && vm._app.differ; |
| if (differ) { |
| differ.append('element', el.depth, el.ref, handler); |
| } |
| else { |
| handler(); |
| } |
| }); |
| |
| el[methodName](key, value); |
| } |
| |
| /** |
| * watch a calc function and callback if the calc value changes |
| */ |
| function watch (vm, calc, callback) { |
| if (vm._static) { |
| return calc.call(vm, vm) |
| } |
| var watcher = new Watcher(vm, calc, function (value, oldValue) { |
| /* istanbul ignore if */ |
| if (typeof value !== 'object' && value === oldValue) { |
| return |
| } |
| callback(value); |
| }); |
| |
| return watcher.value |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview Document & Element Helpers. |
| * |
| * required: |
| * Document#: createElement, createComment, getRef |
| * Element#: appendChild, insertBefore, removeChild, nextSibling |
| */ |
| |
| /** |
| * Create a body by type |
| * Using this._app.doc |
| * |
| * @param {string} type |
| */ |
| function createBody$1 (vm, type) { |
| var doc = vm._app.doc; |
| return doc.createBody(type) |
| } |
| |
| /** |
| * Create an element by type |
| * Using this._app.doc |
| * |
| * @param {string} type |
| */ |
| function createElement$1 (vm, type) { |
| var doc = vm._app.doc; |
| return doc.createElement(type) |
| } |
| |
| /** |
| * Create and return a frag block for an element. |
| * The frag block has a starter, ender and the element itself. |
| * |
| * @param {object} element |
| */ |
| function createBlock (vm, element) { |
| var start = createBlockStart(vm); |
| var end = createBlockEnd(vm); |
| var blockId = lastestBlockId++; |
| if (element.element) { |
| var updateMark = element.updateMark; |
| if (updateMark) { |
| if (updateMark.element) { |
| updateMark = updateMark.end; |
| } |
| element.element.insertAfter(end, updateMark); |
| element.element.insertAfter(start, updateMark); |
| element.updateMark = end; |
| } |
| else { |
| element.element.insertBefore(start, element.end); |
| element.element.insertBefore(end, element.end); |
| } |
| element = element.element; |
| } |
| else { |
| element.appendChild(start); |
| element.appendChild(end); |
| } |
| return { start: start, end: end, element: element, blockId: blockId } |
| } |
| |
| var lastestBlockId = 1; |
| |
| /** |
| * Create and return a block starter. |
| * Using this._app.doc |
| */ |
| function createBlockStart (vm) { |
| var doc = vm._app.doc; |
| var anchor = doc.createComment('start'); |
| return anchor |
| } |
| |
| /** |
| * Create and return a block ender. |
| * Using this._app.doc |
| */ |
| function createBlockEnd (vm) { |
| var doc = vm._app.doc; |
| var anchor = doc.createComment('end'); |
| return anchor |
| } |
| |
| /** |
| * Attach target to a certain dest using appendChild by default. |
| * If the dest is a frag block then insert before the ender. |
| * If the target is a frag block then attach the starter and ender in order. |
| * |
| * @param {object} target |
| * @param {object} dest |
| */ |
| function attachTarget (vm, target, dest) { |
| if (dest.element) { |
| var before = dest.end; |
| var after = dest.updateMark; |
| // push new target for watch list update later |
| if (dest.children) { |
| dest.children.push(target); |
| } |
| // for check repeat case |
| if (after) { |
| var signal = moveTarget(vm, target, after); |
| dest.updateMark = target.element ? target.end : target; |
| return signal |
| } |
| else if (target.element) { |
| dest.element.insertBefore(target.start, before); |
| dest.element.insertBefore(target.end, before); |
| } |
| else { |
| return dest.element.insertBefore(target, before) |
| } |
| } |
| else { |
| if (target.element) { |
| dest.appendChild(target.start); |
| dest.appendChild(target.end); |
| } |
| else { |
| return dest.appendChild(target) |
| } |
| } |
| } |
| |
| /** |
| * Move target before a certain element. The target maybe block or element. |
| * |
| * @param {object} target |
| * @param {object} before |
| */ |
| function moveTarget (vm, target, after) { |
| if (target.element) { |
| return moveBlock(target, after) |
| } |
| return moveElement$1(target, after) |
| } |
| |
| /** |
| * Move element before a certain element. |
| * |
| * @param {object} element |
| * @param {object} before |
| */ |
| function moveElement$1 (element, after) { |
| var parent = after.parentNode; |
| if (parent) { |
| return parent.insertAfter(element, after) |
| } |
| } |
| |
| /** |
| * Move all elements of the block before a certain element. |
| * |
| * @param {object} fragBlock |
| * @param {object} before |
| */ |
| function moveBlock (fragBlock, after) { |
| var parent = after.parentNode; |
| |
| if (parent) { |
| var el = fragBlock.start; |
| var signal; |
| var group = [el]; |
| |
| while (el && el !== fragBlock.end) { |
| el = el.nextSibling; |
| group.push(el); |
| } |
| |
| var temp = after; |
| group.every(function (el) { |
| signal = parent.insertAfter(el, temp); |
| temp = el; |
| return signal !== -1 |
| }); |
| |
| return signal |
| } |
| } |
| |
| /** |
| * Remove target from DOM tree. |
| * If the target is a frag block then call _removeBlock |
| * |
| * @param {object} target |
| */ |
| function removeTarget (vm, target, preserveBlock) { |
| if ( preserveBlock === void 0 ) preserveBlock = false; |
| |
| if (target.element) { |
| removeBlock(target, preserveBlock); |
| } |
| else { |
| removeElement$1(target); |
| } |
| if (target._vm) { |
| target._vm.$emit('hook:destroyed'); |
| } |
| } |
| |
| /** |
| * Remove a certain element. |
| * Using this._app.doc |
| * |
| * @param {object} target |
| */ |
| function removeElement$1 (target) { |
| var parent = target.parentNode; |
| |
| if (parent) { |
| parent.removeChild(target); |
| } |
| } |
| |
| /** |
| * Remove a frag block. |
| * The second param decides whether the block self should be removed too. |
| * |
| * @param {object} fragBlock |
| * @param {Boolean} preserveBlock=false |
| */ |
| function removeBlock (fragBlock, preserveBlock) { |
| if ( preserveBlock === void 0 ) preserveBlock = false; |
| |
| var result = []; |
| var el = fragBlock.start.nextSibling; |
| |
| while (el && el !== fragBlock.end) { |
| result.push(el); |
| el = el.nextSibling; |
| } |
| |
| if (!preserveBlock) { |
| removeElement$1(fragBlock.start); |
| } |
| result.forEach(function (el) { |
| removeElement$1(el); |
| }); |
| if (!preserveBlock) { |
| removeElement$1(fragBlock.end); |
| } |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * ViewModel template parser & data-binding process |
| */ |
| |
| /** |
| * build() |
| * compile(template, parentNode) |
| * if (type is content) create contentNode |
| * else if (dirs have v-for) foreach -> create context |
| * -> compile(templateWithoutFor, parentNode): diff(list) onchange |
| * else if (dirs have v-if) assert |
| * -> compile(templateWithoutIf, parentNode): toggle(shown) onchange |
| * else if (type is dynamic) |
| * -> compile(templateWithoutDynamicType, parentNode): watch(type) onchange |
| * else if (type is custom) |
| * addChildVm(vm, parentVm) |
| * build(externalDirs) |
| * foreach childNodes -> compile(childNode, template) |
| * else if (type is native) |
| * set(dirs): update(id/attr/style/class) onchange |
| * append(template, parentNode) |
| * foreach childNodes -> compile(childNode, template) |
| */ |
| function build (vm) { |
| var opt = vm._options || {}; |
| var template = opt.template || {}; |
| |
| if (opt.replace) { |
| if (template.children && template.children.length === 1) { |
| compile(vm, template.children[0], vm._parentEl); |
| } |
| else { |
| compile(vm, template.children, vm._parentEl); |
| } |
| } |
| else { |
| compile(vm, template, vm._parentEl); |
| } |
| |
| console.debug(("[JS Framework] \"ready\" lifecycle in Vm(" + (vm._type) + ")")); |
| vm.$emit('hook:ready'); |
| vm._ready = true; |
| } |
| |
| /** |
| * Generate elements by child or children and append to parent elements. |
| * Root element info would be merged if has. The first argument may be an array |
| * if the root element with options.replace has not only one child. |
| * |
| * @param {object|array} target |
| * @param {object} dest |
| * @param {object} meta |
| */ |
| function compile (vm, target, dest, meta) { |
| var app = vm._app || {}; |
| |
| if (app.lastSignal === -1) { |
| return |
| } |
| |
| if (target.attr && target.attr.hasOwnProperty('static')) { |
| vm._static = true; |
| } |
| |
| if (targetIsFragment(target)) { |
| compileFragment(vm, target, dest, meta); |
| return |
| } |
| meta = meta || {}; |
| if (targetIsContent(target)) { |
| console.debug('[JS Framework] compile "content" block by', target); |
| vm._content = createBlock(vm, dest); |
| return |
| } |
| |
| if (targetNeedCheckRepeat(target, meta)) { |
| console.debug('[JS Framework] compile "repeat" logic by', target); |
| if (dest.type === 'document') { |
| console.warn('[JS Framework] The root element does\'t support `repeat` directive!'); |
| } |
| else { |
| compileRepeat(vm, target, dest); |
| } |
| return |
| } |
| if (targetNeedCheckShown(target, meta)) { |
| console.debug('[JS Framework] compile "if" logic by', target); |
| if (dest.type === 'document') { |
| console.warn('[JS Framework] The root element does\'t support `if` directive!'); |
| } |
| else { |
| compileShown(vm, target, dest, meta); |
| } |
| return |
| } |
| var typeGetter = meta.type || target.type; |
| if (targetNeedCheckType(typeGetter, meta)) { |
| compileType(vm, target, dest, typeGetter, meta); |
| return |
| } |
| var type = typeGetter; |
| var component = targetIsComposed(vm, target, type); |
| if (component) { |
| console.debug('[JS Framework] compile composed component by', target); |
| compileCustomComponent(vm, component, target, dest, type, meta); |
| return |
| } |
| console.debug('[JS Framework] compile native component by', target); |
| compileNativeComponent(vm, target, dest, type); |
| } |
| |
| /** |
| * Check if target is a fragment (an array). |
| * |
| * @param {object} target |
| * @return {boolean} |
| */ |
| function targetIsFragment (target) { |
| return Array.isArray(target) |
| } |
| |
| /** |
| * Check if target type is content/slot. |
| * |
| * @param {object} target |
| * @return {boolean} |
| */ |
| function targetIsContent (target) { |
| return target.type === 'content' || target.type === 'slot' |
| } |
| |
| /** |
| * Check if target need to compile by a list. |
| * |
| * @param {object} target |
| * @param {object} meta |
| * @return {boolean} |
| */ |
| function targetNeedCheckRepeat (target, meta) { |
| return !meta.hasOwnProperty('repeat') && target.repeat |
| } |
| |
| /** |
| * Check if target need to compile by a boolean value. |
| * |
| * @param {object} target |
| * @param {object} meta |
| * @return {boolean} |
| */ |
| function targetNeedCheckShown (target, meta) { |
| return !meta.hasOwnProperty('shown') && target.shown |
| } |
| |
| /** |
| * Check if target need to compile by a dynamic type. |
| * |
| * @param {string|function} typeGetter |
| * @param {object} meta |
| * @return {boolean} |
| */ |
| function targetNeedCheckType (typeGetter, meta) { |
| return (typeof typeGetter === 'function') && !meta.hasOwnProperty('type') |
| } |
| |
| /** |
| * Check if this kind of component is composed. |
| * |
| * @param {string} type |
| * @return {boolean} |
| */ |
| function targetIsComposed (vm, target, type) { |
| var component; |
| if (vm._app && vm._app.customComponentMap) { |
| component = vm._app.customComponentMap[type]; |
| } |
| if (vm._options && vm._options.components) { |
| component = vm._options.components[type]; |
| } |
| if (target.component) { |
| component = component || {}; |
| } |
| return component |
| } |
| |
| /** |
| * Compile a list of targets. |
| * |
| * @param {object} target |
| * @param {object} dest |
| * @param {object} meta |
| */ |
| function compileFragment (vm, target, dest, meta) { |
| var fragBlock = createBlock(vm, dest); |
| target.forEach(function (child) { |
| compile(vm, child, fragBlock, meta); |
| }); |
| } |
| |
| /** |
| * Compile a target with repeat directive. |
| * |
| * @param {object} target |
| * @param {object} dest |
| */ |
| function compileRepeat (vm, target, dest) { |
| var repeat = target.repeat; |
| var oldStyle = typeof repeat === 'function'; |
| var getter = repeat.getter || repeat.expression || repeat; |
| if (typeof getter !== 'function') { |
| getter = function () { return [] }; |
| } |
| var key = repeat.key || '$index'; |
| var value = repeat.value || '$value'; |
| var trackBy = repeat.trackBy || target.trackBy || |
| (target.attr && target.attr.trackBy); |
| |
| var fragBlock = createBlock(vm, dest); |
| fragBlock.children = []; |
| fragBlock.data = []; |
| fragBlock.vms = []; |
| |
| bindRepeat(vm, target, fragBlock, { getter: getter, key: key, value: value, trackBy: trackBy, oldStyle: oldStyle }); |
| } |
| |
| /** |
| * Compile a target with if directive. |
| * |
| * @param {object} target |
| * @param {object} dest |
| * @param {object} meta |
| */ |
| function compileShown (vm, target, dest, meta) { |
| var newMeta = { shown: true }; |
| var fragBlock = createBlock(vm, dest); |
| |
| if (dest.element && dest.children) { |
| dest.children.push(fragBlock); |
| } |
| |
| if (meta.repeat) { |
| newMeta.repeat = meta.repeat; |
| } |
| |
| bindShown(vm, target, fragBlock, newMeta); |
| } |
| |
| /** |
| * Compile a target with dynamic component type. |
| * |
| * @param {object} target |
| * @param {object} dest |
| * @param {function} typeGetter |
| */ |
| function compileType (vm, target, dest, typeGetter, meta) { |
| var type = typeGetter.call(vm); |
| var newMeta = extend({ type: type }, meta); |
| var fragBlock = createBlock(vm, dest); |
| |
| if (dest.element && dest.children) { |
| dest.children.push(fragBlock); |
| } |
| |
| watch(vm, typeGetter, function (value) { |
| var newMeta = extend({ type: value }, meta); |
| removeTarget(vm, fragBlock, true); |
| compile(vm, target, fragBlock, newMeta); |
| }); |
| |
| compile(vm, target, fragBlock, newMeta); |
| } |
| |
| /** |
| * Compile a composed component. |
| * |
| * @param {object} target |
| * @param {object} dest |
| * @param {string} type |
| */ |
| function compileCustomComponent (vm, component, target, dest, type, meta) { |
| var Ctor = vm.constructor; |
| var subVm = new Ctor(type, component, vm, dest, undefined, { |
| 'hook:init': function () { |
| if (vm._static) { |
| this._static = vm._static; |
| } |
| setId(vm, null, target.id, this); |
| // bind template earlier because of lifecycle issues |
| this._externalBinding = { |
| parent: vm, |
| template: target |
| }; |
| }, |
| 'hook:created': function () { |
| bindSubVm(vm, this, target, meta.repeat); |
| }, |
| 'hook:ready': function () { |
| if (this._content) { |
| compileChildren(vm, target, this._content); |
| } |
| } |
| }); |
| bindSubVmAfterInitialized(vm, subVm, target, dest); |
| } |
| |
| /** |
| * Generate element from template and attach to the dest if needed. |
| * The time to attach depends on whether the mode status is node or tree. |
| * |
| * @param {object} template |
| * @param {object} dest |
| * @param {string} type |
| */ |
| function compileNativeComponent (vm, template, dest, type) { |
| applyNaitveComponentOptions(template); |
| |
| var element; |
| if (dest.ref === '_documentElement') { |
| // if its parent is documentElement then it's a body |
| console.debug(("[JS Framework] compile to create body for " + type)); |
| element = createBody$1(vm, type); |
| } |
| else { |
| console.debug(("[JS Framework] compile to create element for " + type)); |
| element = createElement$1(vm, type); |
| } |
| |
| if (!vm._rootEl) { |
| vm._rootEl = element; |
| // bind event earlier because of lifecycle issues |
| var binding = vm._externalBinding || {}; |
| var target = binding.template; |
| var parentVm = binding.parent; |
| if (target && target.events && parentVm && element) { |
| for (var type$1 in target.events) { |
| var handler = parentVm[target.events[type$1]]; |
| if (handler) { |
| element.addEvent(type$1, bind(handler, parentVm)); |
| } |
| } |
| } |
| } |
| |
| bindElement(vm, element, template); |
| |
| if (template.attr && template.attr.append) { // backward, append prop in attr |
| template.append = template.attr.append; |
| } |
| |
| if (template.append) { // give the append attribute for ios adaptation |
| element.attr = element.attr || {}; |
| element.attr.append = template.append; |
| } |
| |
| var treeMode = template.append === 'tree'; |
| var app = vm._app || {}; |
| if (app.lastSignal !== -1 && !treeMode) { |
| console.debug('[JS Framework] compile to append single node for', element); |
| app.lastSignal = attachTarget(vm, element, dest); |
| } |
| if (app.lastSignal !== -1) { |
| compileChildren(vm, template, element); |
| } |
| if (app.lastSignal !== -1 && treeMode) { |
| console.debug('[JS Framework] compile to append whole tree for', element); |
| app.lastSignal = attachTarget(vm, element, dest); |
| } |
| } |
| |
| /** |
| * Set all children to a certain parent element. |
| * |
| * @param {object} template |
| * @param {object} dest |
| */ |
| function compileChildren (vm, template, dest) { |
| var app = vm._app || {}; |
| var children = template.children; |
| if (children && children.length) { |
| children.every(function (child) { |
| compile(vm, child, dest); |
| return app.lastSignal !== -1 |
| }); |
| } |
| } |
| |
| /** |
| * Watch the list update and refresh the changes. |
| * |
| * @param {object} target |
| * @param {object} fragBlock {vms, data, children} |
| * @param {object} info {getter, key, value, trackBy, oldStyle} |
| */ |
| function bindRepeat (vm, target, fragBlock, info) { |
| var vms = fragBlock.vms; |
| var children = fragBlock.children; |
| var getter = info.getter; |
| var trackBy = info.trackBy; |
| var oldStyle = info.oldStyle; |
| var keyName = info.key; |
| var valueName = info.value; |
| |
| function compileItem (item, index, context) { |
| var mergedData; |
| if (oldStyle) { |
| mergedData = item; |
| if (isObject$4(item)) { |
| mergedData[keyName] = index; |
| if (!mergedData.hasOwnProperty('INDEX')) { |
| Object.defineProperty(mergedData, 'INDEX', { |
| value: function () { |
| console.warn('[JS Framework] "INDEX" in repeat is deprecated, ' + |
| 'please use "$index" instead'); |
| } |
| }); |
| } |
| } |
| else { |
| console.warn('[JS Framework] Each list item must be an object in old-style repeat, ' |
| + 'please use `repeat={{v in list}}` instead.'); |
| mergedData = {}; |
| mergedData[keyName] = index; |
| mergedData[valueName] = item; |
| } |
| } |
| else { |
| mergedData = {}; |
| mergedData[keyName] = index; |
| mergedData[valueName] = item; |
| } |
| var newContext = mergeContext(context, mergedData); |
| vms.push(newContext); |
| compile(newContext, target, fragBlock, { repeat: item }); |
| } |
| |
| var list = watchBlock(vm, fragBlock, getter, 'repeat', |
| function (data) { |
| console.debug('[JS Framework] the "repeat" item has changed', data); |
| if (!fragBlock || !data) { |
| return |
| } |
| |
| var oldChildren = children.slice(); |
| var oldVms = vms.slice(); |
| var oldData = fragBlock.data.slice(); |
| // 1. collect all new refs track by |
| var trackMap = {}; |
| var reusedMap = {}; |
| data.forEach(function (item, index) { |
| var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index); |
| /* istanbul ignore if */ |
| if (key == null || key === '') { |
| return |
| } |
| trackMap[key] = item; |
| }); |
| |
| // 2. remove unused element foreach old item |
| var reusedList = []; |
| oldData.forEach(function (item, index) { |
| var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index); |
| if (trackMap.hasOwnProperty(key)) { |
| reusedMap[key] = { |
| item: item, index: index, key: key, |
| target: oldChildren[index], |
| vm: oldVms[index] |
| }; |
| reusedList.push(item); |
| } |
| else { |
| removeTarget(vm, oldChildren[index]); |
| } |
| }); |
| |
| // 3. create new element foreach new item |
| children.length = 0; |
| vms.length = 0; |
| fragBlock.data = data.slice(); |
| fragBlock.updateMark = fragBlock.start; |
| |
| data.forEach(function (item, index) { |
| var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index); |
| var reused = reusedMap[key]; |
| if (reused) { |
| if (reused.item === reusedList[0]) { |
| reusedList.shift(); |
| } |
| else { |
| reusedList.$remove(reused.item); |
| moveTarget(vm, reused.target, fragBlock.updateMark, true); |
| } |
| children.push(reused.target); |
| vms.push(reused.vm); |
| if (oldStyle) { |
| reused.vm = item; |
| } |
| else { |
| reused.vm[valueName] = item; |
| } |
| reused.vm[keyName] = index; |
| fragBlock.updateMark = reused.target; |
| } |
| else { |
| compileItem(item, index, vm); |
| } |
| }); |
| |
| delete fragBlock.updateMark; |
| } |
| ); |
| |
| fragBlock.data = list.slice(0); |
| list.forEach(function (item, index) { |
| compileItem(item, index, vm); |
| }); |
| } |
| |
| /** |
| * Watch the display update and add/remove the element. |
| * |
| * @param {object} target |
| * @param {object} fragBlock |
| * @param {object} context |
| */ |
| function bindShown (vm, target, fragBlock, meta) { |
| var display = watchBlock(vm, fragBlock, target.shown, 'shown', |
| function (display) { |
| console.debug('[JS Framework] the "if" item was changed', display); |
| |
| if (!fragBlock || !!fragBlock.display === !!display) { |
| return |
| } |
| fragBlock.display = !!display; |
| if (display) { |
| compile(vm, target, fragBlock, meta); |
| } |
| else { |
| removeTarget(vm, fragBlock, true); |
| } |
| } |
| ); |
| |
| fragBlock.display = !!display; |
| if (display) { |
| compile(vm, target, fragBlock, meta); |
| } |
| } |
| |
| /** |
| * Watch calc value changes and append certain type action to differ. |
| * It is used for if or repeat data-binding generator. |
| * |
| * @param {object} fragBlock |
| * @param {function} calc |
| * @param {string} type |
| * @param {function} handler |
| * @return {any} init value of calc |
| */ |
| function watchBlock (vm, fragBlock, calc, type, handler) { |
| var differ = vm && vm._app && vm._app.differ; |
| var config = {}; |
| var depth = (fragBlock.element.depth || 0) + 1; |
| |
| return watch(vm, calc, function (value) { |
| config.latestValue = value; |
| if (differ && !config.recorded) { |
| differ.append(type, depth, fragBlock.blockId, function () { |
| var latestValue = config.latestValue; |
| handler(latestValue); |
| config.recorded = false; |
| config.latestValue = undefined; |
| }); |
| } |
| config.recorded = true; |
| }) |
| } |
| |
| /** |
| * Clone a context and merge certain data. |
| * |
| * @param {object} mergedData |
| * @return {object} |
| */ |
| function mergeContext (context, mergedData) { |
| var newContext = Object.create(context); |
| newContext._data = mergedData; |
| initData(newContext); |
| initComputed(newContext); |
| newContext._realParent = context; |
| if (context._static) { |
| newContext._static = context._static; |
| } |
| return newContext |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * Everything about component event which includes event object, event listener, |
| * event emitter and lifecycle hooks. |
| */ |
| |
| /** |
| * Event object definition. An event object has `type`, `timestamp` and |
| * `detail` from which a component emit. The event object could be dispatched to |
| * parents or broadcasted to children except `this.stop()` is called. |
| * @param {string} type |
| * @param {any} detail |
| */ |
| function Evt (type, detail) { |
| if (detail instanceof Evt) { |
| return detail |
| } |
| |
| this.timestamp = Date.now(); |
| this.detail = detail; |
| this.type = type; |
| |
| var shouldStop = false; |
| |
| /** |
| * stop dispatch and broadcast |
| */ |
| this.stop = function () { |
| shouldStop = true; |
| }; |
| |
| /** |
| * check if it can't be dispatched or broadcasted |
| */ |
| this.hasStopped = function () { |
| return shouldStop |
| }; |
| } |
| |
| /** |
| * Emit an event but not broadcast down or dispatch up. |
| * @param {string} type |
| * @param {any} detail |
| */ |
| function $emit (type, detail) { |
| var this$1 = this; |
| |
| var events = this._vmEvents; |
| var handlerList = events[type]; |
| if (handlerList) { |
| var evt = new Evt(type, detail); |
| handlerList.forEach(function (handler) { |
| handler.call(this$1, evt); |
| }); |
| } |
| } |
| |
| /** |
| * Emit an event and dispatch it up. |
| * @param {string} type |
| * @param {any} detail |
| */ |
| function $dispatch (type, detail) { |
| var evt = new Evt(type, detail); |
| this.$emit(type, evt); |
| |
| if (!evt.hasStopped() && this._parent && this._parent.$dispatch) { |
| this._parent.$dispatch(type, evt); |
| } |
| } |
| |
| /** |
| * Emit an event and broadcast it down. |
| * @param {string} type |
| * @param {any} detail |
| */ |
| function $broadcast (type, detail) { |
| var evt = new Evt(type, detail); |
| this.$emit(type, evt); |
| |
| if (!evt.hasStopped() && this._childrenVms) { |
| this._childrenVms.forEach(function (subVm) { |
| subVm.$broadcast(type, evt); |
| }); |
| } |
| } |
| |
| /** |
| * Add event listener. |
| * @param {string} type |
| * @param {function} handler |
| */ |
| function $on (type, handler) { |
| if (!type || typeof handler !== 'function') { |
| return |
| } |
| var events = this._vmEvents; |
| var handlerList = events[type] || []; |
| handlerList.push(handler); |
| events[type] = handlerList; |
| |
| // fixed old version lifecycle design |
| /* istanbul ignore if */ |
| if (type === 'hook:ready' && this._ready) { |
| this.$emit('hook:ready'); |
| } |
| } |
| |
| /** |
| * Remove event listener. |
| * @param {string} type |
| * @param {function} handler |
| */ |
| function $off (type, handler) { |
| if (!type) { |
| return |
| } |
| var events = this._vmEvents; |
| if (!handler) { |
| delete events[type]; |
| return |
| } |
| var handlerList = events[type]; |
| if (!handlerList) { |
| return |
| } |
| handlerList.$remove(handler); |
| } |
| |
| var LIFE_CYCLE_TYPES = ['init', 'created', 'ready', 'destroyed']; |
| |
| /** |
| * Init events: |
| * 1. listen `events` in component options & `externalEvents`. |
| * 2. bind lifecycle hooks. |
| * @param {Vm} vm |
| * @param {object} externalEvents |
| */ |
| function initEvents (vm, externalEvents) { |
| var options = vm._options || {}; |
| var events = options.events || {}; |
| for (var type1 in events) { |
| vm.$on(type1, events[type1]); |
| } |
| for (var type2 in externalEvents) { |
| vm.$on(type2, externalEvents[type2]); |
| } |
| LIFE_CYCLE_TYPES.forEach(function (type) { |
| vm.$on(("hook:" + type), options[type]); |
| }); |
| } |
| |
| /** |
| * Bind event related methods to ViewModel instance. |
| * @param {Vm} vm |
| */ |
| function mixinEvents (vm) { |
| vm.$emit = $emit; |
| vm.$dispatch = $dispatch; |
| vm.$broadcast = $broadcast; |
| vm.$on = $on; |
| vm.$off = $off; |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * ViewModel Constructor & definition |
| */ |
| |
| /** |
| * ViewModel constructor |
| * |
| * @param {string} type |
| * @param {object} options component options |
| * @param {object} parentVm which contains _app |
| * @param {object} parentEl root element or frag block |
| * @param {object} mergedData external data |
| * @param {object} externalEvents external events |
| */ |
| function Vm ( |
| type, |
| options, |
| parentVm, |
| parentEl, |
| mergedData, |
| externalEvents |
| ) { |
| parentVm = parentVm || {}; |
| this._parent = parentVm._realParent ? parentVm._realParent : parentVm; |
| this._app = parentVm._app || {}; |
| parentVm._childrenVms && parentVm._childrenVms.push(this); |
| |
| if (!options && this._app.customComponentMap) { |
| options = this._app.customComponentMap[type]; |
| } |
| options = options || {}; |
| |
| var data = options.data || {}; |
| |
| this._options = options; |
| this._methods = options.methods || {}; |
| this._computed = options.computed || {}; |
| this._css = options.style || {}; |
| this._ids = {}; |
| this._vmEvents = {}; |
| this._childrenVms = []; |
| this._type = type; |
| |
| // bind events and lifecycles |
| initEvents(this, externalEvents); |
| |
| console.debug(("[JS Framework] \"init\" lifecycle in Vm(" + (this._type) + ")")); |
| this.$emit('hook:init'); |
| this._inited = true; |
| |
| // proxy data and methods |
| // observe data and add this to vms |
| this._data = typeof data === 'function' ? data() : data; |
| if (mergedData) { |
| extend(this._data, mergedData); |
| } |
| initState(this); |
| |
| console.debug(("[JS Framework] \"created\" lifecycle in Vm(" + (this._type) + ")")); |
| this.$emit('hook:created'); |
| this._created = true; |
| |
| // backward old ready entry |
| if (options.methods && options.methods.ready) { |
| console.warn('"exports.methods.ready" is deprecated, ' + |
| 'please use "exports.created" instead'); |
| options.methods.ready.call(this); |
| } |
| |
| if (!this._app.doc) { |
| return |
| } |
| |
| // if no parentElement then specify the documentElement |
| this._parentEl = parentEl || this._app.doc.documentElement; |
| build(this); |
| } |
| |
| mixinEvents(Vm.prototype); |
| |
| /** |
| * Watch an function and bind all the data appeared in it. When the related |
| * data changes, the callback will be called with new value as 1st param. |
| * |
| * @param {Function} fn |
| * @param {Function} callback |
| */ |
| Vm.prototype.$watch = function (fn, callback) { |
| watch(this, fn, callback); |
| }; |
| |
| Vm.set = set$1; |
| Vm.delete = del; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var nativeModules = {}; |
| |
| // for testing |
| |
| /** |
| * for testing |
| */ |
| |
| |
| /** |
| * for testing |
| */ |
| |
| |
| // for framework |
| |
| /** |
| * init modules for an app instance |
| * the second param determines whether to replace an existed method |
| */ |
| function initModules (modules, ifReplace) { |
| var loop = function ( moduleName ) { |
| // init `modules[moduleName][]` |
| var methods = nativeModules[moduleName]; |
| if (!methods) { |
| methods = {}; |
| nativeModules[moduleName] = methods; |
| } |
| |
| // push each non-existed new method |
| modules[moduleName].forEach(function (method) { |
| if (typeof method === 'string') { |
| method = { |
| name: method |
| }; |
| } |
| |
| if (!methods[method.name] || ifReplace) { |
| methods[method.name] = method; |
| } |
| }); |
| }; |
| |
| for (var moduleName in modules) loop( moduleName ); |
| } |
| |
| /** |
| * init app methods |
| */ |
| function initMethods$1 (Vm, apis) { |
| var p = Vm.prototype; |
| |
| for (var apiName in apis) { |
| if (!p.hasOwnProperty(apiName)) { |
| p[apiName] = apis[apiName]; |
| } |
| } |
| } |
| |
| /** |
| * get a module of methods for an app instance |
| */ |
| function requireModule (app, name) { |
| var methods = nativeModules[name]; |
| var target = {}; |
| var loop = function ( methodName ) { |
| Object.defineProperty(target, methodName, { |
| configurable: true, |
| enumerable: true, |
| get: function moduleGetter () { |
| return function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| return app.callTasks({ |
| module: name, |
| method: methodName, |
| args: args |
| }); |
| } |
| }, |
| set: function moduleSetter (value) { |
| if (typeof value === 'function') { |
| return app.callTasks({ |
| module: name, |
| method: methodName, |
| args: [value] |
| }) |
| } |
| } |
| }); |
| }; |
| |
| for (var methodName in methods) loop( methodName ); |
| return target |
| } |
| |
| /** |
| * get a custom component options |
| */ |
| function requireCustomComponent (app, name) { |
| var customComponentMap = app.customComponentMap; |
| return customComponentMap[name] |
| } |
| |
| /** |
| * register a custom component options |
| */ |
| function registerCustomComponent (app, name, def) { |
| var customComponentMap = app.customComponentMap; |
| |
| if (customComponentMap[name]) { |
| console.error(("[JS Framework] define a component(" + name + ") that already exists")); |
| return |
| } |
| |
| customComponentMap[name] = def; |
| } |
| |
| var semver = createCommonjsModule(function (module, exports) { |
| exports = module.exports = SemVer; |
| |
| // The debug function is excluded entirely from the minified version. |
| /* nomin */ var debug; |
| /* nomin */ if (typeof process === 'object' && |
| /* nomin */ process.env && |
| /* nomin */ false && |
| /* nomin */ /\bsemver\b/i.test(false)) |
| /* nomin */ { debug = function() { |
| /* nomin */ var args = Array.prototype.slice.call(arguments, 0); |
| /* nomin */ args.unshift('SEMVER'); |
| /* nomin */ console.log.apply(console, args); |
| /* nomin */ }; } |
| /* nomin */ else |
| /* nomin */ { debug = function() {}; } |
| |
| // Note: this is the semver.org version of the spec that it implements |
| // Not necessarily the package version of this code. |
| exports.SEMVER_SPEC_VERSION = '2.0.0'; |
| |
| var MAX_LENGTH = 256; |
| var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; |
| |
| // The actual regexps go on exports.re |
| var re = exports.re = []; |
| var src = exports.src = []; |
| var R = 0; |
| |
| // The following Regular Expressions can be used for tokenizing, |
| // validating, and parsing SemVer version strings. |
| |
| // ## Numeric Identifier |
| // A single `0`, or a non-zero digit followed by zero or more digits. |
| |
| var NUMERICIDENTIFIER = R++; |
| src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; |
| var NUMERICIDENTIFIERLOOSE = R++; |
| src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; |
| |
| |
| // ## Non-numeric Identifier |
| // Zero or more digits, followed by a letter or hyphen, and then zero or |
| // more letters, digits, or hyphens. |
| |
| var NONNUMERICIDENTIFIER = R++; |
| src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; |
| |
| |
| // ## Main Version |
| // Three dot-separated numeric identifiers. |
| |
| var MAINVERSION = R++; |
| src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + |
| '(' + src[NUMERICIDENTIFIER] + ')\\.' + |
| '(' + src[NUMERICIDENTIFIER] + ')'; |
| |
| var MAINVERSIONLOOSE = R++; |
| src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + |
| '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + |
| '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; |
| |
| // ## Pre-release Version Identifier |
| // A numeric identifier, or a non-numeric identifier. |
| |
| var PRERELEASEIDENTIFIER = R++; |
| src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + |
| '|' + src[NONNUMERICIDENTIFIER] + ')'; |
| |
| var PRERELEASEIDENTIFIERLOOSE = R++; |
| src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + |
| '|' + src[NONNUMERICIDENTIFIER] + ')'; |
| |
| |
| // ## Pre-release Version |
| // Hyphen, followed by one or more dot-separated pre-release version |
| // identifiers. |
| |
| var PRERELEASE = R++; |
| src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + |
| '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; |
| |
| var PRERELEASELOOSE = R++; |
| src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + |
| '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; |
| |
| // ## Build Metadata Identifier |
| // Any combination of digits, letters, or hyphens. |
| |
| var BUILDIDENTIFIER = R++; |
| src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; |
| |
| // ## Build Metadata |
| // Plus sign, followed by one or more period-separated build metadata |
| // identifiers. |
| |
| var BUILD = R++; |
| src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + |
| '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; |
| |
| |
| // ## Full Version String |
| // A main version, followed optionally by a pre-release version and |
| // build metadata. |
| |
| // Note that the only major, minor, patch, and pre-release sections of |
| // the version string are capturing groups. The build metadata is not a |
| // capturing group, because it should not ever be used in version |
| // comparison. |
| |
| var FULL = R++; |
| var FULLPLAIN = 'v?' + src[MAINVERSION] + |
| src[PRERELEASE] + '?' + |
| src[BUILD] + '?'; |
| |
| src[FULL] = '^' + FULLPLAIN + '$'; |
| |
| // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. |
| // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty |
| // common in the npm registry. |
| var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + |
| src[PRERELEASELOOSE] + '?' + |
| src[BUILD] + '?'; |
| |
| var LOOSE = R++; |
| src[LOOSE] = '^' + LOOSEPLAIN + '$'; |
| |
| var GTLT = R++; |
| src[GTLT] = '((?:<|>)?=?)'; |
| |
| // Something like "2.*" or "1.2.x". |
| // Note that "x.x" is a valid xRange identifer, meaning "any version" |
| // Only the first item is strictly required. |
| var XRANGEIDENTIFIERLOOSE = R++; |
| src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; |
| var XRANGEIDENTIFIER = R++; |
| src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; |
| |
| var XRANGEPLAIN = R++; |
| src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + |
| '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + |
| '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + |
| '(?:' + src[PRERELEASE] + ')?' + |
| src[BUILD] + '?' + |
| ')?)?'; |
| |
| var XRANGEPLAINLOOSE = R++; |
| src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + |
| '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + |
| '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + |
| '(?:' + src[PRERELEASELOOSE] + ')?' + |
| src[BUILD] + '?' + |
| ')?)?'; |
| |
| var XRANGE = R++; |
| src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; |
| var XRANGELOOSE = R++; |
| src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; |
| |
| // Tilde ranges. |
| // Meaning is "reasonably at or greater than" |
| var LONETILDE = R++; |
| src[LONETILDE] = '(?:~>?)'; |
| |
| var TILDETRIM = R++; |
| src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; |
| re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); |
| var tildeTrimReplace = '$1~'; |
| |
| var TILDE = R++; |
| src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; |
| var TILDELOOSE = R++; |
| src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; |
| |
| // Caret ranges. |
| // Meaning is "at least and backwards compatible with" |
| var LONECARET = R++; |
| src[LONECARET] = '(?:\\^)'; |
| |
| var CARETTRIM = R++; |
| src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; |
| re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); |
| var caretTrimReplace = '$1^'; |
| |
| var CARET = R++; |
| src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; |
| var CARETLOOSE = R++; |
| src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; |
| |
| // A simple gt/lt/eq thing, or just "" to indicate "any version" |
| var COMPARATORLOOSE = R++; |
| src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; |
| var COMPARATOR = R++; |
| src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; |
| |
| |
| // An expression to strip any whitespace between the gtlt and the thing |
| // it modifies, so that `> 1.2.3` ==> `>1.2.3` |
| var COMPARATORTRIM = R++; |
| src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + |
| '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; |
| |
| // this one has to use the /g flag |
| re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); |
| var comparatorTrimReplace = '$1$2$3'; |
| |
| |
| // Something like `1.2.3 - 1.2.4` |
| // Note that these all use the loose form, because they'll be |
| // checked against either the strict or loose comparator form |
| // later. |
| var HYPHENRANGE = R++; |
| src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + |
| '\\s+-\\s+' + |
| '(' + src[XRANGEPLAIN] + ')' + |
| '\\s*$'; |
| |
| var HYPHENRANGELOOSE = R++; |
| src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + |
| '\\s+-\\s+' + |
| '(' + src[XRANGEPLAINLOOSE] + ')' + |
| '\\s*$'; |
| |
| // Star ranges basically just allow anything at all. |
| var STAR = R++; |
| src[STAR] = '(<|>)?=?\\s*\\*'; |
| |
| // Compile to actual regexp objects. |
| // All are flag-free, unless they were created above with a flag. |
| for (var i = 0; i < R; i++) { |
| debug(i, src[i]); |
| if (!re[i]) |
| { re[i] = new RegExp(src[i]); } |
| } |
| |
| exports.parse = parse; |
| function parse(version, loose) { |
| if (version instanceof SemVer) |
| { return version; } |
| |
| if (typeof version !== 'string') |
| { return null; } |
| |
| if (version.length > MAX_LENGTH) |
| { return null; } |
| |
| var r = loose ? re[LOOSE] : re[FULL]; |
| if (!r.test(version)) |
| { return null; } |
| |
| try { |
| return new SemVer(version, loose); |
| } catch (er) { |
| return null; |
| } |
| } |
| |
| exports.valid = valid; |
| function valid(version, loose) { |
| var v = parse(version, loose); |
| return v ? v.version : null; |
| } |
| |
| |
| exports.clean = clean; |
| function clean(version, loose) { |
| var s = parse(version.trim().replace(/^[=v]+/, ''), loose); |
| return s ? s.version : null; |
| } |
| |
| exports.SemVer = SemVer; |
| |
| function SemVer(version, loose) { |
| if (version instanceof SemVer) { |
| if (version.loose === loose) |
| { return version; } |
| else |
| { version = version.version; } |
| } else if (typeof version !== 'string') { |
| throw new TypeError('Invalid Version: ' + version); |
| } |
| |
| if (version.length > MAX_LENGTH) |
| { throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') } |
| |
| if (!(this instanceof SemVer)) |
| { return new SemVer(version, loose); } |
| |
| debug('SemVer', version, loose); |
| this.loose = loose; |
| var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); |
| |
| if (!m) |
| { throw new TypeError('Invalid Version: ' + version); } |
| |
| this.raw = version; |
| |
| // these are actually numbers |
| this.major = +m[1]; |
| this.minor = +m[2]; |
| this.patch = +m[3]; |
| |
| if (this.major > MAX_SAFE_INTEGER || this.major < 0) |
| { throw new TypeError('Invalid major version') } |
| |
| if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) |
| { throw new TypeError('Invalid minor version') } |
| |
| if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) |
| { throw new TypeError('Invalid patch version') } |
| |
| // numberify any prerelease numeric ids |
| if (!m[4]) |
| { this.prerelease = []; } |
| else |
| { this.prerelease = m[4].split('.').map(function(id) { |
| if (/^[0-9]+$/.test(id)) { |
| var num = +id; |
| if (num >= 0 && num < MAX_SAFE_INTEGER) |
| { return num; } |
| } |
| return id; |
| }); } |
| |
| this.build = m[5] ? m[5].split('.') : []; |
| this.format(); |
| } |
| |
| SemVer.prototype.format = function() { |
| this.version = this.major + '.' + this.minor + '.' + this.patch; |
| if (this.prerelease.length) |
| { this.version += '-' + this.prerelease.join('.'); } |
| return this.version; |
| }; |
| |
| SemVer.prototype.toString = function() { |
| return this.version; |
| }; |
| |
| SemVer.prototype.compare = function(other) { |
| debug('SemVer.compare', this.version, this.loose, other); |
| if (!(other instanceof SemVer)) |
| { other = new SemVer(other, this.loose); } |
| |
| return this.compareMain(other) || this.comparePre(other); |
| }; |
| |
| SemVer.prototype.compareMain = function(other) { |
| if (!(other instanceof SemVer)) |
| { other = new SemVer(other, this.loose); } |
| |
| return compareIdentifiers(this.major, other.major) || |
| compareIdentifiers(this.minor, other.minor) || |
| compareIdentifiers(this.patch, other.patch); |
| }; |
| |
| SemVer.prototype.comparePre = function(other) { |
| var this$1 = this; |
| |
| if (!(other instanceof SemVer)) |
| { other = new SemVer(other, this.loose); } |
| |
| // NOT having a prerelease is > having one |
| if (this.prerelease.length && !other.prerelease.length) |
| { return -1; } |
| else if (!this.prerelease.length && other.prerelease.length) |
| { return 1; } |
| else if (!this.prerelease.length && !other.prerelease.length) |
| { return 0; } |
| |
| var i = 0; |
| do { |
| var a = this$1.prerelease[i]; |
| var b = other.prerelease[i]; |
| debug('prerelease compare', i, a, b); |
| if (a === undefined && b === undefined) |
| { return 0; } |
| else if (b === undefined) |
| { return 1; } |
| else if (a === undefined) |
| { return -1; } |
| else if (a === b) |
| { continue; } |
| else |
| { return compareIdentifiers(a, b); } |
| } while (++i); |
| }; |
| |
| // preminor will bump the version up to the next minor release, and immediately |
| // down to pre-release. premajor and prepatch work the same way. |
| SemVer.prototype.inc = function(release, identifier) { |
| var this$1 = this; |
| |
| switch (release) { |
| case 'premajor': |
| this.prerelease.length = 0; |
| this.patch = 0; |
| this.minor = 0; |
| this.major++; |
| this.inc('pre', identifier); |
| break; |
| case 'preminor': |
| this.prerelease.length = 0; |
| this.patch = 0; |
| this.minor++; |
| this.inc('pre', identifier); |
| break; |
| case 'prepatch': |
| // If this is already a prerelease, it will bump to the next version |
| // drop any prereleases that might already exist, since they are not |
| // relevant at this point. |
| this.prerelease.length = 0; |
| this.inc('patch', identifier); |
| this.inc('pre', identifier); |
| break; |
| // If the input is a non-prerelease version, this acts the same as |
| // prepatch. |
| case 'prerelease': |
| if (this.prerelease.length === 0) |
| { this.inc('patch', identifier); } |
| this.inc('pre', identifier); |
| break; |
| |
| case 'major': |
| // If this is a pre-major version, bump up to the same major version. |
| // Otherwise increment major. |
| // 1.0.0-5 bumps to 1.0.0 |
| // 1.1.0 bumps to 2.0.0 |
| if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) |
| { this.major++; } |
| this.minor = 0; |
| this.patch = 0; |
| this.prerelease = []; |
| break; |
| case 'minor': |
| // If this is a pre-minor version, bump up to the same minor version. |
| // Otherwise increment minor. |
| // 1.2.0-5 bumps to 1.2.0 |
| // 1.2.1 bumps to 1.3.0 |
| if (this.patch !== 0 || this.prerelease.length === 0) |
| { this.minor++; } |
| this.patch = 0; |
| this.prerelease = []; |
| break; |
| case 'patch': |
| // If this is not a pre-release version, it will increment the patch. |
| // If it is a pre-release it will bump up to the same patch version. |
| // 1.2.0-5 patches to 1.2.0 |
| // 1.2.0 patches to 1.2.1 |
| if (this.prerelease.length === 0) |
| { this.patch++; } |
| this.prerelease = []; |
| break; |
| // This probably shouldn't be used publicly. |
| // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. |
| case 'pre': |
| if (this.prerelease.length === 0) |
| { this.prerelease = [0]; } |
| else { |
| var i = this.prerelease.length; |
| while (--i >= 0) { |
| if (typeof this$1.prerelease[i] === 'number') { |
| this$1.prerelease[i]++; |
| i = -2; |
| } |
| } |
| if (i === -1) // didn't increment anything |
| { this.prerelease.push(0); } |
| } |
| if (identifier) { |
| // 1.2.0-beta.1 bumps to 1.2.0-beta.2, |
| // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 |
| if (this.prerelease[0] === identifier) { |
| if (isNaN(this.prerelease[1])) |
| { this.prerelease = [identifier, 0]; } |
| } else |
| { this.prerelease = [identifier, 0]; } |
| } |
| break; |
| |
| default: |
| throw new Error('invalid increment argument: ' + release); |
| } |
| this.format(); |
| this.raw = this.version; |
| return this; |
| }; |
| |
| exports.inc = inc; |
| function inc(version, release, loose, identifier) { |
| if (typeof(loose) === 'string') { |
| identifier = loose; |
| loose = undefined; |
| } |
| |
| try { |
| return new SemVer(version, loose).inc(release, identifier).version; |
| } catch (er) { |
| return null; |
| } |
| } |
| |
| exports.diff = diff; |
| function diff(version1, version2) { |
| if (eq(version1, version2)) { |
| return null; |
| } else { |
| var v1 = parse(version1); |
| var v2 = parse(version2); |
| if (v1.prerelease.length || v2.prerelease.length) { |
| for (var key in v1) { |
| if (key === 'major' || key === 'minor' || key === 'patch') { |
| if (v1[key] !== v2[key]) { |
| return 'pre'+key; |
| } |
| } |
| } |
| return 'prerelease'; |
| } |
| for (var key in v1) { |
| if (key === 'major' || key === 'minor' || key === 'patch') { |
| if (v1[key] !== v2[key]) { |
| return key; |
| } |
| } |
| } |
| } |
| } |
| |
| exports.compareIdentifiers = compareIdentifiers; |
| |
| var numeric = /^[0-9]+$/; |
| function compareIdentifiers(a, b) { |
| var anum = numeric.test(a); |
| var bnum = numeric.test(b); |
| |
| if (anum && bnum) { |
| a = +a; |
| b = +b; |
| } |
| |
| return (anum && !bnum) ? -1 : |
| (bnum && !anum) ? 1 : |
| a < b ? -1 : |
| a > b ? 1 : |
| 0; |
| } |
| |
| exports.rcompareIdentifiers = rcompareIdentifiers; |
| function rcompareIdentifiers(a, b) { |
| return compareIdentifiers(b, a); |
| } |
| |
| exports.major = major; |
| function major(a, loose) { |
| return new SemVer(a, loose).major; |
| } |
| |
| exports.minor = minor; |
| function minor(a, loose) { |
| return new SemVer(a, loose).minor; |
| } |
| |
| exports.patch = patch; |
| function patch(a, loose) { |
| return new SemVer(a, loose).patch; |
| } |
| |
| exports.compare = compare; |
| function compare(a, b, loose) { |
| return new SemVer(a, loose).compare(new SemVer(b, loose)); |
| } |
| |
| exports.compareLoose = compareLoose; |
| function compareLoose(a, b) { |
| return compare(a, b, true); |
| } |
| |
| exports.rcompare = rcompare; |
| function rcompare(a, b, loose) { |
| return compare(b, a, loose); |
| } |
| |
| exports.sort = sort; |
| function sort(list, loose) { |
| return list.sort(function(a, b) { |
| return exports.compare(a, b, loose); |
| }); |
| } |
| |
| exports.rsort = rsort; |
| function rsort(list, loose) { |
| return list.sort(function(a, b) { |
| return exports.rcompare(a, b, loose); |
| }); |
| } |
| |
| exports.gt = gt; |
| function gt(a, b, loose) { |
| return compare(a, b, loose) > 0; |
| } |
| |
| exports.lt = lt; |
| function lt(a, b, loose) { |
| return compare(a, b, loose) < 0; |
| } |
| |
| exports.eq = eq; |
| function eq(a, b, loose) { |
| return compare(a, b, loose) === 0; |
| } |
| |
| exports.neq = neq; |
| function neq(a, b, loose) { |
| return compare(a, b, loose) !== 0; |
| } |
| |
| exports.gte = gte; |
| function gte(a, b, loose) { |
| return compare(a, b, loose) >= 0; |
| } |
| |
| exports.lte = lte; |
| function lte(a, b, loose) { |
| return compare(a, b, loose) <= 0; |
| } |
| |
| exports.cmp = cmp; |
| function cmp(a, op, b, loose) { |
| var ret; |
| switch (op) { |
| case '===': |
| if (typeof a === 'object') { a = a.version; } |
| if (typeof b === 'object') { b = b.version; } |
| ret = a === b; |
| break; |
| case '!==': |
| if (typeof a === 'object') { a = a.version; } |
| if (typeof b === 'object') { b = b.version; } |
| ret = a !== b; |
| break; |
| case '': case '=': case '==': ret = eq(a, b, loose); break; |
| case '!=': ret = neq(a, b, loose); break; |
| case '>': ret = gt(a, b, loose); break; |
| case '>=': ret = gte(a, b, loose); break; |
| case '<': ret = lt(a, b, loose); break; |
| case '<=': ret = lte(a, b, loose); break; |
| default: throw new TypeError('Invalid operator: ' + op); |
| } |
| return ret; |
| } |
| |
| exports.Comparator = Comparator; |
| function Comparator(comp, loose) { |
| if (comp instanceof Comparator) { |
| if (comp.loose === loose) |
| { return comp; } |
| else |
| { comp = comp.value; } |
| } |
| |
| if (!(this instanceof Comparator)) |
| { return new Comparator(comp, loose); } |
| |
| debug('comparator', comp, loose); |
| this.loose = loose; |
| this.parse(comp); |
| |
| if (this.semver === ANY) |
| { this.value = ''; } |
| else |
| { this.value = this.operator + this.semver.version; } |
| |
| debug('comp', this); |
| } |
| |
| var ANY = {}; |
| Comparator.prototype.parse = function(comp) { |
| var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; |
| var m = comp.match(r); |
| |
| if (!m) |
| { throw new TypeError('Invalid comparator: ' + comp); } |
| |
| this.operator = m[1]; |
| if (this.operator === '=') |
| { this.operator = ''; } |
| |
| // if it literally is just '>' or '' then allow anything. |
| if (!m[2]) |
| { this.semver = ANY; } |
| else |
| { this.semver = new SemVer(m[2], this.loose); } |
| }; |
| |
| Comparator.prototype.toString = function() { |
| return this.value; |
| }; |
| |
| Comparator.prototype.test = function(version) { |
| debug('Comparator.test', version, this.loose); |
| |
| if (this.semver === ANY) |
| { return true; } |
| |
| if (typeof version === 'string') |
| { version = new SemVer(version, this.loose); } |
| |
| return cmp(version, this.operator, this.semver, this.loose); |
| }; |
| |
| Comparator.prototype.intersects = function(comp, loose) { |
| if (!(comp instanceof Comparator)) { |
| throw new TypeError('a Comparator is required'); |
| } |
| |
| var rangeTmp; |
| |
| if (this.operator === '') { |
| rangeTmp = new Range(comp.value, loose); |
| return satisfies(this.value, rangeTmp, loose); |
| } else if (comp.operator === '') { |
| rangeTmp = new Range(this.value, loose); |
| return satisfies(comp.semver, rangeTmp, loose); |
| } |
| |
| var sameDirectionIncreasing = |
| (this.operator === '>=' || this.operator === '>') && |
| (comp.operator === '>=' || comp.operator === '>'); |
| var sameDirectionDecreasing = |
| (this.operator === '<=' || this.operator === '<') && |
| (comp.operator === '<=' || comp.operator === '<'); |
| var sameSemVer = this.semver.version === comp.semver.version; |
| var differentDirectionsInclusive = |
| (this.operator === '>=' || this.operator === '<=') && |
| (comp.operator === '>=' || comp.operator === '<='); |
| var oppositeDirectionsLessThan = |
| cmp(this.semver, '<', comp.semver, loose) && |
| ((this.operator === '>=' || this.operator === '>') && |
| (comp.operator === '<=' || comp.operator === '<')); |
| var oppositeDirectionsGreaterThan = |
| cmp(this.semver, '>', comp.semver, loose) && |
| ((this.operator === '<=' || this.operator === '<') && |
| (comp.operator === '>=' || comp.operator === '>')); |
| |
| return sameDirectionIncreasing || sameDirectionDecreasing || |
| (sameSemVer && differentDirectionsInclusive) || |
| oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; |
| }; |
| |
| |
| exports.Range = Range; |
| function Range(range, loose) { |
| if (range instanceof Range) { |
| if (range.loose === loose) { |
| return range; |
| } else { |
| return new Range(range.raw, loose); |
| } |
| } |
| |
| if (range instanceof Comparator) { |
| return new Range(range.value, loose); |
| } |
| |
| if (!(this instanceof Range)) |
| { return new Range(range, loose); } |
| |
| this.loose = loose; |
| |
| // First, split based on boolean or || |
| this.raw = range; |
| this.set = range.split(/\s*\|\|\s*/).map(function(range) { |
| return this.parseRange(range.trim()); |
| }, this).filter(function(c) { |
| // throw out any that are not relevant for whatever reason |
| return c.length; |
| }); |
| |
| if (!this.set.length) { |
| throw new TypeError('Invalid SemVer Range: ' + range); |
| } |
| |
| this.format(); |
| } |
| |
| Range.prototype.format = function() { |
| this.range = this.set.map(function(comps) { |
| return comps.join(' ').trim(); |
| }).join('||').trim(); |
| return this.range; |
| }; |
| |
| Range.prototype.toString = function() { |
| return this.range; |
| }; |
| |
| Range.prototype.parseRange = function(range) { |
| var loose = this.loose; |
| range = range.trim(); |
| debug('range', range, loose); |
| // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` |
| var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; |
| range = range.replace(hr, hyphenReplace); |
| debug('hyphen replace', range); |
| // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` |
| range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); |
| debug('comparator trim', range, re[COMPARATORTRIM]); |
| |
| // `~ 1.2.3` => `~1.2.3` |
| range = range.replace(re[TILDETRIM], tildeTrimReplace); |
| |
| // `^ 1.2.3` => `^1.2.3` |
| range = range.replace(re[CARETTRIM], caretTrimReplace); |
| |
| // normalize spaces |
| range = range.split(/\s+/).join(' '); |
| |
| // At this point, the range is completely trimmed and |
| // ready to be split into comparators. |
| |
| var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; |
| var set = range.split(' ').map(function(comp) { |
| return parseComparator(comp, loose); |
| }).join(' ').split(/\s+/); |
| if (this.loose) { |
| // in loose mode, throw out any that are not valid comparators |
| set = set.filter(function(comp) { |
| return !!comp.match(compRe); |
| }); |
| } |
| set = set.map(function(comp) { |
| return new Comparator(comp, loose); |
| }); |
| |
| return set; |
| }; |
| |
| Range.prototype.intersects = function(range, loose) { |
| if (!(range instanceof Range)) { |
| throw new TypeError('a Range is required'); |
| } |
| |
| return this.set.some(function(thisComparators) { |
| return thisComparators.every(function(thisComparator) { |
| return range.set.some(function(rangeComparators) { |
| return rangeComparators.every(function(rangeComparator) { |
| return thisComparator.intersects(rangeComparator, loose); |
| }); |
| }); |
| }); |
| }); |
| }; |
| |
| // Mostly just for testing and legacy API reasons |
| exports.toComparators = toComparators; |
| function toComparators(range, loose) { |
| return new Range(range, loose).set.map(function(comp) { |
| return comp.map(function(c) { |
| return c.value; |
| }).join(' ').trim().split(' '); |
| }); |
| } |
| |
| // comprised of xranges, tildes, stars, and gtlt's at this point. |
| // already replaced the hyphen ranges |
| // turn into a set of JUST comparators. |
| function parseComparator(comp, loose) { |
| debug('comp', comp); |
| comp = replaceCarets(comp, loose); |
| debug('caret', comp); |
| comp = replaceTildes(comp, loose); |
| debug('tildes', comp); |
| comp = replaceXRanges(comp, loose); |
| debug('xrange', comp); |
| comp = replaceStars(comp, loose); |
| debug('stars', comp); |
| return comp; |
| } |
| |
| function isX(id) { |
| return !id || id.toLowerCase() === 'x' || id === '*'; |
| } |
| |
| // ~, ~> --> * (any, kinda silly) |
| // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 |
| // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 |
| // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 |
| // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 |
| // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 |
| function replaceTildes(comp, loose) { |
| return comp.trim().split(/\s+/).map(function(comp) { |
| return replaceTilde(comp, loose); |
| }).join(' '); |
| } |
| |
| function replaceTilde(comp, loose) { |
| var r = loose ? re[TILDELOOSE] : re[TILDE]; |
| return comp.replace(r, function(_, M, m, p, pr) { |
| debug('tilde', comp, _, M, m, p, pr); |
| var ret; |
| |
| if (isX(M)) |
| { ret = ''; } |
| else if (isX(m)) |
| { ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; } |
| else if (isX(p)) |
| // ~1.2 == >=1.2.0 <1.3.0 |
| { ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; } |
| else if (pr) { |
| debug('replaceTilde pr', pr); |
| if (pr.charAt(0) !== '-') |
| { pr = '-' + pr; } |
| ret = '>=' + M + '.' + m + '.' + p + pr + |
| ' <' + M + '.' + (+m + 1) + '.0'; |
| } else |
| // ~1.2.3 == >=1.2.3 <1.3.0 |
| { ret = '>=' + M + '.' + m + '.' + p + |
| ' <' + M + '.' + (+m + 1) + '.0'; } |
| |
| debug('tilde return', ret); |
| return ret; |
| }); |
| } |
| |
| // ^ --> * (any, kinda silly) |
| // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 |
| // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 |
| // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 |
| // ^1.2.3 --> >=1.2.3 <2.0.0 |
| // ^1.2.0 --> >=1.2.0 <2.0.0 |
| function replaceCarets(comp, loose) { |
| return comp.trim().split(/\s+/).map(function(comp) { |
| return replaceCaret(comp, loose); |
| }).join(' '); |
| } |
| |
| function replaceCaret(comp, loose) { |
| debug('caret', comp, loose); |
| var r = loose ? re[CARETLOOSE] : re[CARET]; |
| return comp.replace(r, function(_, M, m, p, pr) { |
| debug('caret', comp, _, M, m, p, pr); |
| var ret; |
| |
| if (isX(M)) |
| { ret = ''; } |
| else if (isX(m)) |
| { ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; } |
| else if (isX(p)) { |
| if (M === '0') |
| { ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; } |
| else |
| { ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; } |
| } else if (pr) { |
| debug('replaceCaret pr', pr); |
| if (pr.charAt(0) !== '-') |
| { pr = '-' + pr; } |
| if (M === '0') { |
| if (m === '0') |
| { ret = '>=' + M + '.' + m + '.' + p + pr + |
| ' <' + M + '.' + m + '.' + (+p + 1); } |
| else |
| { ret = '>=' + M + '.' + m + '.' + p + pr + |
| ' <' + M + '.' + (+m + 1) + '.0'; } |
| } else |
| { ret = '>=' + M + '.' + m + '.' + p + pr + |
| ' <' + (+M + 1) + '.0.0'; } |
| } else { |
| debug('no pr'); |
| if (M === '0') { |
| if (m === '0') |
| { ret = '>=' + M + '.' + m + '.' + p + |
| ' <' + M + '.' + m + '.' + (+p + 1); } |
| else |
| { ret = '>=' + M + '.' + m + '.' + p + |
| ' <' + M + '.' + (+m + 1) + '.0'; } |
| } else |
| { ret = '>=' + M + '.' + m + '.' + p + |
| ' <' + (+M + 1) + '.0.0'; } |
| } |
| |
| debug('caret return', ret); |
| return ret; |
| }); |
| } |
| |
| function replaceXRanges(comp, loose) { |
| debug('replaceXRanges', comp, loose); |
| return comp.split(/\s+/).map(function(comp) { |
| return replaceXRange(comp, loose); |
| }).join(' '); |
| } |
| |
| function replaceXRange(comp, loose) { |
| comp = comp.trim(); |
| var r = loose ? re[XRANGELOOSE] : re[XRANGE]; |
| return comp.replace(r, function(ret, gtlt, M, m, p, pr) { |
| debug('xRange', comp, ret, gtlt, M, m, p, pr); |
| var xM = isX(M); |
| var xm = xM || isX(m); |
| var xp = xm || isX(p); |
| var anyX = xp; |
| |
| if (gtlt === '=' && anyX) |
| { gtlt = ''; } |
| |
| if (xM) { |
| if (gtlt === '>' || gtlt === '<') { |
| // nothing is allowed |
| ret = '<0.0.0'; |
| } else { |
| // nothing is forbidden |
| ret = '*'; |
| } |
| } else if (gtlt && anyX) { |
| // replace X with 0 |
| if (xm) |
| { m = 0; } |
| if (xp) |
| { p = 0; } |
| |
| if (gtlt === '>') { |
| // >1 => >=2.0.0 |
| // >1.2 => >=1.3.0 |
| // >1.2.3 => >= 1.2.4 |
| gtlt = '>='; |
| if (xm) { |
| M = +M + 1; |
| m = 0; |
| p = 0; |
| } else if (xp) { |
| m = +m + 1; |
| p = 0; |
| } |
| } else if (gtlt === '<=') { |
| // <=0.7.x is actually <0.8.0, since any 0.7.x should |
| // pass. Similarly, <=7.x is actually <8.0.0, etc. |
| gtlt = '<'; |
| if (xm) |
| { M = +M + 1; } |
| else |
| { m = +m + 1; } |
| } |
| |
| ret = gtlt + M + '.' + m + '.' + p; |
| } else if (xm) { |
| ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; |
| } else if (xp) { |
| ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; |
| } |
| |
| debug('xRange return', ret); |
| |
| return ret; |
| }); |
| } |
| |
| // Because * is AND-ed with everything else in the comparator, |
| // and '' means "any version", just remove the *s entirely. |
| function replaceStars(comp, loose) { |
| debug('replaceStars', comp, loose); |
| // Looseness is ignored here. star is always as loose as it gets! |
| return comp.trim().replace(re[STAR], ''); |
| } |
| |
| // This function is passed to string.replace(re[HYPHENRANGE]) |
| // M, m, patch, prerelease, build |
| // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 |
| // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do |
| // 1.2 - 3.4 => >=1.2.0 <3.5.0 |
| function hyphenReplace($0, |
| from, fM, fm, fp, fpr, fb, |
| to, tM, tm, tp, tpr, tb) { |
| |
| if (isX(fM)) |
| { from = ''; } |
| else if (isX(fm)) |
| { from = '>=' + fM + '.0.0'; } |
| else if (isX(fp)) |
| { from = '>=' + fM + '.' + fm + '.0'; } |
| else |
| { from = '>=' + from; } |
| |
| if (isX(tM)) |
| { to = ''; } |
| else if (isX(tm)) |
| { to = '<' + (+tM + 1) + '.0.0'; } |
| else if (isX(tp)) |
| { to = '<' + tM + '.' + (+tm + 1) + '.0'; } |
| else if (tpr) |
| { to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; } |
| else |
| { to = '<=' + to; } |
| |
| return (from + ' ' + to).trim(); |
| } |
| |
| |
| // if ANY of the sets match ALL of its comparators, then pass |
| Range.prototype.test = function(version) { |
| var this$1 = this; |
| |
| if (!version) |
| { return false; } |
| |
| if (typeof version === 'string') |
| { version = new SemVer(version, this.loose); } |
| |
| for (var i = 0; i < this.set.length; i++) { |
| if (testSet(this$1.set[i], version)) |
| { return true; } |
| } |
| return false; |
| }; |
| |
| function testSet(set, version) { |
| for (var i = 0; i < set.length; i++) { |
| if (!set[i].test(version)) |
| { return false; } |
| } |
| |
| if (version.prerelease.length) { |
| // Find the set of versions that are allowed to have prereleases |
| // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 |
| // That should allow `1.2.3-pr.2` to pass. |
| // However, `1.2.4-alpha.notready` should NOT be allowed, |
| // even though it's within the range set by the comparators. |
| for (var i = 0; i < set.length; i++) { |
| debug(set[i].semver); |
| if (set[i].semver === ANY) |
| { continue; } |
| |
| if (set[i].semver.prerelease.length > 0) { |
| var allowed = set[i].semver; |
| if (allowed.major === version.major && |
| allowed.minor === version.minor && |
| allowed.patch === version.patch) |
| { return true; } |
| } |
| } |
| |
| // Version has a -pre, but it's not one of the ones we like. |
| return false; |
| } |
| |
| return true; |
| } |
| |
| exports.satisfies = satisfies; |
| function satisfies(version, range, loose) { |
| try { |
| range = new Range(range, loose); |
| } catch (er) { |
| return false; |
| } |
| return range.test(version); |
| } |
| |
| exports.maxSatisfying = maxSatisfying; |
| function maxSatisfying(versions, range, loose) { |
| var max = null; |
| var maxSV = null; |
| try { |
| var rangeObj = new Range(range, loose); |
| } catch (er) { |
| return null; |
| } |
| versions.forEach(function (v) { |
| if (rangeObj.test(v)) { // satisfies(v, range, loose) |
| if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) |
| max = v; |
| maxSV = new SemVer(max, loose); |
| } |
| } |
| }); |
| return max; |
| } |
| |
| exports.minSatisfying = minSatisfying; |
| function minSatisfying(versions, range, loose) { |
| var min = null; |
| var minSV = null; |
| try { |
| var rangeObj = new Range(range, loose); |
| } catch (er) { |
| return null; |
| } |
| versions.forEach(function (v) { |
| if (rangeObj.test(v)) { // satisfies(v, range, loose) |
| if (!min || minSV.compare(v) === 1) { // compare(min, v, true) |
| min = v; |
| minSV = new SemVer(min, loose); |
| } |
| } |
| }); |
| return min; |
| } |
| |
| exports.validRange = validRange; |
| function validRange(range, loose) { |
| try { |
| // Return '*' instead of '' so that truthiness works. |
| // This will throw if it's invalid anyway |
| return new Range(range, loose).range || '*'; |
| } catch (er) { |
| return null; |
| } |
| } |
| |
| // Determine if version is less than all the versions possible in the range |
| exports.ltr = ltr; |
| function ltr(version, range, loose) { |
| return outside(version, range, '<', loose); |
| } |
| |
| // Determine if version is greater than all the versions possible in the range. |
| exports.gtr = gtr; |
| function gtr(version, range, loose) { |
| return outside(version, range, '>', loose); |
| } |
| |
| exports.outside = outside; |
| function outside(version, range, hilo, loose) { |
| version = new SemVer(version, loose); |
| range = new Range(range, loose); |
| |
| var gtfn, ltefn, ltfn, comp, ecomp; |
| switch (hilo) { |
| case '>': |
| gtfn = gt; |
| ltefn = lte; |
| ltfn = lt; |
| comp = '>'; |
| ecomp = '>='; |
| break; |
| case '<': |
| gtfn = lt; |
| ltefn = gte; |
| ltfn = gt; |
| comp = '<'; |
| ecomp = '<='; |
| break; |
| default: |
| throw new TypeError('Must provide a hilo val of "<" or ">"'); |
| } |
| |
| // If it satisifes the range it is not outside |
| if (satisfies(version, range, loose)) { |
| return false; |
| } |
| |
| // From now on, variable terms are as if we're in "gtr" mode. |
| // but note that everything is flipped for the "ltr" function. |
| |
| for (var i = 0; i < range.set.length; ++i) { |
| var comparators = range.set[i]; |
| |
| var high = null; |
| var low = null; |
| |
| comparators.forEach(function(comparator) { |
| if (comparator.semver === ANY) { |
| comparator = new Comparator('>=0.0.0'); |
| } |
| high = high || comparator; |
| low = low || comparator; |
| if (gtfn(comparator.semver, high.semver, loose)) { |
| high = comparator; |
| } else if (ltfn(comparator.semver, low.semver, loose)) { |
| low = comparator; |
| } |
| }); |
| |
| // If the edge version comparator has a operator then our version |
| // isn't outside it |
| if (high.operator === comp || high.operator === ecomp) { |
| return false; |
| } |
| |
| // If the lowest version comparator has an operator and our version |
| // is less than it then it isn't higher than the range |
| if ((!low.operator || low.operator === comp) && |
| ltefn(version, low.semver)) { |
| return false; |
| } else if (low.operator === ecomp && ltfn(version, low.semver)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| exports.prerelease = prerelease; |
| function prerelease(version, loose) { |
| var parsed = parse(version, loose); |
| return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; |
| } |
| |
| exports.intersects = intersects; |
| function intersects(r1, r2, loose) { |
| r1 = new Range(r1, loose); |
| r2 = new Range(r2, loose); |
| return r1.intersects(r2) |
| } |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * Normalize a version string. |
| * @param {String} Version. ie: 1, 1.0, 1.0.0 |
| * @return {String} Version |
| */ |
| function normalizeVersion (v) { |
| var isValid = semver.valid(v); |
| if (isValid) { |
| return v |
| } |
| |
| v = typeof (v) === 'string' ? v : ''; |
| var split = v.split('.'); |
| var i = 0; |
| var result = []; |
| |
| while (i < 3) { |
| var s = typeof (split[i]) === 'string' && split[i] ? split[i] : '0'; |
| result.push(s); |
| i++; |
| } |
| |
| return result.join('.') |
| } |
| |
| /** |
| * Get informations from different error key. Like: |
| * - code |
| * - errorMessage |
| * - errorType |
| * - isDowngrade |
| * @param {string} key |
| * @param {string} val |
| * @param {string} criteria |
| * @return {object} |
| */ |
| function getError (key, val, criteria) { |
| var result = { |
| isDowngrade: true, |
| errorType: 1, |
| code: 1000 |
| }; |
| var getMsg = function (key, val, criteria) { |
| return 'Downgrade[' + key + '] :: deviceInfo ' |
| + val + ' matched criteria ' + criteria |
| }; |
| var _key = key.toLowerCase(); |
| |
| result.errorMessage = getMsg(key, val, criteria); |
| |
| if (_key.indexOf('osversion') >= 0) { |
| result.code = 1001; |
| } |
| else if (_key.indexOf('appversion') >= 0) { |
| result.code = 1002; |
| } |
| else if (_key.indexOf('weexversion') >= 0) { |
| result.code = 1003; |
| } |
| else if (_key.indexOf('devicemodel') >= 0) { |
| result.code = 1004; |
| } |
| |
| return result |
| } |
| |
| /** |
| * WEEX framework input(deviceInfo) |
| * { |
| * platform: 'iOS' or 'android' |
| * osVersion: '1.0.0' or '1.0' or '1' |
| * appVersion: '1.0.0' or '1.0' or '1' |
| * weexVersion: '1.0.0' or '1.0' or '1' |
| * dDeviceModel: 'MODEL_NAME' |
| * } |
| * |
| * downgrade config(config) |
| * { |
| * ios: { |
| * osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * deviceModel: ['modelA', 'modelB', ...] |
| * }, |
| * android: { |
| * osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * deviceModel: ['modelA', 'modelB', ...] |
| * } |
| * } |
| * |
| * |
| * @param {object} deviceInfo Weex SDK framework input |
| * @param {object} config user input |
| * @return {Object} { isDowngrade: true/false, errorMessage... } |
| */ |
| function check (config, deviceInfo) { |
| deviceInfo = deviceInfo || global.WXEnvironment; |
| deviceInfo = isPlainObject(deviceInfo) ? deviceInfo : {}; |
| |
| var result = { |
| isDowngrade: false // defautl is pass |
| }; |
| |
| if (typof$1(config) === 'function') { |
| var customDowngrade = config.call(this, deviceInfo, { |
| semver: semver, |
| normalizeVersion: normalizeVersion |
| }); |
| |
| customDowngrade = !!customDowngrade; |
| |
| result = customDowngrade ? getError('custom', '', 'custom params') : result; |
| } |
| else { |
| config = isPlainObject(config) ? config : {}; |
| |
| var platform = deviceInfo.platform || 'unknow'; |
| var dPlatform = platform.toLowerCase(); |
| var cObj = config[dPlatform] || {}; |
| |
| for (var i in deviceInfo) { |
| var key = i; |
| var keyLower = key.toLowerCase(); |
| var val = deviceInfo[i]; |
| var isVersion = keyLower.indexOf('version') >= 0; |
| var isDeviceModel = keyLower.indexOf('devicemodel') >= 0; |
| var criteria = cObj[i]; |
| |
| if (criteria && isVersion) { |
| var c = normalizeVersion(criteria); |
| var d = normalizeVersion(deviceInfo[i]); |
| |
| if (semver.satisfies(d, c)) { |
| result = getError(key, val, criteria); |
| break |
| } |
| } |
| else if (isDeviceModel) { |
| var _criteria = typof$1(criteria) === 'array' ? criteria : [criteria]; |
| if (_criteria.indexOf(val) >= 0) { |
| result = getError(key, val, criteria); |
| break |
| } |
| } |
| } |
| } |
| |
| return result |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function setViewport (app, configs) { |
| if ( configs === void 0 ) configs = {}; |
| |
| /* istanbul ignore if */ |
| { |
| console.debug(("[JS Framework] Set viewport (width: " + (configs.width) + ") for app#" + (app.id) + ".")); |
| validateViewport(configs); |
| } |
| |
| // Send viewport configs to native |
| if (app && app.callTasks) { |
| return app.callTasks([{ |
| module: 'meta', |
| method: 'setViewport', |
| args: [configs] |
| }]) |
| } |
| |
| /* istanbul ignore next */ |
| else { |
| console.warn("[JS Framework] Can't find \"callTasks\" method on current app."); |
| } |
| } |
| |
| /** |
| * Validate the viewport config. |
| * @param {Object} configs |
| */ |
| function validateViewport (configs) { |
| if ( configs === void 0 ) configs = {}; |
| |
| var width = configs.width; |
| if (width) { |
| if (typeof width !== 'number' && width !== 'device-width') { |
| console.warn(("[JS Framework] Not support to use " + width + " as viewport width.")); |
| return false |
| } |
| return true |
| } |
| console.warn('[JS Framework] the viewport config should contain the "width" property.'); |
| return false |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * bootstrap app from a certain custom component with config & data |
| */ |
| function bootstrap (app, name, config, data) { |
| console.debug(("[JS Framework] bootstrap for " + name)); |
| |
| // 1. validate custom component name first |
| var cleanName; |
| if (isWeexComponent(name)) { |
| cleanName = removeWeexPrefix(name); |
| } |
| else if (isNpmModule(name)) { |
| cleanName = removeJSSurfix(name); |
| // check if define by old 'define' method |
| /* istanbul ignore if */ |
| if (!requireCustomComponent(app, cleanName)) { |
| return new Error(("It's not a component: " + name)) |
| } |
| } |
| else { |
| return new Error(("Wrong component name: " + name)) |
| } |
| |
| // 2. validate configuration |
| config = isPlainObject(config) ? config : {}; |
| // 2.1 transformer version check |
| if (typeof config.transformerVersion === 'string' && |
| typeof global.transformerVersion === 'string' && |
| !semver.satisfies(config.transformerVersion, |
| global.transformerVersion)) { |
| return new Error("JS Bundle version: " + (config.transformerVersion) + " " + |
| "not compatible with " + (global.transformerVersion)) |
| } |
| // 2.2 downgrade version check |
| var downgradeResult = check(config.downgrade); |
| /* istanbul ignore if */ |
| if (downgradeResult.isDowngrade) { |
| app.callTasks([{ |
| module: 'instanceWrap', |
| method: 'error', |
| args: [ |
| downgradeResult.errorType, |
| downgradeResult.code, |
| downgradeResult.errorMessage |
| ] |
| }]); |
| return new Error(("Downgrade[" + (downgradeResult.code) + "]: " + (downgradeResult.errorMessage))) |
| } |
| |
| // set viewport |
| if (config.viewport) { |
| setViewport(app, config.viewport); |
| } |
| |
| // 3. create a new Vm with custom component name and data |
| app.vm = new Vm(cleanName, null, { _app: app }, null, data); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * define(name, factory) for primary usage |
| * or |
| * define(name, deps, factory) for compatibility |
| * Notice: DO NOT use function define() {}, |
| * it will cause error after builded by webpack |
| */ |
| var defineFn = function (app, name) { |
| var args = [], len = arguments.length - 2; |
| while ( len-- > 0 ) args[ len ] = arguments[ len + 2 ]; |
| |
| console.debug(("[JS Framework] define a component " + name)); |
| |
| // adapt args: |
| // 1. name, deps[], factory() |
| // 2. name, factory() |
| // 3. name, definition{} |
| var factory, definition; |
| if (args.length > 1) { |
| definition = args[1]; |
| } |
| else { |
| definition = args[0]; |
| } |
| if (typeof definition === 'function') { |
| factory = definition; |
| definition = null; |
| } |
| |
| // resolve definition from factory |
| if (factory) { |
| var r = function (name) { |
| if (isWeexComponent(name)) { |
| var cleanName = removeWeexPrefix(name); |
| return requireCustomComponent(app, cleanName) |
| } |
| if (isWeexModule(name)) { |
| var cleanName$1 = removeWeexPrefix(name); |
| return app.requireModule(cleanName$1) |
| } |
| if (isNormalModule(name) || isNpmModule(name)) { |
| var cleanName$2 = removeJSSurfix(name); |
| return app.commonModules[cleanName$2] |
| } |
| }; |
| var m = { exports: {}}; |
| factory(r, m.exports, m); |
| definition = m.exports; |
| } |
| |
| // apply definition |
| if (isWeexComponent(name)) { |
| var cleanName = removeWeexPrefix(name); |
| registerCustomComponent(app, cleanName, definition); |
| } |
| else if (isWeexModule(name)) { |
| var cleanName$1 = removeWeexPrefix(name); |
| var obj; |
| initModules(( obj = {}, obj[cleanName$1] = definition, obj )); |
| } |
| else if (isNormalModule(name)) { |
| var cleanName$2 = removeJSSurfix(name); |
| app.commonModules[cleanName$2] = definition; |
| } |
| else if (isNpmModule(name)) { |
| var cleanName$3 = removeJSSurfix(name); |
| if (definition.template || |
| definition.style || |
| definition.methods) { |
| // downgrade to old define method (define('componentName', factory)) |
| // the exports contain one key of template, style or methods |
| // but it has risk!!! |
| registerCustomComponent(app, cleanName$3, definition); |
| } |
| else { |
| app.commonModules[cleanName$3] = definition; |
| } |
| } |
| }; |
| |
| /** |
| * @deprecated |
| */ |
| function register$2 (app, type, options) { |
| console.warn('[JS Framework] Register is deprecated, please install lastest transformer.'); |
| registerCustomComponent(app, type, options); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * api that invoked by js bundle code |
| * |
| * - define(name, factory): define a new composed component type |
| * - bootstrap(type, config, data): require a certain type & |
| * render with (optional) data |
| * |
| * deprecated: |
| * - register(type, options): register a new composed component type |
| * - render(type, data): render by a certain type with (optional) data |
| * - require(type)(data): require a type then render with data |
| */ |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * instance controls from native |
| * |
| * - fire event |
| * - callback |
| * - refresh |
| * - destroy |
| * |
| * corresponded with the API of instance manager (framework.js) |
| */ |
| /** |
| * Refresh an app with data to its root component options. |
| * @param {object} app |
| * @param {any} data |
| */ |
| function refresh$1 (app, data) { |
| console.debug("[JS Framework] Refresh with", data, |
| ("in instance[" + (app.id) + "]")); |
| var vm = app.vm; |
| if (vm && data) { |
| if (typeof vm.refreshData === 'function') { |
| vm.refreshData(data); |
| } |
| else { |
| extend(vm, data); |
| } |
| app.differ.flush(); |
| app.doc.taskCenter.send('dom', { action: 'refreshFinish' }, []); |
| return |
| } |
| return new Error(("invalid data \"" + data + "\"")) |
| } |
| |
| /** |
| * Destroy an app. |
| * @param {object} app |
| */ |
| function destroy$1 (app) { |
| console.debug(("[JS Framework] Destory an instance(" + (app.id) + ")")); |
| |
| if (app.vm) { |
| destroyVm(app.vm); |
| } |
| |
| app.id = ''; |
| app.options = null; |
| app.blocks = null; |
| app.vm = null; |
| app.doc.taskCenter.destroyCallback(); |
| app.doc.destroy(); |
| app.doc = null; |
| app.customComponentMap = null; |
| app.commonModules = null; |
| } |
| |
| /** |
| * Destroy an Vm. |
| * @param {object} vm |
| */ |
| function destroyVm (vm) { |
| delete vm._app; |
| delete vm._computed; |
| delete vm._css; |
| delete vm._data; |
| delete vm._ids; |
| delete vm._methods; |
| delete vm._options; |
| delete vm._parent; |
| delete vm._parentEl; |
| delete vm._rootEl; |
| |
| // remove all watchers |
| if (vm._watchers) { |
| var watcherCount = vm._watchers.length; |
| while (watcherCount--) { |
| vm._watchers[watcherCount].teardown(); |
| } |
| delete vm._watchers; |
| } |
| |
| // destroy child vms recursively |
| if (vm._childrenVms) { |
| var vmCount = vm._childrenVms.length; |
| while (vmCount--) { |
| destroyVm(vm._childrenVms[vmCount]); |
| } |
| delete vm._childrenVms; |
| } |
| |
| console.debug(("[JS Framework] \"destroyed\" lifecycle in Vm(" + (vm._type) + ")")); |
| vm.$emit('hook:destroyed'); |
| |
| delete vm._type; |
| delete vm._vmEvents; |
| } |
| |
| /** |
| * Get a JSON object to describe the document body. |
| * @param {object} app |
| * @return {object} |
| */ |
| function getRootElement (app) { |
| var doc = app.doc || {}; |
| var body = doc.body || {}; |
| return body.toJSON ? body.toJSON() : {} |
| } |
| |
| /** |
| * Fire an event from renderer. The event has type, an event object and an |
| * element ref. If the event comes with some virtual-DOM changes, it should |
| * have one more parameter to describe the changes. |
| * @param {object} app |
| * @param {string} ref |
| * @param {type} type |
| * @param {object} e |
| * @param {object} domChanges |
| */ |
| function fireEvent$1 (app, ref, type, e, domChanges) { |
| console.debug(("[JS Framework] Fire a \"" + type + "\" event on an element(" + ref + ") in instance(" + (app.id) + ")")); |
| if (Array.isArray(ref)) { |
| ref.some(function (ref) { |
| return fireEvent$1(app, ref, type, e) !== false |
| }); |
| return |
| } |
| var el = app.doc.getRef(ref); |
| if (el) { |
| var result = app.doc.fireEvent(el, type, e, domChanges); |
| app.differ.flush(); |
| app.doc.taskCenter.send('dom', { action: 'updateFinish' }, []); |
| return result |
| } |
| return new Error(("invalid element reference \"" + ref + "\"")) |
| } |
| |
| /** |
| * Make a callback for a certain app. |
| * @param {object} app |
| * @param {number} callbackId |
| * @param {any} data |
| * @param {boolean} ifKeepAlive |
| */ |
| function callback$1 (app, callbackId, data, ifKeepAlive) { |
| console.debug(("[JS Framework] Invoke a callback(" + callbackId + ") with"), data, |
| ("in instance(" + (app.id) + ")")); |
| var result = app.doc.taskCenter.callback(callbackId, data, ifKeepAlive); |
| updateActions(app); |
| app.doc.taskCenter.send('dom', { action: 'updateFinish' }, []); |
| return result |
| } |
| |
| /** |
| * Collect all virtual-DOM mutations together and send them to renderer. |
| * @param {object} app |
| */ |
| function updateActions (app) { |
| app.differ.flush(); |
| } |
| |
| /** |
| * Call all tasks from an app to renderer (native). |
| * @param {object} app |
| * @param {array} tasks |
| */ |
| function callTasks (app, tasks) { |
| var result; |
| |
| /* istanbul ignore next */ |
| if (typof$1(tasks) !== 'array') { |
| tasks = [tasks]; |
| } |
| |
| tasks.forEach(function (task) { |
| result = app.doc.taskCenter.send( |
| 'module', |
| { |
| module: task.module, |
| method: task.method |
| }, |
| task.args |
| ); |
| }); |
| |
| return result |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * instance controls from native |
| * |
| * - init bundle |
| * |
| * corresponded with the API of instance manager (framework.js) |
| */ |
| |
| /** |
| * Init an app by run code witgh data |
| * @param {object} app |
| * @param {string} code |
| * @param {object} data |
| */ |
| function init$5 (app, code, data, services) { |
| console.debug('[JS Framework] Intialize an instance with:\n', data); |
| var result; |
| |
| // prepare app env methods |
| var bundleDefine = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| return defineFn.apply(void 0, [ app ].concat( args )); |
| }; |
| var bundleBootstrap = function (name, config, _data) { |
| result = bootstrap(app, name, config, _data || data); |
| updateActions(app); |
| app.doc.listener.createFinish(); |
| console.debug(("[JS Framework] After intialized an instance(" + (app.id) + ")")); |
| }; |
| var bundleVm = Vm; |
| /* istanbul ignore next */ |
| var bundleRegister = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| return register$2.apply(void 0, [ app ].concat( args )); |
| }; |
| /* istanbul ignore next */ |
| var bundleRender = function (name, _data) { |
| result = bootstrap(app, name, {}, _data); |
| }; |
| /* istanbul ignore next */ |
| var bundleRequire = function (name) { return function (_data) { |
| result = bootstrap(app, name, {}, _data); |
| }; }; |
| var bundleDocument = app.doc; |
| /* istanbul ignore next */ |
| var bundleRequireModule = function (name) { return app.requireModule(removeWeexPrefix(name)); }; |
| |
| var weexGlobalObject = { |
| config: app.options, |
| define: bundleDefine, |
| bootstrap: bundleBootstrap, |
| requireModule: bundleRequireModule, |
| document: bundleDocument, |
| Vm: bundleVm |
| }; |
| |
| Object.freeze(weexGlobalObject); |
| |
| // prepare code |
| var functionBody; |
| /* istanbul ignore if */ |
| if (typeof code === 'function') { |
| // `function () {...}` -> `{...}` |
| // not very strict |
| functionBody = code.toString().substr(12); |
| } |
| /* istanbul ignore next */ |
| else if (code) { |
| functionBody = code.toString(); |
| } |
| // wrap IFFE and use strict mode |
| functionBody = "(function(global){\n\n\"use strict\";\n\n " + functionBody + " \n\n})(Object.create(this))"; |
| |
| // run code and get result |
| var WXEnvironment = global.WXEnvironment; |
| var timerAPIs = {}; |
| |
| /* istanbul ignore if */ |
| if (WXEnvironment && WXEnvironment.platform !== 'Web') { |
| // timer APIs polyfill in native |
| var timer = app.requireModule('timer'); |
| Object.assign(timerAPIs, { |
| setTimeout: function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| var handler = function () { |
| args[0].apply(args, args.slice(2)); |
| }; |
| timer.setTimeout(handler, args[1]); |
| return app.doc.taskCenter.callbackManager.lastCallbackId.toString() |
| }, |
| setInterval: function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| var handler = function () { |
| args[0].apply(args, args.slice(2)); |
| }; |
| timer.setInterval(handler, args[1]); |
| return app.doc.taskCenter.callbackManager.lastCallbackId.toString() |
| }, |
| clearTimeout: function (n) { |
| timer.clearTimeout(n); |
| }, |
| clearInterval: function (n) { |
| timer.clearInterval(n); |
| } |
| }); |
| } |
| // run code and get result |
| var globalObjects = Object.assign({ |
| define: bundleDefine, |
| require: bundleRequire, |
| bootstrap: bundleBootstrap, |
| register: bundleRegister, |
| render: bundleRender, |
| __weex_define__: bundleDefine, // alias for define |
| __weex_bootstrap__: bundleBootstrap, // alias for bootstrap |
| __weex_document__: bundleDocument, |
| __weex_require__: bundleRequireModule, |
| __weex_viewmodel__: bundleVm, |
| weex: weexGlobalObject |
| }, timerAPIs, services); |
| if (!callFunctionNative(globalObjects, functionBody)) { |
| // If failed to compile functionBody on native side, |
| // fallback to callFunction. |
| callFunction(globalObjects, functionBody); |
| } |
| |
| return result |
| } |
| |
| /** |
| * Call a new function body with some global objects. |
| * @param {object} globalObjects |
| * @param {string} code |
| * @return {any} |
| */ |
| function callFunction (globalObjects, body) { |
| var globalKeys = []; |
| var globalValues = []; |
| for (var key in globalObjects) { |
| globalKeys.push(key); |
| globalValues.push(globalObjects[key]); |
| } |
| globalKeys.push(body); |
| |
| var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) )); |
| return result.apply(void 0, globalValues) |
| } |
| |
| /** |
| * Call a new function generated on the V8 native side. |
| * @param {object} globalObjects |
| * @param {string} body |
| * @return {boolean} return true if no error occurred. |
| */ |
| function callFunctionNative (globalObjects, body) { |
| if (typeof compileAndRunBundle !== 'function') { |
| return false |
| } |
| |
| var fn = void 0; |
| var isNativeCompileOk = false; |
| var script = '(function ('; |
| var globalKeys = []; |
| var globalValues = []; |
| for (var key in globalObjects) { |
| globalKeys.push(key); |
| globalValues.push(globalObjects[key]); |
| } |
| for (var i = 0; i < globalKeys.length - 1; ++i) { |
| script += globalKeys[i]; |
| script += ','; |
| } |
| script += globalKeys[globalKeys.length - 1]; |
| script += ') {'; |
| script += body; |
| script += '} )'; |
| |
| try { |
| var weex = globalObjects.weex || {}; |
| var config = weex.config || {}; |
| fn = compileAndRunBundle(script, |
| config.bundleUrl, |
| config.bundleDigest, |
| config.codeCachePath); |
| if (fn && typeof fn === 'function') { |
| fn.apply(void 0, globalValues); |
| isNativeCompileOk = true; |
| } |
| } |
| catch (e) { |
| console.error(e); |
| } |
| |
| return isNativeCompileOk |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * instance controls from native |
| * |
| * - init bundle |
| * - fire event |
| * - callback |
| * - destroy |
| * |
| * corresponded with the API of instance manager (framework.js) |
| */ |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var Differ = function Differ (id) { |
| this.id = id; |
| this.map = []; |
| this.hooks = []; |
| }; |
| Differ.prototype.isEmpty = function isEmpty () { |
| return this.map.length === 0 |
| }; |
| Differ.prototype.append = function append (type, depth, ref, handler) { |
| var this$1 = this; |
| |
| if (!this.hasTimer) { |
| this.hasTimer = true; |
| setTimeout(function () { |
| this$1.hasTimer = false; |
| this$1.flush(true); |
| }, 0); |
| } |
| var map = this.map; |
| if (!map[depth]) { |
| map[depth] = {}; |
| } |
| var group = map[depth]; |
| if (!group[type]) { |
| group[type] = {}; |
| } |
| if (type === 'element') { |
| if (!group[type][ref]) { |
| group[type][ref] = []; |
| } |
| group[type][ref].push(handler); |
| } |
| else { |
| group[type][ref] = handler; |
| } |
| }; |
| Differ.prototype.flush = function flush (isTimeout) { |
| var map = this.map.slice(); |
| this.map.length = 0; |
| map.forEach(function (group) { |
| callTypeMap(group, 'repeat'); |
| callTypeMap(group, 'shown'); |
| callTypeList(group, 'element'); |
| }); |
| |
| var hooks = this.hooks.slice(); |
| this.hooks.length = 0; |
| hooks.forEach(function (fn) { |
| fn(); |
| }); |
| |
| if (!this.isEmpty()) { |
| this.flush(); |
| } |
| }; |
| Differ.prototype.then = function then (fn) { |
| this.hooks.push(fn); |
| }; |
| |
| function callTypeMap (group, type) { |
| var map = group[type]; |
| for (var ref in map) { |
| map[ref](); |
| } |
| } |
| |
| function callTypeList (group, type) { |
| var map = group[type]; |
| for (var ref in map) { |
| var list = map[ref]; |
| list.forEach(function (handler) { handler(); }); |
| } |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * Weex App constructor & definition |
| */ |
| |
| /** |
| * App constructor for Weex framework. |
| * @param {string} id |
| * @param {object} options |
| */ |
| function App$1 (id, options) { |
| this.id = id; |
| this.options = options || {}; |
| this.vm = null; |
| this.customComponentMap = {}; |
| this.commonModules = {}; |
| |
| // document |
| this.doc = new config$3.Document( |
| id, |
| this.options.bundleUrl, |
| null, |
| config$3.Listener |
| ); |
| this.differ = new Differ(id); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * Weex instance constructor & definition |
| */ |
| |
| /** |
| * @deprecated |
| */ |
| App$1.prototype.requireModule = function (name) { |
| return requireModule(this, name) |
| }; |
| |
| /** |
| * @deprecated |
| */ |
| App$1.prototype.updateActions = function () { |
| return updateActions(this) |
| }; |
| |
| /** |
| * @deprecated |
| */ |
| App$1.prototype.callTasks = function (tasks) { |
| return callTasks(this, tasks) |
| }; |
| |
| /** |
| * Prevent modification of App and App.prototype |
| */ |
| Object.freeze(App$1); |
| Object.freeze(App$1.prototype); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var instanceMap$2 = {}; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * Create a Weex instance. |
| * |
| * @param {string} id |
| * @param {string} code |
| * @param {object} options |
| * option `HAS_LOG` enable print log |
| * @param {object} data |
| * @param {object} info { created, ... services } |
| */ |
| function createInstance$3 (id, code, options, data, info) { |
| var ref = info || {}; |
| var services = ref.services; |
| resetTarget(); |
| var instance = instanceMap$2[id]; |
| /* istanbul ignore else */ |
| options = options || {}; |
| var result; |
| /* istanbul ignore else */ |
| if (!instance) { |
| instance = new App$1(id, options); |
| instanceMap$2[id] = instance; |
| result = init$5(instance, code, data, services); |
| } |
| else { |
| result = new Error(("invalid instance id \"" + id + "\"")); |
| } |
| return (result instanceof Error) ? result : instance |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * Init config informations for Weex framework |
| * @param {object} cfg |
| */ |
| function init$6 (cfg) { |
| config$3.Document = cfg.Document; |
| config$3.Element = cfg.Element; |
| config$3.Comment = cfg.Comment; |
| config$3.sendTasks = cfg.sendTasks; |
| config$3.Listener = cfg.Listener; |
| } |
| |
| /** |
| * Refresh a Weex instance with data. |
| * |
| * @param {string} id |
| * @param {object} data |
| */ |
| function refreshInstance$1 (id, data) { |
| var instance = instanceMap$2[id]; |
| var result; |
| /* istanbul ignore else */ |
| if (instance) { |
| result = refresh$1(instance, data); |
| } |
| else { |
| result = new Error(("invalid instance id \"" + id + "\"")); |
| } |
| return result |
| } |
| |
| /** |
| * Destroy a Weex instance. |
| * @param {string} id |
| */ |
| function destroyInstance$2 (id) { |
| // Markup some global state in native side |
| if (typeof markupState === 'function') { |
| markupState(); |
| } |
| |
| resetTarget(); |
| var instance = instanceMap$2[id]; |
| /* istanbul ignore else */ |
| if (!instance) { |
| return new Error(("invalid instance id \"" + id + "\"")) |
| } |
| destroy$1(instance); |
| delete instanceMap$2[id]; |
| // notifyContextDisposed is used to tell v8 to do a full GC, |
| // but this would have a negative performance impact on weex, |
| // because all the inline cache in v8 would get cleared |
| // during a full GC. |
| // To take care of both memory and performance, just tell v8 |
| // to do a full GC every eighteen times. |
| var idNum = Math.round(id); |
| var round = 18; |
| if (idNum > 0) { |
| var remainder = idNum % round; |
| if (!remainder && typeof notifyTrimMemory === 'function') { |
| notifyTrimMemory(); |
| } |
| } |
| return instanceMap$2 |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var nativeComponentMap$1 = config$3.nativeComponentMap; |
| |
| /** |
| * Register the name of each native component. |
| * @param {array} components array of name |
| */ |
| function registerComponents$1 (components) { |
| if (Array.isArray(components)) { |
| components.forEach(function register (name) { |
| /* istanbul ignore if */ |
| if (!name) { |
| return |
| } |
| if (typeof name === 'string') { |
| nativeComponentMap$1[name] = true; |
| } |
| /* istanbul ignore else */ |
| else if (typeof name === 'object' && typeof name.type === 'string') { |
| nativeComponentMap$1[name.type] = name; |
| } |
| }); |
| } |
| } |
| |
| /** |
| * Register the name and methods of each module. |
| * @param {object} modules a object of modules |
| */ |
| function registerModules$1 (modules) { |
| /* istanbul ignore else */ |
| if (typeof modules === 'object') { |
| initModules(modules); |
| } |
| } |
| |
| /** |
| * Register the name and methods of each api. |
| * @param {object} apis a object of apis |
| */ |
| function registerMethods (methods) { |
| /* istanbul ignore else */ |
| if (typeof methods === 'object') { |
| initMethods$1(Vm, methods); |
| } |
| } |
| |
| // @todo: Hack for this framework only. Will be re-designed or removed later. |
| global.registerMethods = registerMethods; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var jsHandlers = { |
| fireEvent: function (id) { |
| var args = [], len = arguments.length - 1; |
| while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ]; |
| |
| return fireEvent$1.apply(void 0, [ instanceMap$2[id] ].concat( args )) |
| }, |
| callback: function (id) { |
| var args = [], len = arguments.length - 1; |
| while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ]; |
| |
| return callback$1.apply(void 0, [ instanceMap$2[id] ].concat( args )) |
| } |
| }; |
| |
| /** |
| * Accept calls from native (event or callback). |
| * |
| * @param {string} id |
| * @param {array} tasks list with `method` and `args` |
| */ |
| function receiveTasks$2 (id, tasks) { |
| var instance = instanceMap$2[id]; |
| if (instance && Array.isArray(tasks)) { |
| var results = []; |
| tasks.forEach(function (task) { |
| var handler = jsHandlers[task.method]; |
| var args = [].concat( task.args ); |
| /* istanbul ignore else */ |
| if (typeof handler === 'function') { |
| args.unshift(id); |
| results.push(handler.apply(void 0, args)); |
| } |
| }); |
| return results |
| } |
| return new Error(("invalid instance id \"" + id + "\" or tasks")) |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * Get a whole element tree of an instance for debugging. |
| * @param {string} id |
| * @return {object} a virtual dom tree |
| */ |
| function getRoot$2 (id) { |
| var instance = instanceMap$2[id]; |
| var result; |
| /* istanbul ignore else */ |
| if (instance) { |
| result = getRootElement(instance); |
| } |
| else { |
| result = new Error(("invalid instance id \"" + id + "\"")); |
| } |
| return result |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview Weex framework entry. |
| */ |
| |
| // register special methods for Weex framework |
| registerMethods(methods$1); |
| |
| /** |
| * Prevent modification of Vm and Vm.prototype |
| */ |
| Object.freeze(Vm); |
| |
| |
| |
| |
| var Weex$2 = Object.freeze({ |
| registerComponents: registerComponents$1, |
| registerModules: registerModules$1, |
| registerMethods: registerMethods, |
| createInstance: createInstance$3, |
| init: init$6, |
| refreshInstance: refreshInstance$1, |
| destroyInstance: destroyInstance$2, |
| receiveTasks: receiveTasks$2, |
| getRoot: getRoot$2 |
| }); |
| |
| var framework_weex = createCommonjsModule(function (module) { |
| module.exports = /******/ (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 = 3); |
| /******/ }) |
| /************************************************************************/ |
| /******/ ([ |
| /* 0 */ |
| /*!***********************************************************************************!*\ |
| !*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/commons.js ***! |
| \***********************************************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| /** |
| * @author Toru Nagashima |
| * @copyright 2015 Toru Nagashima. All rights reserved. |
| * See LICENSE file in root directory for full license. |
| */ |
| |
| |
| /** |
| * Creates a unique key. |
| * |
| * @param {string} name - A name to create. |
| * @returns {symbol|string} Generated unique key. |
| * @private |
| */ |
| var createUniqueKey = module.exports.createUniqueKey = ( |
| typeof Symbol !== "undefined" ? Symbol : //eslint-disable-line no-undef |
| /* otherwise */ function createUniqueKey(name) { |
| return "[[" + name + "_" + Math.random().toFixed(8).slice(2) + "]]" |
| } |
| ); |
| |
| /** |
| * Checks whether the given value is a non-null object or not. |
| * |
| * @param {any} x - The value to be check. |
| * @returns {boolean} `true` if the value is a non-null object. |
| * @private |
| */ |
| var isObject = module.exports.isObject = function isObject(x) { |
| return typeof x === "object" && x !== null |
| }; |
| |
| /** |
| * The key of listeners. |
| * |
| * @type {symbol|string} |
| * @private |
| */ |
| module.exports.LISTENERS = createUniqueKey("listeners"); |
| |
| /** |
| * A value of kind for listeners which are registered in the capturing phase. |
| * |
| * @type {number} |
| * @private |
| */ |
| module.exports.CAPTURE = 1; |
| |
| /** |
| * A value of kind for listeners which are registered in the bubbling phase. |
| * |
| * @type {number} |
| * @private |
| */ |
| module.exports.BUBBLE = 2; |
| |
| /** |
| * A value of kind for listeners which are registered as an attribute. |
| * |
| * @type {number} |
| * @private |
| */ |
| module.exports.ATTRIBUTE = 3; |
| |
| /** |
| * @typedef object ListenerNode |
| * @property {function} listener - A listener function. |
| * @property {number} kind - The kind of the listener. |
| * @property {ListenerNode|null} next - The next node. |
| * If this node is the last, this is `null`. |
| */ |
| |
| /** |
| * Creates a node of singly linked list for a list of listeners. |
| * |
| * @param {function} listener - A listener function. |
| * @param {number} kind - The kind of the listener. |
| * @param {object} [options] - The option object. |
| * @param {boolean} [options.once] - The flag to remove the listener at the first call. |
| * @param {boolean} [options.passive] - The flag to ignore `event.preventDefault` method. |
| * @returns {ListenerNode} The created listener node. |
| */ |
| module.exports.newNode = function newNode(listener, kind, options) { |
| var obj = isObject(options); |
| |
| return { |
| listener: listener, |
| kind: kind, |
| once: obj && Boolean(options.once), |
| passive: obj && Boolean(options.passive), |
| next: null, |
| } |
| }; |
| |
| |
| /***/ }), |
| /* 1 */ |
| /*!****************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/emitter.js ***! |
| \****************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| var EventEmitter = function () { |
| function EventEmitter() { |
| _classCallCheck(this, EventEmitter); |
| |
| this._listeners = {}; |
| } |
| |
| /** |
| * Adds a listener function to the specified event. |
| * @param {String} type |
| * @param {Function} listener |
| * @param {Boolean} once |
| */ |
| |
| |
| _createClass(EventEmitter, [{ |
| key: "_addListener", |
| value: function _addListener(type, listener, once) { |
| this._listeners[type] = this._listeners[type] || []; |
| this._listeners[type].push({ listener: listener, once: once }); |
| return this; |
| } |
| |
| /** |
| * Adds a listener function to the specified event. |
| * @param {String} type |
| * @param {Function} listener |
| * @return {Object} Current instance of EventEmitter for chaining. |
| */ |
| |
| }, { |
| key: "on", |
| value: function on(type, listener) { |
| return this._addListener(type, listener, false); |
| } |
| }, { |
| key: "once", |
| value: function once(type, listener) { |
| return this._addListener(type, listener, true); |
| } |
| |
| /** |
| * Removes a listener function to the specified event. |
| * @param {String} type |
| * @param {Function} listener |
| * @return {Object} Current instance of EventEmitter for chaining. |
| */ |
| |
| }, { |
| key: "off", |
| value: function off(type, listener) { |
| // alias |
| if (!this._listeners[type]) { |
| return this; |
| } |
| if (!this._listeners[type].length) { |
| return this; |
| } |
| if (!listener) { |
| delete this._listeners[type]; |
| return this; |
| } |
| this._listeners[type] = this._listeners[type].filter(function (_listener) { |
| return !(_listener.listener === listener); |
| }); |
| return this; |
| } |
| |
| /** |
| * Emits an specified event. |
| * @param {String} type |
| * @param {Object} payload |
| * @return {Object} Current instance of EventEmitter for chaining. |
| */ |
| |
| }, { |
| key: "emit", |
| value: function emit(type, payload) { |
| var _this = this; |
| |
| if (!this._listeners[type]) { |
| return this; |
| } |
| this._listeners[type].forEach(function (_listener) { |
| _listener.listener.apply(_this, [payload]); |
| if (_listener.once) { |
| _this.removeListener(type, _listener.listener); |
| } |
| }); |
| return this; |
| } |
| }]); |
| |
| return EventEmitter; |
| }(); |
| |
| exports.default = EventEmitter; |
| module.exports = exports["default"]; |
| |
| /***/ }), |
| /* 2 */ |
| /*!****************************************************************************************!*\ |
| !*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/event-target.js ***! |
| \****************************************************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| /** |
| * @author Toru Nagashima |
| * @copyright 2015 Toru Nagashima. All rights reserved. |
| * See LICENSE file in root directory for full license. |
| */ |
| |
| |
| //------------------------------------------------------------------------------ |
| // Requirements |
| //------------------------------------------------------------------------------ |
| |
| /*globals window */ |
| |
| var Commons = __webpack_require__(/*! ./commons */ 0); |
| var CustomEventTarget = __webpack_require__(/*! ./custom-event-target */ 15); |
| var EventWrapper = __webpack_require__(/*! ./event-wrapper */ 16); |
| var isObject = Commons.isObject; |
| var LISTENERS = Commons.LISTENERS; |
| var CAPTURE = Commons.CAPTURE; |
| var BUBBLE = Commons.BUBBLE; |
| var ATTRIBUTE = Commons.ATTRIBUTE; |
| var newNode = Commons.newNode; |
| var defineCustomEventTarget = CustomEventTarget.defineCustomEventTarget; |
| var createEventWrapper = EventWrapper.createEventWrapper; |
| var STOP_IMMEDIATE_PROPAGATION_FLAG = EventWrapper.STOP_IMMEDIATE_PROPAGATION_FLAG; |
| var PASSIVE_LISTENER_FLAG = EventWrapper.PASSIVE_LISTENER_FLAG; |
| |
| //------------------------------------------------------------------------------ |
| // Constants |
| //------------------------------------------------------------------------------ |
| |
| /** |
| * A flag which shows there is the native `EventTarget` interface object. |
| * |
| * @type {boolean} |
| * @private |
| */ |
| var HAS_EVENTTARGET_INTERFACE = ( |
| typeof window !== "undefined" && |
| typeof window.EventTarget !== "undefined" |
| ); |
| |
| //------------------------------------------------------------------------------ |
| // Public Interface |
| //------------------------------------------------------------------------------ |
| |
| /** |
| * An implementation for `EventTarget` interface. |
| * |
| * @constructor |
| * @public |
| */ |
| var EventTarget = module.exports = function EventTarget() { |
| var arguments$1 = arguments; |
| |
| if (this instanceof EventTarget) { |
| // this[LISTENERS] is a Map. |
| // Its key is event type. |
| // Its value is ListenerNode object or null. |
| // |
| // interface ListenerNode { |
| // var listener: Function |
| // var kind: CAPTURE|BUBBLE|ATTRIBUTE |
| // var next: ListenerNode|null |
| // } |
| Object.defineProperty(this, LISTENERS, {value: Object.create(null)}); |
| } |
| else if (arguments.length === 1 && Array.isArray(arguments[0])) { |
| return defineCustomEventTarget(EventTarget, arguments[0]) |
| } |
| else if (arguments.length > 0) { |
| var types = Array(arguments.length); |
| for (var i = 0; i < arguments.length; ++i) { |
| types[i] = arguments$1[i]; |
| } |
| |
| // To use to extend with attribute listener properties. |
| // e.g. |
| // class MyCustomObject extends EventTarget("message", "error") { |
| // //... |
| // } |
| return defineCustomEventTarget(EventTarget, types) |
| } |
| else { |
| throw new TypeError("Cannot call a class as a function") |
| } |
| }; |
| |
| EventTarget.prototype = Object.create( |
| (HAS_EVENTTARGET_INTERFACE ? window.EventTarget : Object).prototype, |
| { |
| constructor: { |
| value: EventTarget, |
| writable: true, |
| configurable: true, |
| }, |
| |
| addEventListener: { |
| value: function addEventListener(type, listener, options) { |
| if (listener == null) { |
| return false |
| } |
| if (typeof listener !== "function" && typeof listener !== "object") { |
| throw new TypeError("\"listener\" is not an object.") |
| } |
| |
| var capture = isObject(options) ? Boolean(options.capture) : Boolean(options); |
| var kind = (capture ? CAPTURE : BUBBLE); |
| var node = this[LISTENERS][type]; |
| if (node == null) { |
| this[LISTENERS][type] = newNode(listener, kind, options); |
| return true |
| } |
| |
| var prev = null; |
| while (node != null) { |
| if (node.listener === listener && node.kind === kind) { |
| // Should ignore a duplicated listener. |
| return false |
| } |
| prev = node; |
| node = node.next; |
| } |
| |
| prev.next = newNode(listener, kind, options); |
| return true |
| }, |
| configurable: true, |
| writable: true, |
| }, |
| |
| removeEventListener: { |
| value: function removeEventListener(type, listener, options) { |
| var this$1 = this; |
| |
| if (listener == null) { |
| return false |
| } |
| |
| var capture = isObject(options) ? Boolean(options.capture) : Boolean(options); |
| var kind = (capture ? CAPTURE : BUBBLE); |
| var prev = null; |
| var node = this[LISTENERS][type]; |
| while (node != null) { |
| if (node.listener === listener && node.kind === kind) { |
| if (prev == null) { |
| this$1[LISTENERS][type] = node.next; |
| } |
| else { |
| prev.next = node.next; |
| } |
| return true |
| } |
| |
| prev = node; |
| node = node.next; |
| } |
| |
| return false |
| }, |
| configurable: true, |
| writable: true, |
| }, |
| |
| dispatchEvent: { |
| value: function dispatchEvent(event) { |
| var this$1 = this; |
| |
| // If listeners aren't registered, terminate. |
| var type = event.type; |
| var node = this[LISTENERS][type]; |
| if (node == null) { |
| return true |
| } |
| |
| // Since we cannot rewrite several properties, so wrap object. |
| var wrapped = createEventWrapper(event, this); |
| |
| // This doesn't process capturing phase and bubbling phase. |
| // This isn't participating in a tree. |
| var prev = null; |
| while (node != null) { |
| // Remove this listener if it's once |
| if (node.once) { |
| if (prev == null) { |
| this$1[LISTENERS][type] = node.next; |
| } |
| else { |
| prev.next = node.next; |
| } |
| } |
| else { |
| prev = node; |
| } |
| |
| // Call this listener |
| wrapped[PASSIVE_LISTENER_FLAG] = node.passive; |
| if (typeof node.listener === "function") { |
| node.listener.call(this$1, wrapped); |
| } |
| else if (node.kind !== ATTRIBUTE && typeof node.listener.handleEvent === "function") { |
| node.listener.handleEvent(wrapped); |
| } |
| |
| // Break if `event.stopImmediatePropagation` was called. |
| if (wrapped[STOP_IMMEDIATE_PROPAGATION_FLAG]) { |
| break |
| } |
| |
| node = node.next; |
| } |
| |
| return !wrapped.defaultPrevented |
| }, |
| configurable: true, |
| writable: true, |
| }, |
| } |
| ); |
| |
| |
| /***/ }), |
| /* 3 */ |
| /*!**************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/index.js ***! |
| \**************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) { break; } } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) { _i["return"](); } } finally { if (_d) { throw _e; } } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); |
| |
| var _extends = Object.assign || function (target) { |
| var arguments$1 = arguments; |
| for (var i = 1; i < arguments.length; i++) { var source = arguments$1[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| exports.getInstance = getInstance; |
| exports.init = init; |
| exports.registerComponents = registerComponents; |
| exports.registerMethods = registerMethods; |
| exports.registerModules = registerModules; |
| exports.createInstance = createInstance; |
| exports.refreshInstance = refreshInstance; |
| exports.destroyInstance = destroyInstance; |
| exports.getRoot = getRoot; |
| exports.receiveTasks = receiveTasks; |
| |
| var _builtin = __webpack_require__(/*! ./builtin */ 4); |
| |
| var _emitter = __webpack_require__(/*! ./emitter */ 1); |
| |
| var _emitter2 = _interopRequireDefault(_emitter); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| var NativeComponents = {}; |
| var NativeModules = {}; |
| |
| var Document = void 0; |
| var Element = void 0; |
| var Comment = void 0; |
| |
| var MODULE_NAME_PREFIX = '@weex-module/'; |
| var MODAL_MODULE = MODULE_NAME_PREFIX + 'modal'; |
| var NAVIGATOR_MODULE = MODULE_NAME_PREFIX + 'navigator'; |
| // Instance hub |
| var instances = {}; |
| // Bundles hub |
| var bundles = {}; |
| var noop = function noop() {}; |
| |
| function dispatchEventToInstance(event, targetOrigin) { |
| var instance; |
| for (var i in instances) { |
| if (instances.hasOwnProperty(i)) { |
| instance = instances[i]; |
| if (targetOrigin === '*' || targetOrigin === instance.origin) { |
| event.target = instance.window; |
| // FIXME: Need async? |
| instance.window.dispatchEvent(event); |
| } |
| } |
| } |
| } |
| |
| function updateFinish(doc) { |
| doc.taskCenter.send('dom', { action: 'updateFinish' }, []); |
| } |
| |
| function getInstance(instanceId) { |
| var instance = instances[instanceId]; |
| if (!instance) { |
| throw new Error('Invalid instance id "' + instanceId + '"'); |
| } |
| return instance; |
| } |
| |
| function init(config) { |
| Document = config.Document; |
| Element = config.Element; |
| Comment = config.Comment; |
| } |
| |
| /** |
| * register the name of each native component |
| * @param {array} components array of name |
| */ |
| function registerComponents(components) { |
| if (Array.isArray(components)) { |
| components.forEach(function register(name) { |
| /* istanbul ignore if */ |
| if (!name) { |
| return; |
| } |
| if (typeof name === 'string') { |
| NativeComponents[name] = true; |
| } else if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object' && typeof name.type === 'string') { |
| NativeComponents[name.type] = name; |
| } |
| }); |
| } |
| } |
| |
| /** |
| * register the name and methods of each api |
| * @param {object} apis a object of apis |
| */ |
| function registerMethods(apis) {} |
| // Noop |
| |
| |
| /** |
| * register the name and methods of each module |
| * @param {object} modules a object of modules |
| */ |
| function registerModules(newModules) { |
| if ((typeof newModules === 'undefined' ? 'undefined' : _typeof(newModules)) === 'object') { |
| for (var name in newModules) { |
| if (Object.prototype.hasOwnProperty.call(newModules, name)) { |
| NativeModules[name] = newModules[name]; |
| } |
| } |
| } |
| } |
| |
| function genBuiltinModules(modules, moduleFactories, context) { |
| for (var moduleName in moduleFactories) { |
| modules[moduleName] = { |
| factory: moduleFactories[moduleName].bind(context), |
| module: { exports: {} }, |
| isInitialized: false |
| }; |
| } |
| return modules; |
| } |
| |
| function genNativeModules(modules, document) { |
| if ((typeof NativeModules === 'undefined' ? 'undefined' : _typeof(NativeModules)) === 'object') { |
| var _loop = function _loop(name) { |
| var moduleName = MODULE_NAME_PREFIX + name; |
| modules[moduleName] = { |
| module: { exports: {} }, |
| isInitialized: true |
| }; |
| |
| NativeModules[name].forEach(function (method) { |
| if (typeof method === 'string') { |
| method = { |
| name: method |
| }; |
| } |
| var methodName = method.name; |
| |
| modules[moduleName].module.exports[methodName] = function () { |
| var arguments$1 = arguments; |
| |
| for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { |
| args[_key] = arguments$1[_key]; |
| } |
| |
| var options = {}; |
| var lastArg = args[args.length - 1]; |
| if (lastArg && (typeof lastArg === 'undefined' ? 'undefined' : _typeof(lastArg)) === 'object' && lastArg.__weex_options__) { |
| options = lastArg.__weex_options__; |
| // Remove the last in args |
| args.pop(); |
| } |
| // https://github.com/alibaba/weex/issues/1677 |
| return document.taskCenter.send('module', { |
| module: name, |
| method: methodName |
| }, args, options); |
| }; |
| }); |
| }; |
| |
| for (var name in NativeModules) { |
| _loop(name); |
| } |
| } |
| |
| return modules; |
| } |
| |
| /** |
| * create a Weex instance |
| * |
| * @param {string} instanceId |
| * @param {string} __weex_code__ |
| * @param {object} [__weex_options__] {bundleUrl, debug} |
| */ |
| function createInstance(instanceId, __weex_code__, __weex_options__, __weex_data__, __weex_config__) { |
| var instance = instances[instanceId]; |
| if (instance == undefined) { |
| // Mark start time |
| var responseEnd = Date.now(); |
| var __weex_env__ = (typeof WXEnvironment === 'undefined' ? 'undefined' : _typeof(WXEnvironment)) === 'object' && WXEnvironment || {}; |
| // For better performance use built-in promise first |
| var shared = __webpack_require__(/*! runtime-shared/dist/shared.function */ 6)(); |
| |
| var _Promise = typeof _Promise === 'function' ? _Promise : shared.Promise; |
| var _Symbol = typeof _Symbol === 'function' ? _Symbol : shared.Symbol; |
| var _Set = typeof _Set === 'function' ? _Set : shared.Set; |
| var _Map = typeof _Map === 'function' ? _Map : shared.Map; |
| var _WeakMap = typeof _WeakMap === 'function' ? _WeakMap : shared.WeakMap; |
| var _WeakSet = typeof _WeakSet === 'function' ? _WeakSet : shared.WeakSet; |
| var URL = shared.URL, |
| URLSearchParams = shared.URLSearchParams, |
| FontFace = shared.FontFace, |
| matchMedia = shared.matchMedia; |
| |
| var bundleUrl = __weex_options__.bundleUrl || 'about:blank'; |
| |
| if (!__weex_options__.bundleUrl) { |
| console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".'); |
| } |
| |
| var document = new Document(instanceId, bundleUrl); |
| var documentURL = new URL(bundleUrl); |
| var modules = {}; |
| |
| instance = instances[instanceId] = { |
| document: document, |
| instanceId: instanceId, |
| bundleUrl: bundleUrl, |
| bundleCode: __weex_code__, |
| modules: modules, |
| origin: documentURL.origin, |
| uid: 0 |
| }; |
| |
| // Generate native modules map at instance init |
| genNativeModules(modules, document); |
| var __weex_define__ = __webpack_require__(/*! ./define.weex */ 7)(modules); |
| var __weex_require__ = __webpack_require__(/*! ./require.weex */ 8)(modules); |
| var __weex_downgrade__ = __webpack_require__(/*! ./downgrade.weex */ 9)(__weex_require__); |
| // Extend document |
| __webpack_require__(/*! ./document.weex */ 11)(__weex_require__, document); |
| |
| var location = __webpack_require__(/*! ./location.weex */ 12)(__weex_require__, documentURL); |
| |
| var _require = __webpack_require__(/*! ./fetch.weex */ 13)(__weex_require__, _Promise), |
| fetch = _require.fetch, |
| Headers = _require.Headers, |
| Request = _require.Request, |
| Response = _require.Response; |
| |
| var XMLHttpRequest = __webpack_require__(/*! ./xmlhttprequest.weex */ 14)(__weex_require__); |
| var WebSocket = __webpack_require__(/*! ./websocket.weex */ 17)(__weex_require__); |
| |
| var _require2 = __webpack_require__(/*! ./timer.weex */ 18)(__weex_require__, document), |
| setTimeout = _require2.setTimeout, |
| clearTimeout = _require2.clearTimeout, |
| setInterval = _require2.setInterval, |
| clearInterval = _require2.clearInterval, |
| requestAnimationFrame = _require2.requestAnimationFrame, |
| cancelAnimationFrame = _require2.cancelAnimationFrame; |
| |
| var _require3 = __webpack_require__(/*! ./base64.weex */ 19)(), |
| atob = _require3.atob, |
| btoa = _require3.btoa; |
| |
| var performance = __webpack_require__(/*! ./performance.weex */ 20)(responseEnd); |
| |
| var _require4 = __webpack_require__(/*! ./event.weex */ 21)(), |
| Event = _require4.Event, |
| CustomEvent = _require4.CustomEvent; |
| |
| var windowEmitter = new _emitter2.default(); |
| |
| var window = { |
| // ES |
| Promise: _Promise, |
| Symbol: _Symbol, |
| Map: _Map, |
| Set: _Set, |
| WeakMap: _WeakMap, |
| WeakSet: _WeakSet, |
| // W3C: https://www.w3.org/TR/html5/browsers.html#browsing-context-name |
| name: '', |
| // This read-only property indicates whether the referenced window is closed or not. |
| closed: false, |
| atob: atob, |
| btoa: btoa, |
| performance: performance, |
| // W3C |
| document: document, |
| location: location, |
| // https://www.w3.org/TR/2009/WD-html5-20090423/browsers.html#dom-navigator |
| navigator: { |
| product: 'Weex', |
| platform: __weex_env__.platform, |
| appName: __weex_env__.appName, |
| appVersion: __weex_env__.appVersion, |
| // Weex/0.12 iOS/9.3 (iPhone7,2) AppName/0.12 |
| userAgent: 'Weex/' + __weex_env__.weexVersion + ' ' + __weex_env__.platform + '/' + __weex_env__.osVersion + ' (' + __weex_env__.deviceModel + ') ' + __weex_env__.appName + '/' + __weex_env__.appVersion |
| }, |
| // https://drafts.csswg.org/cssom-view/#the-screen-interface |
| screen: { |
| width: __weex_env__.deviceWidth, |
| height: __weex_env__.deviceHeight, |
| availWidth: __weex_env__.deviceWidth, |
| availHeight: __weex_env__.deviceHeight, |
| colorDepth: 24, |
| pixelDepth: 24 |
| }, |
| devicePixelRatio: __weex_env__.scale, |
| fetch: fetch, |
| Headers: Headers, |
| Response: Response, |
| Request: Request, |
| XMLHttpRequest: XMLHttpRequest, |
| URL: URL, |
| URLSearchParams: URLSearchParams, |
| FontFace: FontFace, |
| WebSocket: WebSocket, |
| Event: Event, |
| CustomEvent: CustomEvent, |
| matchMedia: matchMedia, |
| setTimeout: setTimeout, |
| clearTimeout: clearTimeout, |
| setInterval: setInterval, |
| clearInterval: clearInterval, |
| requestAnimationFrame: requestAnimationFrame, |
| cancelAnimationFrame: cancelAnimationFrame, |
| alert: function alert(message) { |
| var modal = __weex_require__(MODAL_MODULE); |
| modal.alert({ |
| message: message |
| }, function () {}); |
| }, |
| open: function open(url) { |
| var weexNavigator = __weex_require__(NAVIGATOR_MODULE); |
| weexNavigator.push({ |
| url: url, |
| animated: true |
| }, noop); |
| }, |
| close: function close() { |
| var weexNavigator = __weex_require__(NAVIGATOR_MODULE); |
| weexNavigator.close({ |
| animated: true |
| }, noop, noop); |
| }, |
| postMessage: function postMessage(message, targetOrigin) { |
| var event = { |
| origin: location.origin, |
| data: JSON.parse(JSON.stringify(message)), |
| type: 'message', |
| source: window // FIXME: maybe not export window |
| }; |
| dispatchEventToInstance(event, targetOrigin); |
| }, |
| addEventListener: function addEventListener(type, listener) { |
| windowEmitter.on(type, listener); |
| }, |
| removeEventListener: function removeEventListener(type, listener) { |
| windowEmitter.off(type, listener); |
| }, |
| dispatchEvent: function dispatchEvent(e) { |
| windowEmitter.emit(e.type, e); |
| }, |
| // ModuleJS |
| define: __weex_define__, |
| require: __weex_require__, |
| // Weex |
| __weex_document__: document, |
| __weex_define__: __weex_define__, |
| __weex_require__: __weex_require__, |
| __weex_downgrade__: __weex_downgrade__, |
| __weex_env__: __weex_env__, |
| __weex_code__: __weex_code__, |
| __weex_options__: __weex_options__, |
| __weex_data__: __weex_data__ |
| }; |
| |
| instance.window = window.self = window.window = window; |
| |
| var builtinGlobals = {}; |
| var builtinModules = {}; |
| try { |
| builtinGlobals = __weex_config__.services.builtinGlobals; |
| // Modules should wrap as module factory format |
| builtinModules = __weex_config__.services.builtinModules; |
| } catch (e) {} |
| |
| Object.assign(window, builtinGlobals); |
| |
| var moduleFactories = _extends({}, _builtin.ModuleFactories, builtinModules); |
| genBuiltinModules(modules, moduleFactories, window); |
| // In weex iOS or Android |
| if (__weex_env__.platform !== 'Web') { |
| var timing = performance.timing; |
| timing.domLoading = Date.now(); |
| |
| // Use the cached init function, if existed in bundles |
| var _init = bundles[__weex_code__] ? bundles[__weex_code__] : new Function('with(this){(function(){"use strict";\n' + __weex_code__ + '\n}).call(this)}'); |
| |
| _init.call( |
| // Context is window |
| window); |
| |
| timing.domInteractive = timing.domComplete = timing.domInteractive = Date.now(); |
| |
| // Cache the init function |
| bundles[__weex_code__] = _init; |
| } else { |
| // In weex h5 |
| var _init2 = new Function('"use strict";\n' + __weex_code__); |
| |
| _init2.call(window); |
| } |
| } else { |
| throw new Error('Instance id "' + instanceId + '" existed when create instance'); |
| } |
| } |
| |
| /** |
| * refresh a Weex instance |
| * |
| * @param {string} instanceId |
| * @param {object} data |
| */ |
| function refreshInstance(instanceId, data) { |
| var instance = getInstance(instanceId); |
| var document = instance.document; |
| document.documentElement.fireEvent('refresh', { |
| timestamp: Date.now(), |
| data: data |
| }); |
| document.taskCenter.send('dom', { action: 'refreshFinish' }, []); |
| } |
| |
| /** |
| * destroy a Weex instance |
| * @param {string} instanceId |
| */ |
| function destroyInstance(instanceId) { |
| var instance = getInstance(instanceId); |
| var bundleCode = instance.bundleCode; |
| instance.window.closed = true; |
| |
| var document = instance.document; |
| document.documentElement.fireEvent('destory', { |
| timestamp: Date.now() |
| }); |
| |
| if (document.destroy) { |
| document.destroy(); |
| } |
| |
| if (document.taskCenter && document.taskCenter.destroyCallback) { |
| document.taskCenter.destroyCallback(); |
| } |
| |
| delete instances[instanceId]; |
| delete bundles[bundleCode]; |
| } |
| |
| /** |
| * get a whole element tree of an instance |
| * for debugging |
| * @param {string} instanceId |
| * @return {object} a virtual dom tree |
| */ |
| function getRoot(instanceId) { |
| var instance = getInstance(instanceId); |
| var document = instance.document; |
| return document.toJSON ? document.toJSON() : {}; |
| } |
| |
| function fireEvent(doc, ref, type, e, domChanges) { |
| if (Array.isArray(ref)) { |
| ref.some(function (ref) { |
| return fireEvent(doc, ref, type, e) !== false; |
| }); |
| return; |
| } |
| |
| var el = doc.getRef(ref); |
| |
| if (el) { |
| var result = doc.fireEvent(el, type, e, domChanges); |
| updateFinish(doc); |
| return result; |
| } |
| |
| return new Error('Invalid element reference "' + ref + '"'); |
| } |
| |
| /** |
| * accept calls from native (event or callback) |
| * |
| * @param {string} instanceId |
| * @param {array} tasks list with `method` and `args` |
| */ |
| function receiveTasks(instanceId, tasks) { |
| var instance = getInstance(instanceId); |
| if (Array.isArray(tasks)) { |
| var document = instance.document; |
| |
| var results = []; |
| tasks.forEach(function (task) { |
| var result = void 0; |
| if (task.method === 'fireEvent') { |
| var _task$args = _slicedToArray(task.args, 4), |
| nodeId = _task$args[0], |
| type = _task$args[1], |
| data = _task$args[2], |
| domChanges = _task$args[3]; |
| |
| result = fireEvent(document, nodeId, type, data, domChanges); |
| } else if (task.method === 'callback') { |
| var _task$args2 = _slicedToArray(task.args, 3), |
| uid = _task$args2[0], |
| _data = _task$args2[1], |
| ifKeepAlive = _task$args2[2]; |
| |
| result = document.taskCenter.callback(uid, _data, ifKeepAlive); |
| updateFinish(document); |
| } |
| results.push(result); |
| }); |
| return results; |
| } |
| } |
| |
| // FIXME: Hack for rollup build "import Rax from 'weex-rax-framework'", in rollup if `module.exports` has `__esModule` key must return by export default |
| exports.default = exports; |
| |
| /***/ }), |
| /* 4 */ |
| /*!****************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/builtin.js ***! |
| \****************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| var ModuleFactories = exports.ModuleFactories = { |
| 'rax': __webpack_require__(/*! rax/dist/rax.factory */ 5) |
| }; |
| |
| /***/ }), |
| /* 5 */ |
| /*!******************************************!*\ |
| !*** ./packages/rax/dist/rax.factory.js ***! |
| \******************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports) { |
| |
| module.exports = function(require, exports, module) { |
| var __weex_document__ = this["__weex_document__"]; |
| var document = this["document"]; |
| module.exports = /******/ (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 = 15); |
| /******/ }) |
| /************************************************************************/ |
| /******/ ([ |
| /* 0 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| /* |
| * Stateful things in runtime |
| */ |
| exports.default = { |
| component: null, |
| mountID: 1, |
| sandbox: true, |
| // Roots |
| rootComponents: {}, |
| rootInstances: {}, |
| // Inject |
| hook: null, |
| driver: null, |
| monitor: null |
| }; |
| module.exports = exports["default"]; |
| |
| /***/ }), |
| /* 1 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| var _element = __webpack_require__(7); |
| |
| var _unmountComponentAtNode = __webpack_require__(8); |
| |
| var _unmountComponentAtNode2 = _interopRequireDefault(_unmountComponentAtNode); |
| |
| var _instantiateComponent = __webpack_require__(2); |
| |
| var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent); |
| |
| var _shouldUpdateComponent = __webpack_require__(4); |
| |
| var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent); |
| |
| var _root = __webpack_require__(18); |
| |
| var _root2 = _interopRequireDefault(_root); |
| |
| var _universalEnv = __webpack_require__(3); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } |
| |
| /** |
| * Instance manager |
| */ |
| var KEY = '$$instance'; |
| |
| exports.default = { |
| set: function set(node, instance) { |
| if (!node[KEY]) { |
| node[KEY] = instance; |
| // Record root instance to roots map |
| if (instance.rootID) { |
| _host2.default.rootInstances[instance.rootID] = instance; |
| _host2.default.rootComponents[instance.rootID] = instance._internal; |
| } |
| } |
| }, |
| get: function get(node) { |
| return node[KEY]; |
| }, |
| remove: function remove(node) { |
| var instance = this.get(node); |
| if (instance) { |
| node[KEY] = null; |
| if (instance.rootID) { |
| delete _host2.default.rootComponents[instance.rootID]; |
| delete _host2.default.rootInstances[instance.rootID]; |
| } |
| } |
| }, |
| render: function render(element, container) { |
| _host2.default.driver.beforeRender && _host2.default.driver.beforeRender(); |
| |
| // Real native root node is body |
| if (container == null) { |
| container = _host2.default.driver.createBody(); |
| } |
| |
| var prevRootInstance = this.get(container); |
| var hasPrevRootInstance = prevRootInstance && prevRootInstance.isRootComponent; |
| |
| if (hasPrevRootInstance) { |
| var prevRenderedComponent = prevRootInstance.getRenderedComponent(); |
| var prevElement = prevRenderedComponent._currentElement; |
| if ((0, _shouldUpdateComponent2.default)(prevElement, element)) { |
| var prevUnmaskedContext = prevRenderedComponent._context; |
| prevRenderedComponent.updateComponent(prevElement, element, prevUnmaskedContext, prevUnmaskedContext); |
| |
| return prevRootInstance; |
| } else { |
| _host2.default.hook.Reconciler.unmountComponent(prevRootInstance); |
| (0, _unmountComponentAtNode2.default)(container); |
| } |
| } |
| |
| // Handle server rendered element |
| if (_universalEnv.isWeb && container.childNodes) { |
| // Clone childNodes, Because removeChild will causing change in childNodes length |
| var childNodes = [].concat(_toConsumableArray(container.childNodes)); |
| |
| for (var i = 0; i < childNodes.length; i++) { |
| var rootChildNode = childNodes[i]; |
| if (rootChildNode.hasAttribute && rootChildNode.hasAttribute('data-rendered')) { |
| _host2.default.driver.removeChild(rootChildNode, container); |
| } |
| } |
| } |
| |
| var wrappedElement = (0, _element.createElement)(_root2.default, null, element); |
| var renderedComponent = (0, _instantiateComponent2.default)(wrappedElement); |
| var defaultContext = {}; |
| var rootInstance = renderedComponent.mountComponent(container, defaultContext); |
| this.set(container, rootInstance); |
| |
| // After render callback |
| _host2.default.driver.afterRender && _host2.default.driver.afterRender(rootInstance); |
| |
| // Devtool render new root hook |
| _host2.default.hook.Mount._renderNewRootComponent(rootInstance._internal); |
| |
| return rootInstance; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 2 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function instantiateComponent(element) { |
| var instance = void 0; |
| |
| if (element === undefined || element === null || element === false || element === true) { |
| instance = new _host2.default.EmptyComponent(); |
| } else if (Array.isArray(element)) { |
| instance = new _host2.default.FragmentComponent(element); |
| } else if ((typeof element === 'undefined' ? 'undefined' : _typeof(element)) === 'object' && element.type) { |
| // Special case string values |
| if (typeof element.type === 'string') { |
| instance = new _host2.default.NativeComponent(element); |
| } else { |
| instance = new _host2.default.CompositeComponent(element); |
| } |
| } else if (typeof element === 'string' || typeof element === 'number') { |
| instance = new _host2.default.TextComponent(element); |
| } else { |
| throw Error('Invalid element type ' + JSON.stringify(element)); |
| } |
| |
| instance._mountIndex = 0; |
| |
| return instance; |
| } |
| |
| exports.default = instantiateComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 3 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { |
| return typeof obj === "undefined" ? "undefined" : _typeof2(obj); |
| } : function (obj) { |
| return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); |
| }; |
| |
| // https://www.w3.org/TR/html5/webappapis.html#dom-navigator-appcodename |
| var isWeb = exports.isWeb = (typeof navigator === 'undefined' ? 'undefined' : _typeof(navigator)) === 'object' && (navigator.appCodeName === 'Mozilla' || navigator.product === 'Gecko'); |
| var isNode = exports.isNode = typeof process !== 'undefined' && !!(process.versions && process.versions.node); |
| var isWeex = exports.isWeex = typeof callNative === 'function'; |
| var isReactNative = exports.isReactNative = typeof __fbBatchedBridgeConfig !== 'undefined'; |
| |
| /***/ }), |
| /* 4 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| function shouldUpdateComponent(prevElement, nextElement) { |
| // TODO: prevElement and nextElement could be array |
| var prevEmpty = prevElement === null; |
| var nextEmpty = nextElement === null; |
| if (prevEmpty || nextEmpty) { |
| return prevEmpty === nextEmpty; |
| } |
| |
| var prevType = typeof prevElement === 'undefined' ? 'undefined' : _typeof(prevElement); |
| var nextType = typeof nextElement === 'undefined' ? 'undefined' : _typeof(nextElement); |
| if (prevType === 'string' || prevType === 'number') { |
| return nextType === 'string' || nextType === 'number'; |
| } else { |
| return prevType === 'object' && nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key; |
| } |
| } |
| |
| exports.default = shouldUpdateComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 5 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| /** |
| * Base component class. |
| */ |
| var Component = function () { |
| function Component(props, context, updater) { |
| _classCallCheck(this, Component); |
| |
| this.props = props; |
| this.context = context; |
| this.refs = {}; |
| this.updater = updater; |
| } |
| |
| _createClass(Component, [{ |
| key: "isComponentClass", |
| value: function isComponentClass() {} |
| }, { |
| key: "setState", |
| value: function setState(partialState, callback) { |
| this.updater.setState(this, partialState, callback); |
| } |
| }, { |
| key: "forceUpdate", |
| value: function forceUpdate(callback) { |
| this.updater.forceUpdate(this, callback); |
| } |
| }]); |
| |
| return Component; |
| }(); |
| |
| exports.default = Component; |
| module.exports = exports["default"]; |
| |
| /***/ }), |
| /* 6 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _instance = __webpack_require__(1); |
| |
| var _instance2 = _interopRequireDefault(_instance); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| exports.default = { |
| ComponentTree: { |
| getClosestInstanceFromNode: function getClosestInstanceFromNode(node) { |
| return _instance2.default.get(node); |
| }, |
| getNodeFromInstance: function getNodeFromInstance(inst) { |
| // inst is an internal instance (but could be a composite) |
| while (inst._renderedComponent) { |
| inst = inst._renderedComponent; |
| } |
| |
| if (inst) { |
| return inst._nativeNode; |
| } else { |
| return null; |
| } |
| } |
| }, |
| Mount: { |
| _instancesByReactRootID: _host2.default.rootComponents, |
| |
| // Stub - React DevTools expects to find this method and replace it |
| // with a wrapper in order to observe new root components being added |
| _renderNewRootComponent: function _renderNewRootComponent() {} |
| }, |
| Reconciler: { |
| // Stubs - React DevTools expects to find these methods and replace them |
| // with wrappers in order to observe components being mounted, updated and |
| // unmounted |
| mountComponent: function mountComponent() {}, |
| receiveComponent: function receiveComponent() {}, |
| unmountComponent: function unmountComponent() {} |
| }, |
| // monitor the info of all components |
| monitor: null |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 7 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| exports.createElement = createElement; |
| exports.createFactory = createFactory; |
| exports.cloneElement = cloneElement; |
| exports.isValidElement = isValidElement; |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| var _flattenChildren = __webpack_require__(17); |
| |
| var _flattenChildren2 = _interopRequireDefault(_flattenChildren); |
| |
| var _universalEnv = __webpack_require__(3); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| var RESERVED_PROPS = { |
| key: true, |
| ref: true |
| }; |
| |
| function getRenderErrorInfo() { |
| if (_host2.default.component) { |
| var name = _host2.default.component.getName(); |
| if (name) { |
| return ' Check the render method of `' + name + '`.'; |
| } |
| } |
| return ''; |
| } |
| |
| var Element = function Element(type, key, ref, props, owner) { |
| props = filterProps(type, props); |
| |
| return { |
| // Built-in properties that belong on the element |
| type: type, |
| key: key, |
| ref: ref, |
| props: props, |
| // Record the component responsible for creating this element. |
| _owner: owner |
| }; |
| }; |
| |
| exports.default = Element; |
| |
| |
| function flattenStyle(style) { |
| if (!style) { |
| return undefined; |
| } |
| |
| if (!Array.isArray(style)) { |
| return style; |
| } else { |
| var result = {}; |
| for (var i = 0; i < style.length; ++i) { |
| var computedStyle = flattenStyle(style[i]); |
| if (computedStyle) { |
| for (var key in computedStyle) { |
| result[key] = computedStyle[key]; |
| } |
| } |
| } |
| return result; |
| } |
| } |
| |
| // TODO: move to weex-drvier |
| function filterProps(type, props) { |
| // Only for weex text |
| if (_universalEnv.isWeex && type === 'text') { |
| var children = props.children; |
| var value = props.value; |
| |
| // Value is first |
| if (value == null && children != null) { |
| if (Array.isArray(children)) { |
| children = children.map(function (val) { |
| if (typeof val === 'number' || typeof val === 'string') { |
| return val; |
| } else { |
| return ''; |
| } |
| }).join(''); |
| } else if (typeof children !== 'number' && typeof children !== 'string') { |
| children = ''; |
| } |
| |
| props.value = String(children); |
| } |
| |
| props.children = null; |
| } |
| |
| return props; |
| } |
| |
| function createElement(type, config) { |
| var arguments$1 = arguments; |
| |
| if (type == null) { |
| throw Error('createElement: type should not be null or undefined.' + getRenderErrorInfo()); |
| } |
| // Reserved names are extracted |
| var props = {}; |
| var propName = void 0; |
| var key = null; |
| var ref = null; |
| |
| if (config != null) { |
| ref = config.ref === undefined ? null : config.ref; |
| key = config.key === undefined ? null : String(config.key); |
| // Remaining properties are added to a new props object |
| for (propName in config) { |
| if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { |
| props[propName] = config[propName]; |
| } |
| } |
| } |
| |
| for (var _len = arguments.length, children = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { |
| children[_key - 2] = arguments$1[_key]; |
| } |
| |
| if (children.length) { |
| props.children = (0, _flattenChildren2.default)(children); |
| } |
| |
| // Resolve default props |
| if (type && type.defaultProps) { |
| var defaultProps = type.defaultProps; |
| for (propName in defaultProps) { |
| if (props[propName] === undefined) { |
| props[propName] = defaultProps[propName]; |
| } |
| } |
| } |
| |
| if (props.style && (Array.isArray(props.style) || _typeof(props.style) === 'object')) { |
| props.style = flattenStyle(props.style); |
| } |
| |
| return new Element(type, key, ref, props, _host2.default.component); |
| } |
| |
| function createFactory(type) { |
| var factory = createElement.bind(null, type); |
| // Expose the type on the factory and the prototype so that it can be |
| // easily accessed on elements. E.g. `<Foo />.type === Foo`. |
| // This should not be named `constructor` since this may not be the function |
| // that created the element, and it may not even be a constructor. |
| factory.type = type; |
| return factory; |
| } |
| |
| function cloneElement(element, config) { |
| var arguments$1 = arguments; |
| |
| if (!isValidElement(element)) { |
| throw Error('cloneElement: not a valid element.' + getRenderErrorInfo()); |
| } |
| |
| // Original props are copied |
| var props = Object.assign({}, element.props); |
| |
| // Reserved names are extracted |
| var key = element.key; |
| var ref = element.ref; |
| |
| // Owner will be preserved, unless ref is overridden |
| var owner = element._owner; |
| |
| if (config) { |
| // Should reset ref and owner if has a new ref |
| if (config.ref !== undefined) { |
| ref = config.ref; |
| owner = _host2.default.component; |
| } |
| |
| if (config.key !== undefined) { |
| key = String(config.key); |
| } |
| |
| // Resolve default props |
| var defaultProps = void 0; |
| if (element.type && element.type.defaultProps) { |
| defaultProps = element.type.defaultProps; |
| } |
| // Remaining properties override existing props |
| var propName = void 0; |
| for (propName in config) { |
| if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { |
| if (config[propName] === undefined && defaultProps !== undefined) { |
| // Resolve default props |
| props[propName] = defaultProps[propName]; |
| } else { |
| props[propName] = config[propName]; |
| } |
| } |
| } |
| } |
| |
| for (var _len2 = arguments.length, children = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { |
| children[_key2 - 2] = arguments$1[_key2]; |
| } |
| |
| if (children.length) { |
| props.children = (0, _flattenChildren2.default)(children); |
| } |
| |
| return new Element(element.type, key, ref, props, owner); |
| } |
| |
| function isValidElement(object) { |
| return (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && object !== null && object.type && object.props; |
| } |
| |
| /***/ }), |
| /* 8 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = unmountComponentAtNode; |
| |
| var _instance = __webpack_require__(1); |
| |
| var _instance2 = _interopRequireDefault(_instance); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function unmountComponentAtNode(node) { |
| var component = _instance2.default.get(node); |
| |
| if (!component) { |
| return false; |
| } |
| |
| _instance2.default.remove(node); |
| component._internal.unmountComponent(); |
| |
| return true; |
| } |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 9 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| var _ref = __webpack_require__(10); |
| |
| var _ref2 = _interopRequireDefault(_ref); |
| |
| var _instantiateComponent = __webpack_require__(2); |
| |
| var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent); |
| |
| var _shouldUpdateComponent = __webpack_require__(4); |
| |
| var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent); |
| |
| var _getElementKeyName = __webpack_require__(11); |
| |
| var _getElementKeyName2 = _interopRequireDefault(_getElementKeyName); |
| |
| var _instance = __webpack_require__(1); |
| |
| var _instance2 = _interopRequireDefault(_instance); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| var STYLE = 'style'; |
| var CHILDREN = 'children'; |
| var TREE = 'tree'; |
| var EVENT_PREFIX_REGEXP = /on[A-Z]/; |
| |
| /** |
| * Native Component |
| */ |
| |
| var NativeComponent = function () { |
| function NativeComponent(element) { |
| _classCallCheck(this, NativeComponent); |
| |
| this._currentElement = element; |
| } |
| |
| _createClass(NativeComponent, [{ |
| key: 'mountComponent', |
| value: function mountComponent(parent, context, childMounter) { |
| // Parent native element |
| this._parent = parent; |
| this._context = context; |
| this._mountID = _host2.default.mountID++; |
| |
| var props = this._currentElement.props; |
| var type = this._currentElement.type; |
| var instance = { |
| _internal: this, |
| type: type, |
| props: props |
| }; |
| var appendType = props.append; // Default is node |
| |
| this._instance = instance; |
| |
| // Clone a copy for style diff |
| this._prevStyleCopy = Object.assign({}, props.style); |
| |
| var nativeNode = this.getNativeNode(); |
| |
| if (appendType !== TREE) { |
| if (childMounter) { |
| childMounter(nativeNode, parent); |
| } else { |
| _host2.default.driver.appendChild(nativeNode, parent); |
| } |
| } |
| |
| if (this._currentElement && this._currentElement.ref) { |
| _ref2.default.attach(this._currentElement._owner, this._currentElement.ref, this); |
| } |
| |
| // Process children |
| var children = props.children; |
| if (children != null) { |
| this.mountChildren(children, context); |
| } |
| |
| if (appendType === TREE) { |
| if (childMounter) { |
| childMounter(nativeNode, parent); |
| } else { |
| _host2.default.driver.appendChild(nativeNode, parent); |
| } |
| } |
| |
| _host2.default.hook.Reconciler.mountComponent(this); |
| |
| return instance; |
| } |
| }, { |
| key: 'mountChildren', |
| value: function mountChildren(children, context) { |
| var _this = this; |
| |
| if (!Array.isArray(children)) { |
| children = [children]; |
| } |
| |
| var renderedChildren = this._renderedChildren = {}; |
| |
| var renderedChildrenImage = children.map(function (element, index) { |
| var renderedChild = (0, _instantiateComponent2.default)(element); |
| var name = (0, _getElementKeyName2.default)(renderedChildren, element, index); |
| renderedChildren[name] = renderedChild; |
| renderedChild._mountIndex = index; |
| // Mount |
| var mountImage = renderedChild.mountComponent(_this.getNativeNode(), context); |
| return mountImage; |
| }); |
| |
| return renderedChildrenImage; |
| } |
| }, { |
| key: 'unmountChildren', |
| value: function unmountChildren(notRemoveChild) { |
| var renderedChildren = this._renderedChildren; |
| |
| if (renderedChildren) { |
| for (var name in renderedChildren) { |
| var renderedChild = renderedChildren[name]; |
| renderedChild.unmountComponent(notRemoveChild); |
| } |
| this._renderedChildren = null; |
| } |
| } |
| }, { |
| key: 'unmountComponent', |
| value: function unmountComponent(notRemoveChild) { |
| if (this._nativeNode) { |
| var ref = this._currentElement.ref; |
| if (ref) { |
| _ref2.default.detach(this._currentElement._owner, ref, this); |
| } |
| |
| _instance2.default.remove(this._nativeNode); |
| if (!notRemoveChild) { |
| _host2.default.driver.removeChild(this._nativeNode, this._parent); |
| } |
| _host2.default.driver.removeAllEventListeners(this._nativeNode); |
| } |
| |
| this.unmountChildren(notRemoveChild); |
| |
| _host2.default.hook.Reconciler.unmountComponent(this); |
| |
| this._currentElement = null; |
| this._nativeNode = null; |
| this._parent = null; |
| this._context = null; |
| this._instance = null; |
| this._prevStyleCopy = null; |
| } |
| }, { |
| key: 'updateComponent', |
| value: function updateComponent(prevElement, nextElement, prevContext, nextContext) { |
| // Replace current element |
| this._currentElement = nextElement; |
| |
| _ref2.default.update(prevElement, nextElement, this); |
| |
| var prevProps = prevElement.props; |
| var nextProps = nextElement.props; |
| |
| this.updateProperties(prevProps, nextProps); |
| this.updateChildren(nextProps.children, nextContext); |
| |
| _host2.default.hook.Reconciler.receiveComponent(this); |
| } |
| }, { |
| key: 'updateProperties', |
| value: function updateProperties(prevProps, nextProps) { |
| var this$1 = this; |
| |
| var propKey = void 0; |
| var styleName = void 0; |
| var styleUpdates = void 0; |
| for (propKey in prevProps) { |
| if (propKey === CHILDREN || nextProps.hasOwnProperty(propKey) || !prevProps.hasOwnProperty(propKey) || prevProps[propKey] == null) { |
| continue; |
| } |
| if (propKey === STYLE) { |
| var lastStyle = this$1._prevStyleCopy; |
| for (styleName in lastStyle) { |
| if (lastStyle.hasOwnProperty(styleName)) { |
| styleUpdates = styleUpdates || {}; |
| styleUpdates[styleName] = ''; |
| } |
| } |
| this$1._prevStyleCopy = null; |
| } else if (EVENT_PREFIX_REGEXP.test(propKey)) { |
| if (typeof prevProps[propKey] === 'function') { |
| _host2.default.driver.removeEventListener(this$1.getNativeNode(), propKey.slice(2).toLowerCase(), prevProps[propKey]); |
| } |
| } else { |
| _host2.default.driver.removeAttribute(this$1.getNativeNode(), propKey, prevProps[propKey]); |
| } |
| } |
| |
| for (propKey in nextProps) { |
| var nextProp = nextProps[propKey]; |
| var prevProp = propKey === STYLE ? this$1._prevStyleCopy : prevProps != null ? prevProps[propKey] : undefined; |
| if (propKey === CHILDREN || !nextProps.hasOwnProperty(propKey) || nextProp === prevProp || nextProp == null && prevProp == null) { |
| continue; |
| } |
| // Update style |
| if (propKey === STYLE) { |
| if (nextProp) { |
| // Clone property |
| nextProp = this$1._prevStyleCopy = Object.assign({}, nextProp); |
| } else { |
| this$1._prevStyleCopy = null; |
| } |
| |
| if (prevProp != null) { |
| // Unset styles on `prevProp` but not on `nextProp`. |
| for (styleName in prevProp) { |
| if (prevProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { |
| styleUpdates = styleUpdates || {}; |
| styleUpdates[styleName] = ''; |
| } |
| } |
| // Update styles that changed since `prevProp`. |
| for (styleName in nextProp) { |
| if (nextProp.hasOwnProperty(styleName) && prevProp[styleName] !== nextProp[styleName]) { |
| styleUpdates = styleUpdates || {}; |
| styleUpdates[styleName] = nextProp[styleName]; |
| } |
| } |
| } else { |
| // Assign next prop when prev style is null |
| styleUpdates = nextProp; |
| } |
| |
| // Update event binding |
| } else if (EVENT_PREFIX_REGEXP.test(propKey)) { |
| if (typeof prevProp === 'function') { |
| _host2.default.driver.removeEventListener(this$1.getNativeNode(), propKey.slice(2).toLowerCase(), prevProp); |
| } |
| |
| if (typeof nextProp === 'function') { |
| _host2.default.driver.addEventListener(this$1.getNativeNode(), propKey.slice(2).toLowerCase(), nextProp); |
| } |
| // Update other property |
| } else { |
| var payload = {}; |
| payload[propKey] = nextProp; |
| if (nextProp != null) { |
| _host2.default.driver.setAttribute(this$1.getNativeNode(), propKey, nextProp); |
| } else { |
| _host2.default.driver.removeAttribute(this$1.getNativeNode(), propKey, prevProps[propKey]); |
| } |
| |
| } |
| } |
| |
| if (styleUpdates) { |
| _host2.default.driver.setStyles(this.getNativeNode(), styleUpdates); |
| } |
| } |
| }, { |
| key: 'updateChildren', |
| value: function updateChildren(nextChildrenElements, context) { |
| var _this2 = this; |
| |
| // prev rendered children |
| var prevChildren = this._renderedChildren; |
| |
| if (nextChildrenElements == null && prevChildren == null) { |
| return; |
| } |
| |
| var nextChildren = {}; |
| var oldNodes = {}; |
| |
| if (nextChildrenElements != null) { |
| if (!Array.isArray(nextChildrenElements)) { |
| nextChildrenElements = [nextChildrenElements]; |
| } |
| |
| // Update next children elements |
| for (var index = 0, length = nextChildrenElements.length; index < length; index++) { |
| var nextElement = nextChildrenElements[index]; |
| var name = (0, _getElementKeyName2.default)(nextChildren, nextElement, index); |
| var prevChild = prevChildren && prevChildren[name]; |
| var prevElement = prevChild && prevChild._currentElement; |
| |
| if (prevChild != null && (0, _shouldUpdateComponent2.default)(prevElement, nextElement)) { |
| // Pass the same context when updating chidren |
| prevChild.updateComponent(prevElement, nextElement, context, context); |
| nextChildren[name] = prevChild; |
| } else { |
| // Unmount the prevChild when nextChild is different element type. |
| if (prevChild) { |
| var oldNativeNode = prevChild.getNativeNode(); |
| // Delay remove child |
| prevChild.unmountComponent(true); |
| oldNodes[name] = oldNativeNode; |
| } |
| // The child must be instantiated before it's mounted. |
| nextChildren[name] = (0, _instantiateComponent2.default)(nextElement); |
| } |
| } |
| } |
| |
| var firstPrevChild = void 0; |
| var delayRemoveFirstPrevChild = void 0; |
| // Unmount children that are no longer present. |
| if (prevChildren != null) { |
| for (var _name in prevChildren) { |
| if (!prevChildren.hasOwnProperty(_name)) { |
| continue; |
| } |
| |
| var _prevChild = prevChildren[_name]; |
| var shouldRemove = !nextChildren[_name]; |
| |
| // Store old first child ref for append node ahead and maybe delay remove it |
| if (!firstPrevChild) { |
| firstPrevChild = _prevChild; |
| delayRemoveFirstPrevChild = shouldRemove; |
| } else if (shouldRemove) { |
| _prevChild.unmountComponent(); |
| } |
| } |
| } |
| |
| if (nextChildren != null) { |
| (function () { |
| // `nextIndex` will increment for each child in `nextChildren`, but |
| // `lastIndex` will be the last index visited in `prevChildren`. |
| var lastIndex = 0; |
| var nextIndex = 0; |
| var lastPlacedNode = null; |
| var nextNativeNode = []; |
| |
| var _loop = function _loop(_name2) { |
| if (!nextChildren.hasOwnProperty(_name2)) { |
| return 'continue'; |
| } |
| |
| var nextChild = nextChildren[_name2]; |
| var prevChild = prevChildren && prevChildren[_name2]; |
| |
| if (prevChild === nextChild) { |
| var prevChildNativeNode = prevChild.getNativeNode(); |
| // Convert to array type |
| if (!Array.isArray(prevChildNativeNode)) { |
| prevChildNativeNode = [prevChildNativeNode]; |
| } |
| |
| // If the index of `child` is less than `lastIndex`, then it needs to |
| // be moved. Otherwise, we do not need to move it because a child will be |
| // inserted or moved before `child`. |
| if (prevChild._mountIndex < lastIndex) { |
| // Get the last child |
| if (Array.isArray(lastPlacedNode)) { |
| lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1]; |
| } |
| |
| for (var _i = prevChildNativeNode.length - 1; _i >= 0; _i--) { |
| _host2.default.driver.insertAfter(prevChildNativeNode[_i], lastPlacedNode); |
| } |
| } |
| |
| nextNativeNode = nextNativeNode.concat(prevChildNativeNode); |
| |
| lastIndex = Math.max(prevChild._mountIndex, lastIndex); |
| prevChild._mountIndex = nextIndex; |
| } else { |
| if (prevChild != null) { |
| // Update `lastIndex` before `_mountIndex` gets unset by unmounting. |
| lastIndex = Math.max(prevChild._mountIndex, lastIndex); |
| } |
| |
| var parent = _this2.getNativeNode(); |
| // Fragment extended native component, so if parent is fragment should get this._parent |
| if (Array.isArray(parent)) { |
| parent = _this2._parent; |
| } |
| |
| nextChild.mountComponent(parent, context, function (newChild, parent) { |
| // TODO: Rework the duplicate code |
| var oldChild = oldNodes[_name2]; |
| if (!Array.isArray(newChild)) { |
| newChild = [newChild]; |
| } |
| |
| if (oldChild) { |
| // The oldChild or newChild all maybe fragment |
| if (!Array.isArray(oldChild)) { |
| oldChild = [oldChild]; |
| } |
| |
| // If newChild count large then oldChild |
| var lastNewChild = void 0; |
| for (var _i2 = 0; _i2 < newChild.length; _i2++) { |
| var child = newChild[_i2]; |
| if (oldChild[_i2]) { |
| _host2.default.driver.replaceChild(child, oldChild[_i2]); |
| } else { |
| _host2.default.driver.insertAfter(child, lastNewChild); |
| } |
| lastNewChild = child; |
| } |
| |
| // If newChild count less then oldChild |
| if (newChild.length < oldChild.length) { |
| for (var _i3 = newChild.length; _i3 < oldChild.length; _i3++) { |
| _host2.default.driver.removeChild(oldChild[_i3]); |
| } |
| } |
| } else { |
| // Insert child at a specific index |
| |
| // Get the last child |
| if (Array.isArray(lastPlacedNode)) { |
| lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1]; |
| } |
| |
| var prevFirstNativeNode = void 0; |
| |
| if (firstPrevChild && !lastPlacedNode) { |
| prevFirstNativeNode = firstPrevChild.getNativeNode(); |
| if (Array.isArray(prevFirstNativeNode)) { |
| prevFirstNativeNode = prevFirstNativeNode[0]; |
| } |
| } |
| |
| for (var _i4 = newChild.length - 1; _i4 >= 0; _i4--) { |
| var _child = newChild[_i4]; |
| if (lastPlacedNode) { |
| _host2.default.driver.insertAfter(_child, lastPlacedNode); |
| } else if (prevFirstNativeNode) { |
| _host2.default.driver.insertBefore(_child, prevFirstNativeNode); |
| } else { |
| _host2.default.driver.appendChild(_child, parent); |
| } |
| } |
| } |
| |
| nextNativeNode = nextNativeNode.concat(newChild); |
| }); |
| nextChild._mountIndex = nextIndex; |
| } |
| |
| nextIndex++; |
| lastPlacedNode = nextChild.getNativeNode(); |
| }; |
| |
| for (var _name2 in nextChildren) { |
| var _ret2 = _loop(_name2); |
| |
| if (_ret2 === 'continue') { continue; } |
| } |
| |
| // Sync update native refs |
| if (Array.isArray(_this2._nativeNode)) { |
| // Clear all and push the new array |
| _this2._nativeNode.splice(0, _this2._nativeNode.length); |
| for (var i = 0; i < nextNativeNode.length; i++) { |
| _this2._nativeNode.push(nextNativeNode[i]); |
| } |
| } |
| })(); |
| } |
| |
| if (delayRemoveFirstPrevChild) { |
| firstPrevChild.unmountComponent(); |
| } |
| |
| this._renderedChildren = nextChildren; |
| } |
| }, { |
| key: 'getNativeNode', |
| value: function getNativeNode() { |
| if (this._nativeNode == null) { |
| this._nativeNode = _host2.default.driver.createElement(this._instance); |
| _instance2.default.set(this._nativeNode, this._instance); |
| } |
| |
| return this._nativeNode; |
| } |
| }, { |
| key: 'getPublicInstance', |
| value: function getPublicInstance() { |
| return this.getNativeNode(); |
| } |
| }, { |
| key: 'getName', |
| value: function getName() { |
| return this._currentElement.type; |
| } |
| }]); |
| |
| return NativeComponent; |
| }(); |
| |
| exports.default = NativeComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 10 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| /* |
| * Ref manager |
| */ |
| |
| exports.default = { |
| update: function update(prevElement, nextElement, component) { |
| var prevRef = prevElement != null && prevElement.ref; |
| var nextRef = nextElement != null && nextElement.ref; |
| |
| // Update refs in owner component |
| if (prevRef !== nextRef) { |
| // Detach prev RenderedElement's ref |
| prevRef != null && this.detach(prevElement._owner, prevRef, component); |
| // Attach next RenderedElement's ref |
| nextRef != null && this.attach(nextElement._owner, nextRef, component); |
| } |
| }, |
| attach: function attach(ownerComponent, ref, component) { |
| if (!ownerComponent) { |
| throw new Error('You might be adding a ref to a component that was not created inside a component\'s ' + '`render` method, or you have multiple copies of Rax loaded.'); |
| } |
| |
| var instance = component.getPublicInstance(); |
| if (typeof ref === 'function') { |
| ref(instance); |
| } else { |
| ownerComponent._instance.refs[ref] = instance; |
| } |
| }, |
| detach: function detach(ownerComponent, ref, component) { |
| if (typeof ref === 'function') { |
| // When the referenced component is unmounted and whenever the ref changes, the old ref will be called with null as an argument. |
| ref(null); |
| } else { |
| // Must match component and ref could detach the ref on owner when A's before ref is B's current ref |
| var instance = component.getPublicInstance(); |
| if (ownerComponent._instance.refs[ref] === instance) { |
| delete ownerComponent._instance.refs[ref]; |
| } |
| } |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 11 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| exports.default = function (children, element, index) { |
| var elementKey = element && element.key; |
| var hasKey = typeof elementKey === 'string'; |
| var defaultName = '.' + index.toString(36); |
| |
| if (hasKey) { |
| var keyName = '$' + elementKey; |
| // Child keys must be unique. |
| var keyUnique = children[keyName] === undefined; |
| // Only the first child will be used when encountered two children with the same key |
| if (!keyUnique) { console.warn('Encountered two children with the same key "' + elementKey + '".'); } |
| |
| return keyUnique ? keyName : defaultName; |
| } else { |
| return defaultName; |
| } |
| }; |
| |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 12 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.isRem = isRem; |
| exports.calcRem = calcRem; |
| exports.getRem = getRem; |
| exports.setRem = setRem; |
| exports.isUnitNumber = isUnitNumber; |
| exports.convertUnit = convertUnit; |
| /** |
| * CSS properties which accept numbers but are not in units of "px". |
| */ |
| var UNITLESS_NUMBER_PROPS = { |
| animationIterationCount: true, |
| borderImageOutset: true, |
| borderImageSlice: true, |
| borderImageWidth: true, |
| boxFlex: true, |
| boxFlexGroup: true, |
| boxOrdinalGroup: true, |
| columnCount: true, |
| flex: true, |
| flexGrow: true, |
| flexPositive: true, |
| flexShrink: true, |
| flexNegative: true, |
| flexOrder: true, |
| gridRow: true, |
| gridColumn: true, |
| fontWeight: true, |
| lineClamp: true, |
| // We make lineHeight default is px that is diff with w3c spec |
| // lineHeight: true, |
| opacity: true, |
| order: true, |
| orphans: true, |
| tabSize: true, |
| widows: true, |
| zIndex: true, |
| zoom: true, |
| // Weex only |
| lines: true |
| }; |
| var SUFFIX = 'rem'; |
| var REM_REG = /[-+]?\d*\.?\d+rem/g; |
| |
| var defaultRem = void 0; |
| |
| /** |
| * Is string contains rem |
| * @param {String} str |
| * @returns {Boolean} |
| */ |
| function isRem(str) { |
| return typeof str === 'string' && str.indexOf(SUFFIX) !== -1; |
| } |
| |
| /** |
| * Calculate rem to pixels: '1.2rem' => 1.2 * rem |
| * @param {String} str |
| * @param {Number} rem |
| * @returns {number} |
| */ |
| function calcRem(str) { |
| var rem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultRem; |
| |
| return str.replace(REM_REG, function (remValue) { |
| return parseFloat(remValue) * rem + 'px'; |
| }); |
| } |
| |
| function getRem() { |
| return defaultRem; |
| } |
| |
| function setRem(rem) { |
| defaultRem = rem; |
| } |
| |
| function isUnitNumber(val, prop) { |
| return typeof val === 'number' && !UNITLESS_NUMBER_PROPS[prop]; |
| } |
| |
| function convertUnit(val, prop) { |
| if (prop && isUnitNumber(val, prop)) { |
| return val * defaultRem + 'px'; |
| } else if (isRem(val)) { |
| return calcRem(val); |
| } |
| |
| return val; |
| } |
| |
| /***/ }), |
| /* 13 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.transformPropsAttrsToStyle = transformPropsAttrsToStyle; |
| exports.renamePropsAttr = renamePropsAttr; |
| /** |
| * transformPropAttrsToStyle |
| * |
| * @param {Object} props |
| * @param {Array} attrs |
| */ |
| function transformPropsAttrsToStyle(props, attrs) { |
| props.style = props.style || {}; |
| |
| attrs.forEach(function (attr) { |
| if (props[attr] && !props.style[attr]) { |
| props.style[attr] = props[attr]; |
| delete props[attr]; |
| } |
| }); |
| |
| return props; |
| } |
| |
| /** |
| * renamePropsAttr |
| * |
| * @param {Object} props |
| * @param {String} originalAttrName |
| * @param {String} newAttrName |
| */ |
| function renamePropsAttr(props, originalAttrName, newAttrName) { |
| if (props[originalAttrName] && !props[newAttrName]) { |
| props[newAttrName] = props[originalAttrName]; |
| delete props[originalAttrName]; |
| } |
| |
| return props; |
| } |
| |
| /***/ }), |
| /* 14 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function findDOMNode(instance) { |
| if (instance == null) { |
| return null; |
| } |
| |
| // If a native node, weex may not export ownerDocument property |
| if (instance.ownerDocument || instance.nodeType) { |
| return instance; |
| } |
| |
| // Native component |
| if (instance._nativeNode) { |
| return instance._nativeNode; |
| } |
| |
| if (typeof instance == 'string') { |
| return _host2.default.driver.getElementById(instance); |
| } |
| |
| if (typeof instance.render !== 'function') { |
| throw new Error('Appears to be neither Component nor DOMNode.'); |
| } |
| |
| // Composite component |
| var internal = instance._internal; |
| |
| if (internal) { |
| while (!internal._nativeNode) { |
| internal = internal._renderedComponent; |
| // If not mounted |
| if (internal == null) { |
| return null; |
| } |
| } |
| return internal._nativeNode; |
| } else { |
| throw new Error('findDOMNode was called on an unmounted component.'); |
| } |
| } |
| |
| exports.default = findDOMNode; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 15 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.version = exports.setNativeProps = exports.findComponentInstance = exports.unmountComponentAtNode = exports.findDOMNode = exports.render = exports.PropTypes = exports.PureComponent = exports.Component = exports.createFactory = exports.isValidElement = exports.cloneElement = exports.createElement = undefined; |
| |
| __webpack_require__(16); |
| |
| var _element = __webpack_require__(7); |
| |
| var _component = __webpack_require__(5); |
| |
| var _component2 = _interopRequireDefault(_component); |
| |
| var _purecomponent = __webpack_require__(19); |
| |
| var _purecomponent2 = _interopRequireDefault(_purecomponent); |
| |
| var _proptypes = __webpack_require__(20); |
| |
| var _proptypes2 = _interopRequireDefault(_proptypes); |
| |
| var _render2 = __webpack_require__(21); |
| |
| var _render3 = _interopRequireDefault(_render2); |
| |
| var _findDOMNode2 = __webpack_require__(14); |
| |
| var _findDOMNode3 = _interopRequireDefault(_findDOMNode2); |
| |
| var _unmountComponentAtNode2 = __webpack_require__(8); |
| |
| var _unmountComponentAtNode3 = _interopRequireDefault(_unmountComponentAtNode2); |
| |
| var _findComponentInstance2 = __webpack_require__(42); |
| |
| var _findComponentInstance3 = _interopRequireDefault(_findComponentInstance2); |
| |
| var _setNativeProps2 = __webpack_require__(43); |
| |
| var _setNativeProps3 = _interopRequireDefault(_setNativeProps2); |
| |
| var _version2 = __webpack_require__(44); |
| |
| var _version3 = _interopRequireDefault(_version2); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| exports.createElement = _element.createElement; |
| exports.cloneElement = _element.cloneElement; |
| exports.isValidElement = _element.isValidElement; |
| exports.createFactory = _element.createFactory; |
| exports.Component = _component2.default; |
| exports.PureComponent = _purecomponent2.default; |
| exports.PropTypes = _proptypes2.default; |
| exports.render = _render3.default; |
| exports.findDOMNode = _findDOMNode3.default; |
| exports.unmountComponentAtNode = _unmountComponentAtNode3.default; |
| exports.findComponentInstance = _findComponentInstance3.default; |
| exports.setNativeProps = _setNativeProps3.default; |
| exports.version = _version3.default; |
| |
| /***/ }), |
| /* 16 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _hook = __webpack_require__(6); |
| |
| var _hook2 = _interopRequireDefault(_hook); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ |
| if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') { |
| __REACT_DEVTOOLS_GLOBAL_HOOK__.inject(_hook2.default); |
| } |
| |
| /***/ }), |
| /* 17 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = flattenChildren; |
| function traverseChildren(children, result) { |
| if (Array.isArray(children)) { |
| for (var i = 0, l = children.length; i < l; i++) { |
| traverseChildren(children[i], result); |
| } |
| } else { |
| result.push(children); |
| } |
| } |
| |
| function flattenChildren(children) { |
| if (children == null) { |
| return children; |
| } |
| var result = []; |
| traverseChildren(children, result); |
| |
| if (result.length === 1) { |
| result = result[0]; |
| } |
| |
| return result; |
| } |
| module.exports = exports["default"]; |
| |
| /***/ }), |
| /* 18 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _component = __webpack_require__(5); |
| |
| var _component2 = _interopRequireDefault(_component); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } |
| |
| function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } } |
| |
| var rootCounter = 1; |
| |
| var Root = function (_Component) { |
| _inherits(Root, _Component); |
| |
| function Root() { |
| var arguments$1 = arguments; |
| |
| var _ref; |
| |
| var _temp, _this, _ret; |
| |
| _classCallCheck(this, Root); |
| |
| for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { |
| args[_key] = arguments$1[_key]; |
| } |
| |
| return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Root.__proto__ || Object.getPrototypeOf(Root)).call.apply(_ref, [this].concat(args))), _this), _this.rootID = rootCounter++, _temp), _possibleConstructorReturn(_this, _ret); |
| } |
| |
| _createClass(Root, [{ |
| key: 'isRootComponent', |
| value: function isRootComponent() {} |
| }, { |
| key: 'render', |
| value: function render() { |
| return this.props.children; |
| } |
| }, { |
| key: 'getPublicInstance', |
| value: function getPublicInstance() { |
| return this.getRenderedComponent().getPublicInstance(); |
| } |
| }, { |
| key: 'getRenderedComponent', |
| value: function getRenderedComponent() { |
| return this._internal._renderedComponent; |
| } |
| }]); |
| |
| return Root; |
| }(_component2.default); |
| |
| exports.default = Root; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 19 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _component = __webpack_require__(5); |
| |
| var _component2 = _interopRequireDefault(_component); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } |
| |
| function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } } |
| |
| /** |
| * Pure component class. |
| */ |
| var PureComponent = function (_Component) { |
| _inherits(PureComponent, _Component); |
| |
| function PureComponent(props, context) { |
| _classCallCheck(this, PureComponent); |
| |
| return _possibleConstructorReturn(this, (PureComponent.__proto__ || Object.getPrototypeOf(PureComponent)).call(this, props, context)); |
| } |
| |
| _createClass(PureComponent, [{ |
| key: 'isPureComponentClass', |
| value: function isPureComponentClass() {} |
| }]); |
| |
| return PureComponent; |
| }(_component2.default); |
| |
| exports.default = PureComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 20 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| /* |
| * Current PropTypes only export some api with react, not validate in runtime. |
| */ |
| |
| function createChainableTypeChecker(validate) { |
| function checkType(isRequired, props, propName, componentName, location, propFullName) { |
| return typeChecker; |
| } |
| |
| var chainedCheckType = checkType.bind(null, false); |
| chainedCheckType.isRequired = checkType.bind(null, true); |
| |
| return chainedCheckType; |
| } |
| |
| function createTypeChecker(expectedType) { |
| function validate(props, propName, componentName, location, propFullName) { |
| // Noop |
| } |
| return createChainableTypeChecker(validate); |
| } |
| |
| var typeChecker = createTypeChecker(); |
| |
| exports.default = { |
| array: typeChecker, |
| bool: typeChecker, |
| func: typeChecker, |
| number: typeChecker, |
| object: typeChecker, |
| string: typeChecker, |
| symbol: typeChecker, |
| element: typeChecker, |
| node: typeChecker, |
| any: typeChecker, |
| arrayOf: typeChecker, |
| instanceOf: typeChecker, |
| objectOf: typeChecker, |
| oneOf: typeChecker, |
| oneOfType: typeChecker, |
| shape: typeChecker |
| }; |
| module.exports = exports["default"]; |
| |
| /***/ }), |
| /* 21 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _inject = __webpack_require__(22); |
| |
| var _inject2 = _interopRequireDefault(_inject); |
| |
| var _instance = __webpack_require__(1); |
| |
| var _instance2 = _interopRequireDefault(_instance); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function render(element, container, options, callback) { |
| // Compatible with `render(element, container, callback)` |
| if (typeof options === 'function') { |
| callback = options; |
| options = null; |
| } |
| |
| // Init inject |
| (0, _inject2.default)(options || {}); |
| |
| var rootComponent = _instance2.default.render(element, container); |
| var component = rootComponent.getPublicInstance(); |
| |
| if (callback) { |
| callback.call(component); |
| } |
| |
| return component; |
| } |
| |
| exports.default = render; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 22 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = inject; |
| |
| var _universalEnv = __webpack_require__(3); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| var _empty = __webpack_require__(23); |
| |
| var _empty2 = _interopRequireDefault(_empty); |
| |
| var _native = __webpack_require__(9); |
| |
| var _native2 = _interopRequireDefault(_native); |
| |
| var _text = __webpack_require__(24); |
| |
| var _text2 = _interopRequireDefault(_text); |
| |
| var _composite = __webpack_require__(25); |
| |
| var _composite2 = _interopRequireDefault(_composite); |
| |
| var _fragment = __webpack_require__(29); |
| |
| var _fragment2 = _interopRequireDefault(_fragment); |
| |
| var _driverWeex = __webpack_require__(30); |
| |
| var _driverWeex2 = _interopRequireDefault(_driverWeex); |
| |
| var _driverBrowser = __webpack_require__(40); |
| |
| var _driverBrowser2 = _interopRequireDefault(_driverBrowser); |
| |
| var _hook = __webpack_require__(6); |
| |
| var _hook2 = _interopRequireDefault(_hook); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function inject(_ref) { |
| var driver = _ref.driver, |
| hook = _ref.hook, |
| measurer = _ref.measurer; |
| |
| // Inject component class |
| _host2.default.EmptyComponent = _empty2.default; |
| _host2.default.NativeComponent = _native2.default; |
| _host2.default.TextComponent = _text2.default; |
| _host2.default.FragmentComponent = _fragment2.default; |
| _host2.default.CompositeComponent = _composite2.default; |
| // Inject devtool hook |
| _host2.default.hook = hook || _hook2.default; |
| |
| // Inject performance measurer |
| _host2.default.measurer = measurer; |
| |
| // Inject render driver |
| if (!_host2.default.driver) { |
| if (!driver) { |
| if (_universalEnv.isWeex) { |
| driver = _driverWeex2.default; |
| } else if (_universalEnv.isWeb) { |
| driver = _driverBrowser2.default; |
| } else { |
| throw Error('No builtin driver matched'); |
| } |
| } |
| |
| _host2.default.driver = driver; |
| } |
| } |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 23 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| /** |
| * Empty Component |
| */ |
| var EmptyComponent = function () { |
| function EmptyComponent() { |
| _classCallCheck(this, EmptyComponent); |
| |
| this._currentElement = null; |
| } |
| |
| _createClass(EmptyComponent, [{ |
| key: 'mountComponent', |
| value: function mountComponent(parent, context, childMounter) { |
| this._parent = parent; |
| this._context = context; |
| |
| var instance = { |
| _internal: this |
| }; |
| |
| var nativeNode = this.getNativeNode(); |
| if (childMounter) { |
| childMounter(nativeNode, parent); |
| } else { |
| _host2.default.driver.appendChild(nativeNode, parent); |
| } |
| |
| return instance; |
| } |
| }, { |
| key: 'unmountComponent', |
| value: function unmountComponent(notRemoveChild) { |
| if (this._nativeNode && !notRemoveChild) { |
| _host2.default.driver.removeChild(this._nativeNode, this._parent); |
| } |
| |
| this._nativeNode = null; |
| this._parent = null; |
| this._context = null; |
| } |
| }, { |
| key: 'updateComponent', |
| value: function updateComponent() { |
| // Noop |
| } |
| }, { |
| key: 'getNativeNode', |
| value: function getNativeNode() { |
| // Weex native node |
| if (this._nativeNode == null) { |
| this._nativeNode = _host2.default.driver.createEmpty(); |
| } |
| |
| return this._nativeNode; |
| } |
| }]); |
| |
| return EmptyComponent; |
| }(); |
| |
| exports.default = EmptyComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 24 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| /** |
| * Text Component |
| */ |
| var TextComponent = function () { |
| function TextComponent(element) { |
| _classCallCheck(this, TextComponent); |
| |
| this._currentElement = element; |
| this._stringText = String(element); |
| } |
| |
| _createClass(TextComponent, [{ |
| key: 'mountComponent', |
| value: function mountComponent(parent, context, childMounter) { |
| this._parent = parent; |
| this._context = context; |
| this._mountID = _host2.default.mountID++; |
| |
| // Weex dom operation |
| var nativeNode = this.getNativeNode(); |
| |
| if (childMounter) { |
| childMounter(nativeNode, parent); |
| } else { |
| _host2.default.driver.appendChild(nativeNode, parent); |
| } |
| |
| var instance = { |
| _internal: this |
| }; |
| |
| _host2.default.hook.Reconciler.mountComponent(this); |
| |
| return instance; |
| } |
| }, { |
| key: 'unmountComponent', |
| value: function unmountComponent(notRemoveChild) { |
| if (this._nativeNode && !notRemoveChild) { |
| _host2.default.driver.removeChild(this._nativeNode, this._parent); |
| } |
| |
| _host2.default.hook.Reconciler.unmountComponent(this); |
| |
| this._currentElement = null; |
| this._nativeNode = null; |
| this._parent = null; |
| this._context = null; |
| this._stringText = null; |
| } |
| }, { |
| key: 'updateComponent', |
| value: function updateComponent(prevElement, nextElement, context) { |
| // If some text do noting |
| if (prevElement !== nextElement) { |
| // Replace current element |
| this._currentElement = nextElement; |
| // Devtool read the latest stringText value |
| this._stringText = String(nextElement); |
| _host2.default.driver.updateText(this.getNativeNode(), this._stringText); |
| _host2.default.hook.Reconciler.receiveComponent(this); |
| } |
| } |
| }, { |
| key: 'getNativeNode', |
| value: function getNativeNode() { |
| if (this._nativeNode == null) { |
| this._nativeNode = _host2.default.driver.createText(this._stringText); |
| } |
| return this._nativeNode; |
| } |
| }]); |
| |
| return TextComponent; |
| }(); |
| |
| exports.default = TextComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 25 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _stateless = __webpack_require__(26); |
| |
| var _stateless2 = _interopRequireDefault(_stateless); |
| |
| var _updater = __webpack_require__(27); |
| |
| var _updater2 = _interopRequireDefault(_updater); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| var _ref = __webpack_require__(10); |
| |
| var _ref2 = _interopRequireDefault(_ref); |
| |
| var _instantiateComponent = __webpack_require__(2); |
| |
| var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent); |
| |
| var _shouldUpdateComponent = __webpack_require__(4); |
| |
| var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent); |
| |
| var _shallowEqual = __webpack_require__(28); |
| |
| var _shallowEqual2 = _interopRequireDefault(_shallowEqual); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| function performInSandbox(fn, handleError) { |
| try { |
| return fn(); |
| } catch (e) { |
| if (handleError) { |
| handleError(e); |
| } else { |
| if (_host2.default.sandbox) { |
| setTimeout(function () { |
| throw e; |
| }, 0); |
| } else { |
| throw e; |
| } |
| } |
| } |
| } |
| |
| var measureLifeCycle = void 0; |
| var CompositeComponent = function () { |
| function CompositeComponent(element) { |
| _classCallCheck(this, CompositeComponent); |
| |
| this._currentElement = element; |
| } |
| |
| _createClass(CompositeComponent, [{ |
| key: 'getName', |
| value: function getName() { |
| var type = this._currentElement.type; |
| var constructor = this._instance && this._instance.constructor; |
| return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null; |
| } |
| }, { |
| key: 'mountComponent', |
| value: function mountComponent(parent, context, childMounter) { |
| var _this = this; |
| |
| this._parent = parent; |
| this._context = context; |
| this._mountID = _host2.default.mountID++; |
| this._updateCount = 0; |
| |
| var Component = this._currentElement.type; |
| var publicProps = this._currentElement.props; |
| var isClass = Component.prototype; |
| var isComponentClass = isClass && Component.prototype.isComponentClass; |
| // Class stateless component without state but have lifecycles |
| var isStatelessClass = isClass && Component.prototype.render; |
| |
| // Context process |
| var publicContext = this._processContext(context); |
| |
| // Initialize the public class |
| var instance = void 0; |
| var renderedElement = void 0; |
| |
| if (isComponentClass || isStatelessClass) { |
| // Component instance |
| instance = new Component(publicProps, publicContext, _updater2.default); |
| } else if (typeof Component === 'function') { |
| // Functional stateless component without state and lifecycles |
| instance = new _stateless2.default(Component); |
| } else { |
| throw Error('Invalid component type ' + JSON.stringify(Component)); |
| } |
| |
| // These should be set up in the constructor, but as a convenience for |
| // simpler class abstractions, we set them up after the fact. |
| instance.props = publicProps; |
| instance.context = publicContext; |
| instance.refs = {}; |
| |
| // Inject the updater into instance |
| instance.updater = _updater2.default; |
| instance._internal = this; |
| this._instance = instance; |
| |
| // Init state, must be set to an object or null |
| var initialState = instance.state; |
| if (initialState === undefined) { |
| // TODO clone the state? |
| instance.state = initialState = null; |
| } |
| |
| performInSandbox(function () { |
| if (instance.componentWillMount) { |
| { |
| instance.componentWillMount(); |
| } |
| } |
| }); |
| |
| if (renderedElement == null) { |
| _host2.default.component = this; |
| // Process pending state when call setState in componentWillMount |
| instance.state = this._processPendingState(publicProps, publicContext); |
| |
| // FIXME: handleError should named as lifecycles |
| var handleError = void 0; |
| if (typeof instance.handleError === 'function') { |
| handleError = function handleError(e) { |
| instance.handleError(e); |
| }; |
| } |
| |
| performInSandbox(function () { |
| { |
| renderedElement = instance.render(); |
| } |
| }, handleError); |
| |
| _host2.default.component = null; |
| } |
| |
| this._renderedComponent = (0, _instantiateComponent2.default)(renderedElement); |
| this._renderedComponent.mountComponent(this._parent, this._processChildContext(context), childMounter); |
| |
| if (this._currentElement && this._currentElement.ref) { |
| _ref2.default.attach(this._currentElement._owner, this._currentElement.ref, this); |
| } |
| |
| performInSandbox(function () { |
| if (instance.componentDidMount) { |
| { |
| instance.componentDidMount(); |
| } |
| } |
| }); |
| |
| _host2.default.hook.Reconciler.mountComponent(this); |
| |
| return instance; |
| } |
| }, { |
| key: 'unmountComponent', |
| value: function unmountComponent(notRemoveChild) { |
| var instance = this._instance; |
| |
| performInSandbox(function () { |
| if (instance.componentWillUnmount) { |
| instance.componentWillUnmount(); |
| } |
| }); |
| |
| _host2.default.hook.Reconciler.unmountComponent(this); |
| |
| instance._internal = null; |
| |
| if (this._renderedComponent != null) { |
| var ref = this._currentElement.ref; |
| if (ref) { |
| _ref2.default.detach(this._currentElement._owner, ref, this); |
| } |
| |
| this._renderedComponent.unmountComponent(notRemoveChild); |
| this._renderedComponent = null; |
| this._instance = null; |
| } |
| |
| this._currentElement = null; |
| |
| // Reset pending fields |
| // Even if this component is scheduled for another update in ReactUpdates, |
| // it would still be ignored because these fields are reset. |
| this._pendingStateQueue = null; |
| this._pendingForceUpdate = false; |
| |
| // These fields do not really need to be reset since this object is no |
| // longer accessible. |
| this._context = null; |
| } |
| |
| /** |
| * Filters the context object to only contain keys specified in |
| * `contextTypes` |
| */ |
| |
| }, { |
| key: '_processContext', |
| value: function _processContext(context) { |
| var Component = this._currentElement.type; |
| var contextTypes = Component.contextTypes; |
| if (!contextTypes) { |
| return {}; |
| } |
| var maskedContext = {}; |
| for (var contextName in contextTypes) { |
| maskedContext[contextName] = context[contextName]; |
| } |
| return maskedContext; |
| } |
| }, { |
| key: '_processChildContext', |
| value: function _processChildContext(currentContext) { |
| var instance = this._instance; |
| var childContext = instance.getChildContext && instance.getChildContext(); |
| if (childContext) { |
| return Object.assign({}, currentContext, childContext); |
| } |
| return currentContext; |
| } |
| }, { |
| key: '_processPendingState', |
| value: function _processPendingState(props, context) { |
| var instance = this._instance; |
| var queue = this._pendingStateQueue; |
| if (!queue) { |
| return instance.state; |
| } |
| // Reset pending queue |
| this._pendingStateQueue = null; |
| var nextState = Object.assign({}, instance.state); |
| for (var i = 0; i < queue.length; i++) { |
| var partial = queue[i]; |
| Object.assign(nextState, typeof partial === 'function' ? partial.call(instance, nextState, props, context) : partial); |
| } |
| |
| return nextState; |
| } |
| }, { |
| key: 'updateComponent', |
| value: function updateComponent(prevElement, nextElement, prevUnmaskedContext, nextUnmaskedContext) { |
| var instance = this._instance; |
| |
| if (!instance) { |
| console.error('Update component \'' + this.getName() + '\' that has already been unmounted (or failed to mount).'); |
| } |
| |
| var willReceive = false; |
| var nextContext = void 0; |
| var nextProps = void 0; |
| |
| // Determine if the context has changed or not |
| if (this._context === nextUnmaskedContext) { |
| nextContext = instance.context; |
| } else { |
| nextContext = this._processContext(nextUnmaskedContext); |
| willReceive = true; |
| } |
| |
| // Distinguish between a props update versus a simple state update |
| if (prevElement === nextElement) { |
| // Skip checking prop types again -- we don't read component.props to avoid |
| // warning for DOM component props in this upgrade |
| nextProps = nextElement.props; |
| } else { |
| nextProps = nextElement.props; |
| willReceive = true; |
| } |
| |
| var hasReceived = willReceive && instance.componentWillReceiveProps; |
| |
| if (hasReceived) { |
| // Calling this.setState() within componentWillReceiveProps will not trigger an additional render. |
| this._pendingState = true; |
| performInSandbox(function () { |
| instance.componentWillReceiveProps(nextProps, nextContext); |
| }); |
| this._pendingState = false; |
| } |
| |
| // Update refs |
| _ref2.default.update(prevElement, nextElement, this); |
| |
| // Shoud update always default |
| var shouldUpdate = true; |
| var prevProps = instance.props; |
| var prevState = instance.state; |
| // TODO: could delay execution processPendingState |
| var nextState = this._processPendingState(nextProps, nextContext); |
| |
| // ShouldComponentUpdate is not called when forceUpdate is used |
| if (!this._pendingForceUpdate) { |
| if (instance.shouldComponentUpdate) { |
| shouldUpdate = performInSandbox(function () { |
| return instance.shouldComponentUpdate(nextProps, nextState, nextContext); |
| }); |
| } else if (instance.isPureComponentClass) { |
| shouldUpdate = !(0, _shallowEqual2.default)(prevProps, nextProps) || !(0, _shallowEqual2.default)(prevState, nextState); |
| } |
| } |
| |
| if (shouldUpdate) { |
| this._pendingForceUpdate = false; |
| // Will set `this.props`, `this.state` and `this.context`. |
| var prevContext = instance.context; |
| |
| // Cannot use this.setState() in componentWillUpdate. |
| // If need to update state in response to a prop change, use componentWillReceiveProps instead. |
| performInSandbox(function () { |
| if (instance.componentWillUpdate) { |
| instance.componentWillUpdate(nextProps, nextState, nextContext); |
| } |
| }); |
| |
| // Replace with next |
| this._currentElement = nextElement; |
| this._context = nextUnmaskedContext; |
| instance.props = nextProps; |
| instance.state = nextState; |
| instance.context = nextContext; |
| |
| this._updateRenderedComponent(nextUnmaskedContext); |
| |
| performInSandbox(function () { |
| if (instance.componentDidUpdate) { |
| instance.componentDidUpdate(prevProps, prevState, prevContext); |
| } |
| }); |
| |
| this._updateCount++; |
| } else { |
| // If it's determined that a component should not update, we still want |
| // to set props and state but we shortcut the rest of the update. |
| this._currentElement = nextElement; |
| this._context = nextUnmaskedContext; |
| instance.props = nextProps; |
| instance.state = nextState; |
| instance.context = nextContext; |
| } |
| |
| // Flush setState callbacks set in componentWillReceiveProps |
| if (hasReceived) { |
| var callbacks = this._pendingCallbacks; |
| this._pendingCallbacks = null; |
| _updater2.default.runCallbacks(callbacks, instance); |
| } |
| |
| _host2.default.hook.Reconciler.receiveComponent(this); |
| } |
| |
| /** |
| * Call the component's `render` method and update the DOM accordingly. |
| */ |
| |
| }, { |
| key: '_updateRenderedComponent', |
| value: function _updateRenderedComponent(context) { |
| var _this2 = this; |
| |
| var prevRenderedComponent = this._renderedComponent; |
| var prevRenderedElement = prevRenderedComponent._currentElement; |
| |
| var instance = this._instance; |
| var nextRenderedElement = void 0; |
| |
| _host2.default.component = this; |
| |
| performInSandbox(function () { |
| { |
| nextRenderedElement = instance.render(); |
| } |
| }); |
| |
| _host2.default.component = null; |
| |
| if ((0, _shouldUpdateComponent2.default)(prevRenderedElement, nextRenderedElement)) { |
| prevRenderedComponent.updateComponent(prevRenderedElement, nextRenderedElement, prevRenderedComponent._context, this._processChildContext(context)); |
| |
| } else { |
| var oldChild = prevRenderedComponent.getNativeNode(); |
| prevRenderedComponent.unmountComponent(true); |
| |
| this._renderedComponent = (0, _instantiateComponent2.default)(nextRenderedElement); |
| this._renderedComponent.mountComponent(this._parent, this._processChildContext(context), function (newChild, parent) { |
| // TODO: Duplicate code in native component file |
| if (!Array.isArray(newChild)) { |
| newChild = [newChild]; |
| } |
| |
| // oldChild or newChild all maybe fragment |
| if (!Array.isArray(oldChild)) { |
| oldChild = [oldChild]; |
| } |
| |
| // If newChild count large then oldChild |
| var lastNewChild = void 0; |
| for (var i = 0; i < newChild.length; i++) { |
| var child = newChild[i]; |
| if (oldChild[i]) { |
| _host2.default.driver.replaceChild(child, oldChild[i]); |
| } else { |
| _host2.default.driver.insertAfter(child, lastNewChild); |
| } |
| lastNewChild = child; |
| } |
| |
| // If newChild count less then oldChild |
| if (newChild.length < oldChild.length) { |
| for (var _i = newChild.length; _i < oldChild.length; _i++) { |
| _host2.default.driver.removeChild(oldChild[_i]); |
| } |
| } |
| }); |
| } |
| } |
| }, { |
| key: 'getNativeNode', |
| value: function getNativeNode() { |
| var renderedComponent = this._renderedComponent; |
| if (renderedComponent) { |
| return renderedComponent.getNativeNode(); |
| } |
| } |
| }, { |
| key: 'getPublicInstance', |
| value: function getPublicInstance() { |
| var instance = this._instance; |
| // The Stateless components cannot be given refs |
| if (instance instanceof _stateless2.default) { |
| return null; |
| } |
| return instance; |
| } |
| }]); |
| |
| return CompositeComponent; |
| }(); |
| |
| exports.default = CompositeComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 26 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| /** |
| * Stateless Component Class Wrapper |
| */ |
| var StatelessComponent = function () { |
| function StatelessComponent(pureRender) { |
| _classCallCheck(this, StatelessComponent); |
| |
| // A stateless function |
| this.pureRender = pureRender; |
| } |
| |
| _createClass(StatelessComponent, [{ |
| key: 'render', |
| value: function render() { |
| return this.pureRender(this.props, this.context); |
| } |
| }]); |
| |
| return StatelessComponent; |
| }(); |
| |
| exports.default = StatelessComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 27 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| function enqueueCallback(internal, callback) { |
| if (callback) { |
| var callbackQueue = internal._pendingCallbacks || (internal._pendingCallbacks = []); |
| callbackQueue.push(callback); |
| } |
| } |
| |
| function enqueueState(internal, partialState) { |
| if (partialState) { |
| var stateQueue = internal._pendingStateQueue || (internal._pendingStateQueue = []); |
| stateQueue.push(partialState); |
| } |
| } |
| |
| var Updater = { |
| setState: function setState(component, partialState, callback) { |
| var internal = component._internal; |
| |
| if (!internal) { |
| return; |
| } |
| |
| enqueueState(internal, partialState); |
| enqueueCallback(internal, callback); |
| |
| if (!internal._pendingState) { |
| this.runUpdate(component); |
| } |
| }, |
| |
| forceUpdate: function forceUpdate(component, callback) { |
| var internal = component._internal; |
| |
| if (!internal) { |
| return; |
| } |
| |
| internal._pendingForceUpdate = true; |
| |
| enqueueCallback(internal, callback); |
| this.runUpdate(component); |
| }, |
| |
| runUpdate: function runUpdate(component) { |
| var internal = component._internal; |
| |
| if (!internal || !internal._renderedComponent) { |
| return; |
| } |
| |
| // If updateComponent happens to enqueue any new updates, we |
| // shouldn't execute the callbacks until the next render happens, so |
| // stash the callbacks first |
| var callbacks = internal._pendingCallbacks; |
| internal._pendingCallbacks = null; |
| |
| var prevElement = internal._currentElement; |
| var prevUnmaskedContext = internal._context; |
| |
| if (internal._pendingStateQueue || internal._pendingForceUpdate) { |
| internal.updateComponent(prevElement, prevElement, prevUnmaskedContext, prevUnmaskedContext); |
| } |
| |
| this.runCallbacks(callbacks, component); |
| }, |
| |
| runCallbacks: function runCallbacks(callbacks, context) { |
| if (callbacks) { |
| for (var i = 0; i < callbacks.length; i++) { |
| callbacks[i].call(context); |
| } |
| } |
| } |
| }; |
| |
| exports.default = Updater; |
| module.exports = exports["default"]; |
| |
| /***/ }), |
| /* 28 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| var hasOwnProperty = Object.prototype.hasOwnProperty; |
| |
| /** |
| * inlined Object.is polyfill to avoid requiring consumers ship their own |
| * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is |
| */ |
| function is(x, y) { |
| // SameValue algorithm |
| if (x === y) { |
| // Steps 1-5, 7-10 |
| // Steps 6.b-6.e: +0 != -0 |
| return x !== 0 || 1 / x === 1 / y; |
| } else { |
| // Step 6.a: NaN == NaN |
| return x !== x && y !== y; |
| } |
| } |
| |
| /** |
| * Performs equality by iterating through keys on an object and returning false |
| * when any key has values which are not strictly equal between the arguments. |
| * Returns true when the values of all keys are strictly equal. |
| */ |
| function shallowEqual(objA, objB) { |
| if (is(objA, objB)) { |
| return true; |
| } |
| |
| if ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) { |
| return false; |
| } |
| |
| var keysA = Object.keys(objA); |
| var keysB = Object.keys(objB); |
| |
| if (keysA.length !== keysB.length) { |
| return false; |
| } |
| |
| // Test for A's keys different from B. |
| for (var i = 0; i < keysA.length; i++) { |
| if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) { |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| exports.default = shallowEqual; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 29 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| var _native = __webpack_require__(9); |
| |
| var _native2 = _interopRequireDefault(_native); |
| |
| var _instance = __webpack_require__(1); |
| |
| var _instance2 = _interopRequireDefault(_instance); |
| |
| var _instantiateComponent = __webpack_require__(2); |
| |
| var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent); |
| |
| var _getElementKeyName = __webpack_require__(11); |
| |
| var _getElementKeyName2 = _interopRequireDefault(_getElementKeyName); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } |
| |
| function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } } |
| |
| /** |
| * Fragment Component |
| */ |
| var FragmentComponent = function (_NativeComponent) { |
| _inherits(FragmentComponent, _NativeComponent); |
| |
| function FragmentComponent(element) { |
| _classCallCheck(this, FragmentComponent); |
| |
| return _possibleConstructorReturn(this, (FragmentComponent.__proto__ || Object.getPrototypeOf(FragmentComponent)).call(this, element)); |
| } |
| |
| _createClass(FragmentComponent, [{ |
| key: 'mountComponent', |
| value: function mountComponent(parent, context, childMounter) { |
| // Parent native element |
| this._parent = parent; |
| this._context = context; |
| this._mountID = _host2.default.mountID++; |
| |
| var instance = { |
| _internal: this |
| }; |
| this._instance = instance; |
| |
| var fragment = this.getNativeNode(); |
| var children = this._currentElement; |
| |
| // Process children |
| this.mountChildren(children, context); |
| |
| if (childMounter) { |
| childMounter(fragment, parent); |
| } else { |
| var isFragmentParent = Array.isArray(parent); |
| for (var i = 0; i < fragment.length; i++) { |
| var child = fragment[i]; |
| // When the parent is also a fragment |
| if (isFragmentParent) { |
| parent.push(child); |
| } else { |
| _host2.default.driver.appendChild(child, parent); |
| } |
| } |
| } |
| |
| return instance; |
| } |
| }, { |
| key: 'mountChildren', |
| value: function mountChildren(children, context) { |
| var _this2 = this; |
| |
| var renderedChildren = this._renderedChildren = {}; |
| var fragment = this.getNativeNode(); |
| |
| var renderedChildrenImage = children.map(function (element, index) { |
| var renderedChild = (0, _instantiateComponent2.default)(element); |
| var name = (0, _getElementKeyName2.default)(renderedChildren, element, index); |
| renderedChildren[name] = renderedChild; |
| renderedChild._mountIndex = index; |
| // Mount |
| var mountImage = renderedChild.mountComponent(_this2._parent, context, function (nativeNode) { |
| if (Array.isArray(nativeNode)) { |
| for (var i = 0; i < nativeNode.length; i++) { |
| fragment.push(nativeNode[i]); |
| } |
| } else { |
| fragment.push(nativeNode); |
| } |
| }); |
| return mountImage; |
| }); |
| |
| return renderedChildrenImage; |
| } |
| }, { |
| key: 'unmountComponent', |
| value: function unmountComponent(notRemoveChild) { |
| var this$1 = this; |
| |
| if (this._nativeNode) { |
| _instance2.default.remove(this._nativeNode); |
| if (!notRemoveChild) { |
| for (var i = 0; i < this._nativeNode.length; i++) { |
| _host2.default.driver.removeChild(this$1._nativeNode[i]); |
| } |
| } |
| } |
| |
| // Do not need remove child when their parent is removed |
| this.unmountChildren(true); |
| |
| this._currentElement = null; |
| this._nativeNode = null; |
| this._parent = null; |
| this._context = null; |
| this._instance = null; |
| } |
| }, { |
| key: 'updateComponent', |
| value: function updateComponent(prevElement, nextElement, prevContext, nextContext) { |
| // Replace current element |
| this._currentElement = nextElement; |
| this.updateChildren(this._currentElement, nextContext); |
| } |
| }, { |
| key: 'getNativeNode', |
| value: function getNativeNode() { |
| if (this._nativeNode == null) { |
| this._nativeNode = []; |
| } |
| |
| return this._nativeNode; |
| } |
| }, { |
| key: 'getPublicInstance', |
| value: function getPublicInstance() { |
| return this.getNativeNode(); |
| } |
| }, { |
| key: 'getName', |
| value: function getName() { |
| return 'fragment'; |
| } |
| }]); |
| |
| return FragmentComponent; |
| }(_native2.default); |
| |
| exports.default = FragmentComponent; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 30 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { |
| return typeof obj === "undefined" ? "undefined" : _typeof2(obj); |
| } : function (obj) { |
| return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); |
| }; /** |
| * Weex driver |
| */ |
| |
| var _styleUnit = __webpack_require__(12); |
| |
| var _elements = __webpack_require__(31); |
| |
| var _elements2 = _interopRequireDefault(_elements); |
| |
| function _interopRequireDefault(obj) { |
| return obj && obj.__esModule ? obj : { default: obj }; |
| } |
| |
| var STYLE = 'style'; |
| var ID = 'id'; |
| var TEXT = 'text'; |
| var CHILDREN = 'children'; |
| var EVENT_PREFIX_REGEXP = /^on[A-Z]/; |
| var FULL_WIDTH_REM = 750; |
| var ARIA_PREFIX_REGEXP = /^aria-/; |
| |
| var nodeMaps = {}; |
| /* global __weex_document__ */ |
| var document = (typeof __weex_document__ === 'undefined' ? 'undefined' : _typeof(__weex_document__)) === 'object' ? __weex_document__ : (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object' ? document : null; |
| |
| var Driver = { |
| getElementById: function getElementById(id) { |
| return nodeMaps[id]; |
| }, |
| createBody: function createBody() { |
| if (document.body) { |
| return document.body; |
| } |
| |
| var documentElement = document.documentElement; |
| var body = document.createBody(); |
| documentElement.appendChild(body); |
| |
| return body; |
| }, |
| createComment: function createComment(content) { |
| return document.createComment(content); |
| }, |
| createEmpty: function createEmpty() { |
| return this.createComment(' empty '); |
| }, |
| createText: function createText(text) { |
| return Driver.createElement({ |
| type: TEXT, |
| props: { |
| value: text |
| } |
| }); |
| }, |
| updateText: function updateText(node, content) { |
| this.setAttribute(node, 'value', content); |
| }, |
| createElement: function createElement(component) { |
| var htmlElement = _elements2.default[component.type]; |
| if (htmlElement) { |
| component = htmlElement.parse(component); |
| } |
| |
| var props = component.props; |
| var events = []; |
| var style = {}; |
| var originStyle = props[STYLE]; |
| for (var prop in originStyle) { |
| style[prop] = (0, _styleUnit.convertUnit)(originStyle[prop], prop); |
| } |
| |
| var node = document.createElement(component.type, { |
| style: style |
| }); |
| |
| this.setNativeProps(node, props, true); |
| |
| return node; |
| }, |
| appendChild: function appendChild(node, parent) { |
| return parent.appendChild(node); |
| }, |
| removeChild: function removeChild(node, parent) { |
| parent = parent || node.parentNode; |
| var id = node.attr && node.attr[ID]; |
| if (id != null) { |
| nodeMaps[id] = null; |
| } |
| return parent.removeChild(node); |
| }, |
| replaceChild: function replaceChild(newChild, oldChild, parent) { |
| parent = parent || oldChild.parentNode; |
| var previousSibling = oldChild.previousSibling; |
| var nextSibling = oldChild.nextSibling; |
| this.removeChild(oldChild, parent); |
| |
| if (previousSibling) { |
| this.insertAfter(newChild, previousSibling, parent); |
| } else if (nextSibling) { |
| this.insertBefore(newChild, nextSibling, parent); |
| } else { |
| this.appendChild(newChild, parent); |
| } |
| }, |
| insertAfter: function insertAfter(node, after, parent) { |
| parent = parent || after.parentNode; |
| return parent.insertAfter(node, after); |
| }, |
| insertBefore: function insertBefore(node, before, parent) { |
| parent = parent || before.parentNode; |
| return parent.insertBefore(node, before); |
| }, |
| addEventListener: function addEventListener(node, eventName, eventHandler) { |
| return node.addEvent(eventName, eventHandler); |
| }, |
| removeEventListener: function removeEventListener(node, eventName, eventHandler) { |
| return node.removeEvent(eventName, eventHandler); |
| }, |
| removeAllEventListeners: function removeAllEventListeners(node) { |
| // Noop |
| }, |
| removeAttribute: function removeAttribute(node, propKey, propValue) { |
| if (propKey == ID) { |
| nodeMaps[propValue] = null; |
| } |
| // Weex native will crash when pass null value |
| return node.setAttr(propKey, undefined, false); |
| }, |
| setAttribute: function setAttribute(node, propKey, propValue) { |
| if (propKey == ID) { |
| nodeMaps[propValue] = node; |
| } |
| |
| // Weex only support `ariaLabel` format, convert `aria-label` format to camelcase |
| if (ARIA_PREFIX_REGEXP.test(propKey)) { |
| propKey = propKey.replace(/\-(\w)/, function (m, p1) { |
| return p1.toUpperCase(); |
| }); |
| } |
| |
| return node.setAttr(propKey, propValue, false); |
| }, |
| setStyles: function setStyles(node, styles) { |
| // TODO if more then one style update, call setStyles will be better performance |
| for (var key in styles) { |
| var val = styles[key]; |
| val = (0, _styleUnit.convertUnit)(val, key); |
| node.setStyle(key, val); |
| } |
| }, |
| beforeRender: function beforeRender() { |
| // Turn off batched updates |
| document.open(); |
| |
| // Init rem unit |
| (0, _styleUnit.setRem)(this.getWindowWidth() / FULL_WIDTH_REM); |
| }, |
| afterRender: function afterRender() { |
| if (document.listener && document.listener.createFinish) { |
| document.listener.createFinish(); |
| } |
| |
| // Turn on batched updates |
| document.close(); |
| }, |
| getWindowWidth: function getWindowWidth() { |
| return FULL_WIDTH_REM; |
| }, |
| setNativeProps: function setNativeProps(node, props, skipSetStyles) { |
| var this$1 = this; |
| |
| for (var prop in props) { |
| var value = props[prop]; |
| if (prop === CHILDREN) { |
| continue; |
| } |
| |
| if (value != null) { |
| if (prop === STYLE) { |
| if (skipSetStyles) { |
| continue; |
| } |
| this$1.setStyles(node, value); |
| } else if (EVENT_PREFIX_REGEXP.test(prop)) { |
| var eventName = prop.slice(2).toLowerCase(); |
| this$1.addEventListener(node, eventName, value); |
| } else { |
| this$1.setAttribute(node, prop, value); |
| } |
| } |
| } |
| } |
| }; |
| |
| exports.default = Driver; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 31 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _img = __webpack_require__(32); |
| |
| var _img2 = _interopRequireDefault(_img); |
| |
| var _video = __webpack_require__(33); |
| |
| var _video2 = _interopRequireDefault(_video); |
| |
| var _textarea = __webpack_require__(34); |
| |
| var _textarea2 = _interopRequireDefault(_textarea); |
| |
| var _span = __webpack_require__(35); |
| |
| var _span2 = _interopRequireDefault(_span); |
| |
| var _p = __webpack_require__(36); |
| |
| var _p2 = _interopRequireDefault(_p); |
| |
| var _button = __webpack_require__(37); |
| |
| var _button2 = _interopRequireDefault(_button); |
| |
| var _heading = __webpack_require__(38); |
| |
| var _heading2 = _interopRequireDefault(_heading); |
| |
| var _block = __webpack_require__(39); |
| |
| var _block2 = _interopRequireDefault(_block); |
| |
| function _interopRequireDefault(obj) { |
| return obj && obj.__esModule ? obj : { default: obj }; |
| } |
| |
| exports.default = { |
| span: _span2.default, |
| p: _p2.default, |
| img: _img2.default, |
| button: _button2.default, |
| video: _video2.default, |
| textarea: _textarea2.default, |
| h1: _heading2.default, |
| h2: _heading2.default, |
| h3: _heading2.default, |
| h4: _heading2.default, |
| h5: _heading2.default, |
| h6: _heading2.default, |
| nav: _block2.default, |
| article: _block2.default, |
| section: _block2.default, |
| // Conflict with weex header tag |
| // header: block, |
| footer: _block2.default, |
| aside: _block2.default, |
| main: _block2.default |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 32 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _parseProps = __webpack_require__(13); |
| |
| exports.default = { |
| |
| /** |
| * parse w3c attrs to weex module attrs |
| * |
| * @param {Object} w3c component data |
| * @return {Object} weex component data |
| */ |
| parse: function parse(component) { |
| var props = component.props; |
| |
| component.type = 'image'; |
| |
| // modify props |
| component.props = (0, _parseProps.transformPropsAttrsToStyle)(props, ['width', 'height']); |
| |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 33 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _parseProps = __webpack_require__(13); |
| |
| exports.default = { |
| |
| /** |
| * parse w3c attrs to weex module attrs |
| * |
| * @param {Object} w3c component data |
| * @return {Object} weex component data |
| */ |
| parse: function parse(component) { |
| var props = component.props; |
| |
| // modify props |
| |
| component.props = (0, _parseProps.transformPropsAttrsToStyle)(props, ['width', 'height']); |
| |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 34 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = { |
| |
| /** |
| * parse w3c attrs to weex module attrs |
| * |
| * @param {Object} w3c component data |
| * @return {Object} weex component data |
| */ |
| parse: function parse(component) { |
| var props = component.props; |
| |
| if (typeof props.children === 'string' && !props.value) { |
| props.value = props.children; |
| props.children = null; |
| } |
| |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 35 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = { |
| parse: function parse(component) { |
| var props = component.props; |
| |
| component.type = 'text'; |
| |
| if (typeof props.children === 'string' && !props.value) { |
| props.value = props.children; |
| props.children = null; |
| } |
| |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 36 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { |
| return typeof obj === "undefined" ? "undefined" : _typeof2(obj); |
| } : function (obj) { |
| return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); |
| }; |
| |
| var _extends = Object.assign || function (target) { |
| var arguments$1 = arguments; |
| |
| for (var i = 1; i < arguments.length; i++) { |
| var source = arguments$1[i];for (var key in source) { |
| if (Object.prototype.hasOwnProperty.call(source, key)) { |
| target[key] = source[key]; |
| } |
| } |
| }return target; |
| }; |
| |
| var BASE_FONT_SIZE = 28; |
| |
| var defaultParagraphStyle = { |
| fontSize: BASE_FONT_SIZE, |
| marginTop: BASE_FONT_SIZE, |
| marginBottom: BASE_FONT_SIZE |
| }; |
| |
| var TypographyElements = { |
| u: { |
| textDecoration: 'underline' |
| }, |
| s: { |
| textDecoration: 'line-through' |
| }, |
| i: { |
| fontStyle: 'italic' |
| }, |
| b: { |
| fontWeight: 'bold' |
| }, |
| del: { |
| textDecoration: 'line-through' |
| }, |
| em: { |
| fontStyle: 'italic' |
| }, |
| strong: { |
| fontWeight: 'bold' |
| }, |
| big: { |
| fontSize: BASE_FONT_SIZE * 1.2 |
| }, |
| small: { |
| fontSize: BASE_FONT_SIZE * 0.8 |
| } |
| }; |
| |
| function transformString(string) { |
| return { |
| type: 'span', |
| attr: { |
| value: string |
| } |
| }; |
| } |
| |
| function transformChild(child) { |
| var type = child.type; |
| var props = child.props; |
| var style = props.style; |
| var nestedChildren = props.children; |
| // Alias img tag |
| if (type === 'img') { |
| type = 'image'; |
| } |
| |
| // Transfrom to span |
| if (TypographyElements[type]) { |
| style = _extends({}, TypographyElements[type], style); |
| type = 'span'; |
| } |
| |
| props.style = null; |
| props.children = null; |
| |
| var element = { |
| type: type, |
| style: style, |
| attr: props || {} |
| }; |
| |
| if (nestedChildren) { |
| if (type === 'span' && typeof nestedChildren === 'string') { |
| element.attr.value = nestedChildren; |
| } else { |
| element.children = transformChildren(nestedChildren); |
| } |
| } |
| |
| return element; |
| } |
| |
| function transformChildren(children) { |
| var elements = []; |
| if (!Array.isArray(children)) { |
| children = [children]; |
| } |
| |
| for (var i = 0; i < children.length; i++) { |
| var child = children[i]; |
| if (typeof child === 'string') { |
| elements.push(transformString(child)); |
| } else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object') { |
| elements.push(transformChild(child)); |
| } |
| } |
| |
| return elements; |
| } |
| |
| exports.default = { |
| parse: function parse(component) { |
| var props = component.props; |
| |
| var children = props.children; |
| |
| component.type = 'richtext'; |
| |
| props.style = _extends({}, defaultParagraphStyle, props.style); |
| |
| props.value = transformChildren(children); |
| props.children = null; |
| |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 37 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _extends = Object.assign || function (target) { |
| var arguments$1 = arguments; |
| |
| for (var i = 1; i < arguments.length; i++) { |
| var source = arguments$1[i];for (var key in source) { |
| if (Object.prototype.hasOwnProperty.call(source, key)) { |
| target[key] = source[key]; |
| } |
| } |
| }return target; |
| }; |
| |
| /** |
| * weex button |
| * |
| * props: disabled, style |
| */ |
| |
| exports.default = { |
| parse: function parse(component) { |
| var props = component.props; |
| |
| component.type = 'text'; |
| |
| var style = props.style, |
| disabled = props.disabled, |
| children = props.children; |
| |
| var textStyle = _extends({ |
| textAlign: 'center', |
| fontSize: 22, |
| paddingTop: 4, |
| paddingRight: 12, |
| paddingBottom: 6, |
| paddingLeft: 12, |
| borderWidth: 4, |
| borderStyle: 'solid', |
| borderColor: '#000000', |
| backgroudColor: '#c0c0c0' |
| }, style); |
| |
| if (disabled) { |
| props.onClick = null; |
| textStyle = _extends({}, textStyle, { |
| color: '#7f7f7f', |
| borderColor: '#7f7f7f' |
| }); |
| } |
| |
| if (typeof children === 'string') { |
| props.value = children; |
| props.children = null; |
| } |
| |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 38 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _extends = Object.assign || function (target) { |
| var arguments$1 = arguments; |
| |
| for (var i = 1; i < arguments.length; i++) { |
| var source = arguments$1[i];for (var key in source) { |
| if (Object.prototype.hasOwnProperty.call(source, key)) { |
| target[key] = source[key]; |
| } |
| } |
| }return target; |
| }; |
| |
| var BASE_FONT_SIZE = 28; |
| |
| function generateHeadingStyle(baseFontSize, fontMultiplier, marginMultiplier) { |
| return { |
| fontSize: baseFontSize * fontMultiplier, |
| marginTop: baseFontSize * fontMultiplier * marginMultiplier, |
| marginBottom: baseFontSize * fontMultiplier * marginMultiplier, |
| fontWeight: 'bold' |
| }; |
| } |
| |
| var HeadingElements = { |
| h1: generateHeadingStyle(BASE_FONT_SIZE, 2, 0.67), |
| h2: generateHeadingStyle(BASE_FONT_SIZE, 1.5, 0.83), |
| h3: generateHeadingStyle(BASE_FONT_SIZE, 1.17, 1), |
| h4: generateHeadingStyle(BASE_FONT_SIZE, 1, 1.33), |
| h5: generateHeadingStyle(BASE_FONT_SIZE, 0.83, 1.67), |
| h6: generateHeadingStyle(BASE_FONT_SIZE, 0.67, 2.33) |
| }; |
| |
| exports.default = { |
| parse: function parse(component) { |
| var type = component.type, |
| props = component.props; |
| |
| component.type = 'text'; |
| props.style = _extends({}, HeadingElements[type] || HeadingElements.h6, props.style); |
| |
| if (typeof props.children === 'string' && !props.value) { |
| props.value = props.children; |
| props.children = null; |
| } |
| |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 39 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = { |
| |
| /** |
| * parse w3c attrs to weex module attrs |
| * |
| * @param {Object} w3c component data |
| * @return {Object} weex component data |
| */ |
| parse: function parse(component) { |
| component.type = 'div'; |
| return component; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 40 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _styleUnit = __webpack_require__(12); |
| |
| var _flexbox = __webpack_require__(41); |
| |
| var _flexbox2 = _interopRequireDefault(_flexbox); |
| |
| function _interopRequireDefault(obj) { |
| return obj && obj.__esModule ? obj : { default: obj }; |
| } |
| |
| /** |
| * Web Browser driver |
| **/ |
| |
| var FULL_WIDTH_REM = 750; |
| var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML'; |
| var CLASS_NAME = 'className'; |
| var CLASS = 'class'; |
| var STYLE = 'style'; |
| var CHILDREN = 'children'; |
| var EVENT_PREFIX_REGEXP = /on[A-Z]/; |
| |
| var Driver = { |
| getElementById: function getElementById(id) { |
| return document.getElementById(id); |
| }, |
| createBody: function createBody() { |
| return document.body; |
| }, |
| createComment: function createComment(content) { |
| return document.createComment(content); |
| }, |
| createEmpty: function createEmpty() { |
| return this.createComment(' empty '); |
| }, |
| createText: function createText(text) { |
| return document.createTextNode(text); |
| }, |
| updateText: function updateText(node, text) { |
| var textContentAttr = 'textContent' in document ? 'textContent' : 'nodeValue'; |
| node[textContentAttr] = text; |
| }, |
| createElement: function createElement(component) { |
| var node = document.createElement(component.type); |
| var props = component.props; |
| |
| this.setNativeProps(node, props); |
| |
| return node; |
| }, |
| appendChild: function appendChild(node, parent) { |
| return parent.appendChild(node); |
| }, |
| removeChild: function removeChild(node, parent) { |
| parent = parent || node.parentNode; |
| // Maybe has been removed when remove child |
| if (parent) { |
| parent.removeChild(node); |
| } |
| }, |
| replaceChild: function replaceChild(newChild, oldChild, parent) { |
| parent = parent || oldChild.parentNode; |
| parent.replaceChild(newChild, oldChild); |
| }, |
| insertAfter: function insertAfter(node, after, parent) { |
| parent = parent || after.parentNode; |
| var nextSibling = after.nextSibling; |
| if (nextSibling) { |
| parent.insertBefore(node, nextSibling); |
| } else { |
| parent.appendChild(node); |
| } |
| }, |
| insertBefore: function insertBefore(node, before, parent) { |
| parent = parent || before.parentNode; |
| parent.insertBefore(node, before); |
| }, |
| addEventListener: function addEventListener(node, eventName, eventHandler) { |
| return node.addEventListener(eventName, eventHandler); |
| }, |
| removeEventListener: function removeEventListener(node, eventName, eventHandler) { |
| return node.removeEventListener(eventName, eventHandler); |
| }, |
| removeAllEventListeners: function removeAllEventListeners(node) { |
| // noop |
| }, |
| removeAttribute: function removeAttribute(node, propKey) { |
| if (propKey === DANGEROUSLY_SET_INNER_HTML) { |
| return node.innerHTML = null; |
| } |
| |
| if (propKey === CLASS_NAME) { |
| propKey = CLASS; |
| } |
| |
| if (propKey in node) { |
| node[propKey] = null; |
| } |
| |
| node.removeAttribute(propKey); |
| }, |
| setAttribute: function setAttribute(node, propKey, propValue) { |
| if (propKey === DANGEROUSLY_SET_INNER_HTML) { |
| return node.innerHTML = propValue.__html; |
| } |
| |
| if (propKey === CLASS_NAME) { |
| propKey = CLASS; |
| } |
| |
| if (propKey in node) { |
| node[propKey] = propValue; |
| } else { |
| node.setAttribute(propKey, propValue); |
| } |
| }, |
| setStyles: function setStyles(node, styles) { |
| var tranformedStyles = {}; |
| |
| for (var prop in styles) { |
| var val = styles[prop]; |
| if (_flexbox2.default.isFlexProp(prop)) { |
| _flexbox2.default[prop](val, tranformedStyles); |
| } else { |
| tranformedStyles[prop] = (0, _styleUnit.convertUnit)(val, prop); |
| } |
| } |
| |
| for (var _prop in tranformedStyles) { |
| var transformValue = tranformedStyles[_prop]; |
| // hack handle compatibility issue |
| if (Array.isArray(transformValue)) { |
| for (var i = 0; i < transformValue.length; i++) { |
| node.style[_prop] = transformValue[i]; |
| } |
| } else { |
| node.style[_prop] = transformValue; |
| } |
| } |
| }, |
| beforeRender: function beforeRender() { |
| // Init rem unit |
| (0, _styleUnit.setRem)(this.getWindowWidth() / FULL_WIDTH_REM); |
| }, |
| getWindowWidth: function getWindowWidth() { |
| return document.documentElement.clientWidth; |
| }, |
| setNativeProps: function setNativeProps(node, props) { |
| var this$1 = this; |
| |
| for (var prop in props) { |
| var value = props[prop]; |
| if (prop === CHILDREN) { |
| continue; |
| } |
| |
| if (value != null) { |
| if (prop === STYLE) { |
| this$1.setStyles(node, value); |
| } else if (EVENT_PREFIX_REGEXP.test(prop)) { |
| var eventName = prop.slice(2).toLowerCase(); |
| this$1.addEventListener(node, eventName, value); |
| } else { |
| this$1.setAttribute(node, prop, value); |
| } |
| } |
| } |
| } |
| }; |
| |
| exports.default = Driver; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 41 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| var BOX_ALIGN = { |
| stretch: 'stretch', |
| 'flex-start': 'start', |
| 'flex-end': 'end', |
| center: 'center' |
| }; |
| |
| var BOX_ORIENT = { |
| row: 'horizontal', |
| column: 'vertical' |
| }; |
| |
| var BOX_PACK = { |
| 'flex-start': 'start', |
| 'flex-end': 'end', |
| center: 'center', |
| 'space-between': 'justify', |
| 'space-around': 'justify' // Just same as `space-between` |
| }; |
| |
| var FLEX_PROPS = { |
| display: true, |
| flex: true, |
| alignItems: true, |
| alignSelf: true, |
| flexDirection: true, |
| justifyContent: true, |
| flexWrap: true |
| }; |
| |
| var Flexbox = { |
| isFlexProp: function isFlexProp(prop) { |
| return FLEX_PROPS[prop]; |
| }, |
| display: function display(value) { |
| var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| if (value === 'flex') { |
| style.display = ['-webkit-box', '-webkit-flex', 'flex']; |
| } else { |
| style.display = value; |
| } |
| |
| return style; |
| }, |
| flex: function flex(value) { |
| var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| style.webkitBoxFlex = value; |
| style.webkitFlex = value; |
| style.flex = value; |
| return style; |
| }, |
| flexWrap: function flexWrap(value) { |
| var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| style.flexWrap = value; |
| return style; |
| }, |
| alignItems: function alignItems(value) { |
| var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| style.webkitBoxAlign = BOX_ALIGN[value]; |
| style.webkitAlignItems = value; |
| style.alignItems = value; |
| return style; |
| }, |
| alignSelf: function alignSelf(value) { |
| var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| style.webkitAlignSelf = value; |
| style.alignSelf = value; |
| return style; |
| }, |
| flexDirection: function flexDirection(value) { |
| var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| style.webkitBoxOrient = BOX_ORIENT[value]; |
| style.webkitFlexDirection = value; |
| style.flexDirection = value; |
| return style; |
| }, |
| justifyContent: function justifyContent(value) { |
| var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| style.webkitBoxPack = BOX_PACK[value]; |
| style.webkitJustifyContent = value; |
| style.justifyContent = value; |
| return style; |
| } |
| }; |
| |
| exports.default = Flexbox; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 42 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _instance = __webpack_require__(1); |
| |
| var _instance2 = _interopRequireDefault(_instance); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function findComponentInstance(node) { |
| if (node == null) { |
| return null; |
| } |
| return _instance2.default.get(node); |
| } |
| |
| exports.default = findComponentInstance; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 43 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = setNativeProps; |
| |
| var _host = __webpack_require__(0); |
| |
| var _host2 = _interopRequireDefault(_host); |
| |
| var _findDOMNode = __webpack_require__(14); |
| |
| var _findDOMNode2 = _interopRequireDefault(_findDOMNode); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function setNativeProps(node, props) { |
| node = (0, _findDOMNode2.default)(node); |
| _host2.default.driver.setNativeProps(node, props); |
| } |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 44 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = '0.4.7'; |
| module.exports = exports['default']; |
| |
| /***/ }) |
| /******/ ]);}; |
| |
| /***/ }), |
| /* 6 */ |
| /*!*********************************************************!*\ |
| !*** ./packages/runtime-shared/dist/shared.function.js ***! |
| \*********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports) { |
| |
| module.exports = 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 = 2); |
| /******/ }) |
| /************************************************************************/ |
| /******/ ([ |
| /* 0 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| /* eslint no-extend-native: "off", new-cap: "off" */ |
| |
| var defineProperties = Object.defineProperties, |
| defineProperty = Object.defineProperty, |
| SymbolPolyfill, |
| HiddenSymbol, |
| globalSymbols = Object.create(null); |
| |
| function isSymbol(x) { |
| if (!x) { return false; } |
| if ((typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'symbol') { return true; } |
| if (!x.constructor) { return false; } |
| if (x.constructor.name !== 'Symbol') { return false; } |
| return x[x.constructor.toStringTag] === 'Symbol'; |
| } |
| |
| function validateSymbol(value) { |
| if (!isSymbol(value)) { throw new TypeError(value + ' is not a symbol'); } |
| return value; |
| } |
| |
| var generateName = function () { |
| var created = Object.create(null); |
| return function (desc) { |
| var postfix = 0, |
| name; |
| while (created[desc + (postfix || '')]) { |
| ++postfix; |
| }desc += postfix || ''; |
| created[desc] = true; |
| name = '@@' + desc; |
| return name; |
| }; |
| }(); |
| |
| // Internal constructor (not one exposed) for creating Symbol instances. |
| // This one is used to ensure that `someSymbol instanceof Symbol` always return false |
| HiddenSymbol = function _Symbol(description) { |
| if (this instanceof HiddenSymbol) { throw new TypeError('Symbol is not a constructor'); } |
| return SymbolPolyfill(description); |
| }; |
| |
| // Exposed `Symbol` constructor |
| // (returns instances of HiddenSymbol) |
| module.exports = SymbolPolyfill = function _Symbol2(description) { |
| var symbol; |
| if (this instanceof _Symbol2) { throw new TypeError('Symbol is not a constructor'); } |
| symbol = Object.create(HiddenSymbol.prototype); |
| description = description === undefined ? '' : String(description); |
| return defineProperties(symbol, { |
| __description__: { value: description }, |
| __name__: { value: generateName(description) } |
| }); |
| }; |
| defineProperties(SymbolPolyfill, { |
| for: { value: function value(key) { |
| if (globalSymbols[key]) { return globalSymbols[key]; } |
| return globalSymbols[key] = SymbolPolyfill(String(key)); |
| } }, |
| keyFor: { value: function value(s) { |
| var key; |
| validateSymbol(s); |
| for (key in globalSymbols) { |
| if (globalSymbols[key] === s) { return key; } |
| } |
| } }, |
| |
| // To ensure proper interoperability with other native functions (e.g. Array.from) |
| // fallback to eventual native implementation of given symbol |
| hasInstance: { value: SymbolPolyfill('hasInstance') }, |
| isConcatSpreadable: { value: SymbolPolyfill('isConcatSpreadable') }, |
| iterator: { value: SymbolPolyfill('iterator') }, |
| match: { value: SymbolPolyfill('match') }, |
| replace: { value: SymbolPolyfill('replace') }, |
| search: { value: SymbolPolyfill('search') }, |
| species: { value: SymbolPolyfill('species') }, |
| split: { value: SymbolPolyfill('split') }, |
| toPrimitive: { value: SymbolPolyfill('toPrimitive') }, |
| toStringTag: { value: SymbolPolyfill('toStringTag') }, |
| unscopables: { value: SymbolPolyfill('unscopables') } |
| }); |
| |
| // Internal tweaks for real symbol producer |
| defineProperties(HiddenSymbol.prototype, { |
| constructor: { value: SymbolPolyfill }, |
| toString: { value: function value() { |
| return this.__name__; |
| } } |
| }); |
| |
| // Proper implementation of methods exposed on Symbol.prototype |
| // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype |
| defineProperties(SymbolPolyfill.prototype, { |
| toString: { value: function value() { |
| return 'Symbol (' + validateSymbol(this).__description__ + ')'; |
| } }, |
| valueOf: { value: function value() { |
| return validateSymbol(this); |
| } } |
| }); |
| |
| defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, { |
| value: function value() { |
| var symbol = validateSymbol(this); |
| if ((typeof symbol === 'undefined' ? 'undefined' : _typeof(symbol)) === 'symbol') { return symbol; } |
| return symbol.toString(); |
| } |
| }); |
| defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, { value: 'Symbol' }); |
| |
| // Proper implementaton of toPrimitive and toStringTag for returned symbol instances |
| defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toStringTag, { value: SymbolPolyfill.prototype[SymbolPolyfill.toStringTag] }); |
| |
| // Note: It's important to define `toPrimitive` as last one, as some implementations |
| // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols) |
| // And that may invoke error in definition flow: |
| // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149 |
| defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive, { value: SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive] }); |
| |
| /***/ }), |
| /* 1 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); // https://github.com/WebReflection/url-search-params |
| |
| |
| var _symbol = __webpack_require__(0); |
| |
| var _symbol2 = _interopRequireDefault(_symbol); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| var find = /[!'\(\)~]|%20|%00/g; |
| var plus = /\+/g; |
| var replace = { |
| '!': '%21', |
| "'": '%27', |
| '(': '%28', |
| ')': '%29', |
| '~': '%7E', |
| '%20': '+', |
| '%00': '\x00' |
| }; |
| var replacer = function replacer(match) { |
| return replace[match]; |
| }; |
| var secret = '__URLSearchParams__'; |
| |
| function encode(str) { |
| return encodeURIComponent(str).replace(find, replacer); |
| } |
| |
| function decode(str) { |
| return decodeURIComponent(str.replace(plus, ' ')); |
| } |
| |
| var URLSearchParams = function () { |
| function URLSearchParams(query) { |
| var this$1 = this; |
| |
| _classCallCheck(this, URLSearchParams); |
| |
| this[secret] = Object.create(null); |
| if (!query) { return; } |
| if (query.charAt(0) === '?') { |
| query = query.slice(1); |
| } |
| for (var index, value, pairs = (query || '').split('&'), i = 0, length = pairs.length; i < length; i++) { |
| value = pairs[i]; |
| index = value.indexOf('='); |
| if (-1 < index) { |
| this$1.append(decode(value.slice(0, index)), decode(value.slice(index + 1))); |
| } else if (value.length) { |
| this$1.append(decode(value), ''); |
| } |
| } |
| } |
| |
| _createClass(URLSearchParams, [{ |
| key: 'append', |
| value: function append(name, value) { |
| var dict = this[secret]; |
| if (name in dict) { |
| dict[name].push('' + value); |
| } else { |
| dict[name] = ['' + value]; |
| } |
| } |
| }, { |
| key: 'delete', |
| value: function _delete(name) { |
| delete this[secret][name]; |
| } |
| }, { |
| key: 'get', |
| value: function get(name) { |
| var dict = this[secret]; |
| return name in dict ? dict[name][0] : null; |
| } |
| }, { |
| key: 'getAll', |
| value: function getAll(name) { |
| var dict = this[secret]; |
| return name in dict ? dict[name].slice(0) : []; |
| } |
| }, { |
| key: 'has', |
| value: function has(name) { |
| return name in this[secret]; |
| } |
| }, { |
| key: 'set', |
| value: function set(name, value) { |
| this[secret][name] = ['' + value]; |
| } |
| }, { |
| key: 'forEach', |
| value: function forEach(callback, thisArg) { |
| var dict = this[secret]; |
| Object.getOwnPropertyNames(dict).forEach(function (name) { |
| dict[name].forEach(function (value) { |
| callback.call(thisArg, value, name, this); |
| }, this); |
| }, this); |
| } |
| }, { |
| key: 'keys', |
| value: function keys() { |
| var items = []; |
| this.forEach(function (value, name) { |
| items.push(name); |
| }); |
| var iterator = { |
| next: function next() { |
| var value = items.shift(); |
| return { done: value === undefined, value: value }; |
| } |
| }; |
| |
| iterator[_symbol2.default.iterator] = function () { |
| return iterator; |
| }; |
| |
| return iterator; |
| } |
| }, { |
| key: 'values', |
| value: function values() { |
| var items = []; |
| this.forEach(function (value) { |
| items.push(value); |
| }); |
| var iterator = { |
| next: function next() { |
| var value = items.shift(); |
| return { done: value === undefined, value: value }; |
| } |
| }; |
| |
| iterator[_symbol2.default.iterator] = function () { |
| return iterator; |
| }; |
| |
| return iterator; |
| } |
| }, { |
| key: 'entries', |
| value: function entries() { |
| var items = []; |
| this.forEach(function (value, name) { |
| items.push([name, value]); |
| }); |
| var iterator = { |
| next: function next() { |
| var value = items.shift(); |
| return { done: value === undefined, value: value }; |
| } |
| }; |
| |
| iterator[_symbol2.default.iterator] = function () { |
| return iterator; |
| }; |
| |
| return iterator; |
| } |
| }, { |
| key: 'toString', |
| value: function toString() { |
| var dict = this[secret], |
| query = [], |
| i, |
| key, |
| name, |
| value; |
| for (key in dict) { |
| name = encode(key); |
| for (i = 0, value = dict[key]; i < value.length; i++) { |
| query.push(name + '=' + encode(value[i])); |
| } |
| } |
| return query.join('&'); |
| } |
| }]); |
| |
| return URLSearchParams; |
| }(); |
| |
| URLSearchParams.prototype[_symbol2.default.iterator] = URLSearchParams.prototype.entries; |
| |
| module.exports = URLSearchParams; |
| |
| /***/ }), |
| /* 2 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| module.exports = { |
| get Promise() { |
| return __webpack_require__(3); |
| }, |
| get Symbol() { |
| return __webpack_require__(0); |
| }, |
| get Map() { |
| return __webpack_require__(4); |
| }, |
| get Set() { |
| return __webpack_require__(5); |
| }, |
| get WeakMap() { |
| return __webpack_require__(6); |
| }, |
| get WeakSet() { |
| return __webpack_require__(7); |
| }, |
| get FontFace() { |
| return __webpack_require__(8); |
| }, |
| get URL() { |
| return __webpack_require__(9); |
| }, |
| get URLSearchParams() { |
| return __webpack_require__(1); |
| }, |
| get matchMedia() { |
| return __webpack_require__(10); |
| } |
| }; |
| |
| /***/ }), |
| /* 3 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| /* eslint no-extend-native: "off" */ |
| |
| function noop() {} |
| |
| // Use polyfill for setImmediate for performance gains |
| var asap = typeof setImmediate === 'function' && setImmediate || function (fn) { |
| if (typeof setTimeout === 'function') { |
| setTimeout(fn, 0); |
| } else { |
| fn(); |
| } |
| }; |
| |
| var onUnhandledRejection = function onUnhandledRejection(err) { |
| if (typeof console !== 'undefined' && console) { |
| console.log('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console |
| } |
| }; |
| |
| // Polyfill for Function.prototype.bind |
| function bind(fn, thisArg) { |
| return function () { |
| fn.apply(thisArg, arguments); |
| }; |
| } |
| |
| function Promise(fn) { |
| if (_typeof(this) !== 'object') { throw new TypeError('Promises must be constructed via new'); } |
| if (typeof fn !== 'function') { throw new TypeError('Promise resolver is not a function'); } |
| this._state = 0; |
| this._handled = false; |
| this._value = undefined; |
| this._deferreds = []; |
| |
| doResolve(fn, this); |
| } |
| |
| function handle(self, deferred) { |
| while (self._state === 3) { |
| self = self._value; |
| } |
| if (self._state === 0) { |
| self._deferreds.push(deferred); |
| return; |
| } |
| self._handled = true; |
| asap(function () { |
| var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; |
| if (cb === null) { |
| (self._state === 1 ? resolve : reject)(deferred.promise, self._value); |
| return; |
| } |
| var ret; |
| try { |
| ret = cb(self._value); |
| } catch (e) { |
| reject(deferred.promise, e); |
| return; |
| } |
| resolve(deferred.promise, ret); |
| }); |
| } |
| |
| function resolve(self, newValue) { |
| try { |
| // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure |
| if (newValue === self) { throw new TypeError('A promise cannot be resolved with itself.'); } |
| if (newValue && ((typeof newValue === 'undefined' ? 'undefined' : _typeof(newValue)) === 'object' || typeof newValue === 'function')) { |
| var then = newValue.then; |
| if (newValue instanceof Promise) { |
| self._state = 3; |
| self._value = newValue; |
| finale(self); |
| return; |
| } else if (typeof then === 'function') { |
| doResolve(bind(then, newValue), self); |
| return; |
| } |
| } |
| self._state = 1; |
| self._value = newValue; |
| finale(self); |
| } catch (e) { |
| reject(self, e); |
| } |
| } |
| |
| function reject(self, newValue) { |
| self._state = 2; |
| self._value = newValue; |
| finale(self); |
| } |
| |
| function finale(self) { |
| if (self._state === 2 && self._deferreds.length === 0) { |
| asap(function () { |
| if (!self._handled) { |
| onUnhandledRejection(self._value); |
| } |
| }); |
| } |
| |
| for (var i = 0, len = self._deferreds.length; i < len; i++) { |
| handle(self, self._deferreds[i]); |
| } |
| self._deferreds = null; |
| } |
| |
| function Handler(onFulfilled, onRejected, promise) { |
| this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; |
| this.onRejected = typeof onRejected === 'function' ? onRejected : null; |
| this.promise = promise; |
| } |
| |
| /** |
| * Take a potentially misbehaving resolver function and make sure |
| * onFulfilled and onRejected are only called once. |
| * |
| * Makes no guarantees about asynchrony. |
| */ |
| function doResolve(fn, self) { |
| var done = false; |
| try { |
| fn(function (value) { |
| if (done) { return; } |
| done = true; |
| resolve(self, value); |
| }, function (reason) { |
| if (done) { return; } |
| done = true; |
| reject(self, reason); |
| }); |
| } catch (ex) { |
| if (done) { return; } |
| done = true; |
| reject(self, ex); |
| } |
| } |
| |
| Promise.prototype.catch = function (onRejected) { |
| return this.then(null, onRejected); |
| }; |
| |
| Promise.prototype.then = function (onFulfilled, onRejected) { |
| var prom = new this.constructor(noop); |
| |
| handle(this, new Handler(onFulfilled, onRejected, prom)); |
| return prom; |
| }; |
| |
| Promise.all = function (arr) { |
| var args = Array.prototype.slice.call(arr); |
| |
| return new Promise(function (resolve, reject) { |
| if (args.length === 0) { return resolve([]); } |
| var remaining = args.length; |
| |
| function res(i, val) { |
| try { |
| if (val && ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' || typeof val === 'function')) { |
| var then = val.then; |
| if (typeof then === 'function') { |
| then.call(val, function (val) { |
| res(i, val); |
| }, reject); |
| return; |
| } |
| } |
| args[i] = val; |
| if (--remaining === 0) { |
| resolve(args); |
| } |
| } catch (ex) { |
| reject(ex); |
| } |
| } |
| |
| for (var i = 0; i < args.length; i++) { |
| res(i, args[i]); |
| } |
| }); |
| }; |
| |
| Promise.resolve = function (value) { |
| if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.constructor === Promise) { |
| return value; |
| } |
| |
| return new Promise(function (resolve) { |
| resolve(value); |
| }); |
| }; |
| |
| Promise.reject = function (value) { |
| return new Promise(function (resolve, reject) { |
| reject(value); |
| }); |
| }; |
| |
| Promise.race = function (values) { |
| return new Promise(function (resolve, reject) { |
| for (var i = 0, len = values.length; i < len; i++) { |
| values[i].then(resolve, reject); |
| } |
| }); |
| }; |
| |
| /** |
| * Set the immediate function to execute callbacks |
| * @param fn {function} Function to execute |
| * @private |
| */ |
| Promise._setImmediateFn = function _setImmediateFn(fn) { |
| asap = fn; |
| }; |
| |
| Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { |
| onUnhandledRejection = fn; |
| }; |
| |
| module.exports = Promise; |
| |
| /***/ }), |
| /* 4 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _symbol = __webpack_require__(0); |
| |
| var _symbol2 = _interopRequireDefault(_symbol); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| // Deleted map items mess with iterator pointers, so rather than removing them mark them as deleted. Can't use undefined or null since those both valid keys so use a private symbol. |
| var undefMarker = (0, _symbol2.default)('undef'); |
| // NaN cannot be found in an array using indexOf, so we encode NaNs using a private symbol. |
| /* eslint no-extend-native: "off" */ |
| var NaNMarker = (0, _symbol2.default)('NaN'); |
| var ACCESSOR_SUPPORT = true; |
| |
| function encodeKey(key) { |
| return Number.isNaN(key) ? NaNMarker : key; |
| } |
| |
| function decodeKey(encodedKey) { |
| return encodedKey === NaNMarker ? NaN : encodedKey; |
| } |
| |
| function makeIterator(mapInst, getter) { |
| var nextIdx = 0; |
| var done = false; |
| return { |
| next: function next() { |
| if (nextIdx === mapInst._keys.length) { done = true; } |
| if (!done) { |
| while (mapInst._keys[nextIdx] === undefMarker) { |
| nextIdx++; |
| }return { value: getter.call(mapInst, nextIdx++), done: false }; |
| } else { |
| return { value: void 0, done: true }; |
| } |
| } |
| }; |
| } |
| |
| function calcSize(mapInst) { |
| var size = 0; |
| for (var i = 0, s = mapInst._keys.length; i < s; i++) { |
| if (mapInst._keys[i] !== undefMarker) { size++; } |
| } |
| return size; |
| } |
| |
| function hasProtoMethod(instance, method) { |
| return typeof instance[method] === 'function'; |
| } |
| |
| var Map = function Map(data) { |
| this._keys = []; |
| this._values = []; |
| // If `data` is iterable (indicated by presence of a forEach method), pre-populate the map |
| if (data && hasProtoMethod(data, 'forEach')) { |
| // Fastpath: If `data` is a Map, shortcircuit all following the checks |
| if (data instanceof Map || |
| // If `data` is not an instance of Map, it could be because you have a Map from an iframe or a worker or something. |
| // Check if `data` has all the `Map` methods and if so, assume data is another Map |
| hasProtoMethod(data, 'clear') && hasProtoMethod(data, 'delete') && hasProtoMethod(data, 'entries') && hasProtoMethod(data, 'forEach') && hasProtoMethod(data, 'get') && hasProtoMethod(data, 'has') && hasProtoMethod(data, 'keys') && hasProtoMethod(data, 'set') && hasProtoMethod(data, 'values')) { |
| data.forEach(function (value, key) { |
| this.set.apply(this, [key, value]); |
| }, this); |
| } else { |
| data.forEach(function (item) { |
| this.set.apply(this, item); |
| }, this); |
| } |
| } |
| |
| if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); } |
| }; |
| Map.prototype = {}; |
| |
| // Some old engines do not support ES5 getters/setters. Since Map only requires these for the size property, we can fall back to setting the size property statically each time the size of the map changes. |
| try { |
| Object.defineProperty(Map.prototype, 'size', { |
| get: function get() { |
| return calcSize(this); |
| } |
| }); |
| } catch (e) { |
| ACCESSOR_SUPPORT = false; |
| } |
| |
| Map.prototype.get = function (key) { |
| var idx = this._keys.indexOf(encodeKey(key)); |
| return idx !== -1 ? this._values[idx] : undefined; |
| }; |
| Map.prototype.set = function (key, value) { |
| var idx = this._keys.indexOf(encodeKey(key)); |
| if (idx !== -1) { |
| this._values[idx] = value; |
| } else { |
| this._keys.push(encodeKey(key)); |
| this._values.push(value); |
| if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); } |
| } |
| return this; |
| }; |
| Map.prototype.has = function (key) { |
| return this._keys.indexOf(encodeKey(key)) !== -1; |
| }; |
| Map.prototype.delete = function (key) { |
| var idx = this._keys.indexOf(encodeKey(key)); |
| if (idx === -1) { return false; } |
| this._keys[idx] = undefMarker; |
| this._values[idx] = undefMarker; |
| if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); } |
| return true; |
| }; |
| Map.prototype.clear = function () { |
| this._keys = this._values = []; |
| if (!ACCESSOR_SUPPORT) { this.size = 0; } |
| }; |
| Map.prototype.values = function () { |
| return makeIterator(this, function (i) { |
| return this._values[i]; |
| }); |
| }; |
| Map.prototype.keys = function () { |
| return makeIterator(this, function (i) { |
| return decodeKey(this._keys[i]); |
| }); |
| }; |
| Map.prototype.entries = Map.prototype[_symbol2.default.iterator] = function () { |
| return makeIterator(this, function (i) { |
| return [decodeKey(this._keys[i]), this._values[i]]; |
| }); |
| }; |
| Map.prototype.forEach = function (callbackFn, thisArg) { |
| var this$1 = this; |
| |
| thisArg = thisArg || commonjsGlobal; |
| var iterator = this.entries(); |
| var result = iterator.next(); |
| while (result.done === false) { |
| callbackFn.call(thisArg, result.value[1], result.value[0], this$1); |
| result = iterator.next(); |
| } |
| }; |
| |
| Map.prototype[_symbol2.default.species] = Map; |
| |
| Object.defineProperty(Map, 'constructor', { |
| value: Map |
| }); |
| |
| try { |
| Object.defineProperty(Map, 'length', { |
| value: 0 |
| }); |
| } catch (e) {} |
| |
| module.exports = Map; |
| |
| /***/ }), |
| /* 5 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _symbol = __webpack_require__(0); |
| |
| var _symbol2 = _interopRequireDefault(_symbol); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| // Deleted map items mess with iterator pointers, so rather than removing them mark them as deleted. Can't use undefined or null since those both valid keys so use a private symbol. |
| var undefMarker = (0, _symbol2.default)('undef'); |
| |
| // NaN cannot be found in an array using indexOf, so we encode NaNs using a private symbol. |
| /* eslint no-extend-native: "off" */ |
| var NaNMarker = (0, _symbol2.default)('NaN'); |
| |
| var ACCESSOR_SUPPORT = true; |
| |
| function encodeVal(data) { |
| return Number.isNaN(data) ? NaNMarker : data; |
| } |
| |
| function decodeVal(encodedData) { |
| return encodedData === NaNMarker ? NaN : encodedData; |
| } |
| |
| function makeIterator(setInst, getter) { |
| var nextIdx = 0; |
| return { |
| next: function next() { |
| while (setInst._values[nextIdx] === undefMarker) { |
| nextIdx++; |
| }if (nextIdx === setInst._values.length) { |
| return { value: void 0, done: true }; |
| } else { |
| return { value: getter.call(setInst, nextIdx++), done: false }; |
| } |
| } |
| }; |
| } |
| |
| function calcSize(setInst) { |
| var size = 0; |
| for (var i = 0, s = setInst._values.length; i < s; i++) { |
| if (setInst._values[i] !== undefMarker) { size++; } |
| } |
| return size; |
| } |
| |
| var Set = function Set(data) { |
| this._values = []; |
| |
| // If `data` is iterable (indicated by presence of a forEach method), pre-populate the set |
| data && typeof data.forEach === 'function' && data.forEach(function (item) { |
| this.add.call(this, item); |
| }, this); |
| |
| if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); } |
| }; |
| |
| // Some old engines do not support ES5 getters/setters. Since Set only requires these for the size property, we can fall back to setting the size property statically each time the size of the set changes. |
| try { |
| Object.defineProperty(Set.prototype, 'size', { |
| get: function get() { |
| return calcSize(this); |
| } |
| }); |
| } catch (e) { |
| ACCESSOR_SUPPORT = false; |
| } |
| |
| Set.prototype.add = function (value) { |
| value = encodeVal(value); |
| if (this._values.indexOf(value) === -1) { |
| this._values.push(value); |
| if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); } |
| } |
| return this; |
| }; |
| Set.prototype.has = function (value) { |
| return this._values.indexOf(encodeVal(value)) !== -1; |
| }; |
| Set.prototype.delete = function (value) { |
| var idx = this._values.indexOf(encodeVal(value)); |
| if (idx === -1) { return false; } |
| this._values[idx] = undefMarker; |
| if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); } |
| return true; |
| }; |
| Set.prototype.clear = function () { |
| this._values = []; |
| if (!ACCESSOR_SUPPORT) { this.size = 0; } |
| }; |
| Set.prototype.values = Set.prototype.keys = function () { |
| return makeIterator(this, function (i) { |
| return decodeVal(this._values[i]); |
| }); |
| }; |
| Set.prototype.entries = Set.prototype[_symbol2.default.iterator] = function () { |
| return makeIterator(this, function (i) { |
| return [decodeVal(this._values[i]), decodeVal(this._values[i])]; |
| }); |
| }; |
| Set.prototype.forEach = function (callbackFn, thisArg) { |
| var this$1 = this; |
| |
| thisArg = thisArg || commonjsGlobal; |
| var iterator = this.entries(); |
| var result = iterator.next(); |
| while (result.done === false) { |
| callbackFn.call(thisArg, result.value[1], result.value[0], this$1); |
| result = iterator.next(); |
| } |
| }; |
| |
| Set.prototype[_symbol2.default.species] = Set; |
| |
| Object.defineProperty(Set, 'constructor', { |
| value: Set |
| }); |
| |
| try { |
| Object.defineProperty(Set, 'length', { |
| value: 0 |
| }); |
| } catch (e) {} |
| |
| module.exports = Set; |
| |
| /***/ }), |
| /* 6 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| /* eslint no-extend-native: "off" */ |
| |
| var defineProperty = Object.defineProperty; |
| var counter = Date.now() % 1e9; |
| |
| var WeakMap = function WeakMap(data) { |
| this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__'); |
| |
| // If data is iterable (indicated by presence of a forEach method), pre-populate the map |
| data && data.forEach && data.forEach(function (item) { |
| this.set.apply(this, item); |
| }, this); |
| }; |
| |
| WeakMap.prototype.set = function (key, value) { |
| if ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) !== 'object' && typeof key !== 'function') { throw new TypeError('Invalid value used as weak map key'); } |
| |
| var entry = key[this.name]; |
| if (entry && entry[0] === key) { entry[1] = value; }else { defineProperty(key, this.name, { value: [key, value], writable: true }); } |
| return this; |
| }; |
| |
| WeakMap.prototype.get = function (key) { |
| var entry; |
| return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; |
| }; |
| |
| WeakMap.prototype.delete = function (key) { |
| var entry = key[this.name]; |
| if (!entry || entry[0] !== key) { return false; } |
| entry[0] = entry[1] = undefined; |
| return true; |
| }; |
| |
| WeakMap.prototype.has = function (key) { |
| var entry = key[this.name]; |
| if (!entry) { return false; } |
| return entry[0] === key; |
| }; |
| |
| module.exports = WeakMap; |
| |
| /***/ }), |
| /* 7 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| /* eslint no-extend-native: "off" */ |
| |
| var counter = Date.now() % 1e9; |
| |
| var WeakSet = function WeakSet(data) { |
| this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__'); |
| data && data.forEach && data.forEach(this.add, this); |
| }; |
| |
| WeakSet.prototype.add = function (obj) { |
| var name = this.name; |
| if (!obj[name]) { Object.defineProperty(obj, name, { value: true, writable: true }); } |
| return this; |
| }; |
| |
| WeakSet.prototype.delete = function (obj) { |
| if (!obj[this.name]) { return false; } |
| obj[this.name] = undefined; |
| return true; |
| }; |
| |
| WeakSet.prototype.has = function (obj) { |
| return !!obj[this.name]; |
| }; |
| |
| module.exports = WeakSet; |
| |
| /***/ }), |
| /* 8 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| var FontFace = function FontFace(family, source) { |
| _classCallCheck(this, FontFace); |
| |
| this.family = family; |
| this.source = source; |
| }; |
| |
| module.exports = FontFace; |
| |
| /***/ }), |
| /* 9 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| // https://github.com/Polymer/URL |
| |
| var URLSearchParams = __webpack_require__(1); |
| |
| var relative = Object.create(null); |
| relative.ftp = 21; |
| relative.file = 0; |
| relative.gopher = 70; |
| relative.http = 80; |
| relative.https = 443; |
| relative.ws = 80; |
| relative.wss = 443; |
| |
| var relativePathDotMapping = Object.create(null); |
| relativePathDotMapping['%2e'] = '.'; |
| relativePathDotMapping['.%2e'] = '..'; |
| relativePathDotMapping['%2e.'] = '..'; |
| relativePathDotMapping['%2e%2e'] = '..'; |
| |
| function isRelativeScheme(scheme) { |
| return relative[scheme] !== undefined; |
| } |
| |
| function invalid() { |
| clear.call(this); |
| this._isInvalid = true; |
| } |
| |
| function IDNAToASCII(h) { |
| if ('' == h) { |
| invalid.call(this); |
| } |
| // XXX |
| return h.toLowerCase(); |
| } |
| |
| function percentEscape(c) { |
| var unicode = c.charCodeAt(0); |
| if (unicode > 0x20 && unicode < 0x7F && |
| // " # < > ? ` |
| [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1) { |
| return c; |
| } |
| return encodeURIComponent(c); |
| } |
| |
| function percentEscapeQuery(c) { |
| // XXX This actually needs to encode c using encoding and then |
| // convert the bytes one-by-one. |
| |
| var unicode = c.charCodeAt(0); |
| if (unicode > 0x20 && unicode < 0x7F && |
| // " # < > ` (do not escape '?') |
| [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1) { |
| return c; |
| } |
| return encodeURIComponent(c); |
| } |
| |
| var EOF = undefined, |
| ALPHA = /[a-zA-Z]/, |
| ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; |
| |
| function parse(input, stateOverride, base) { |
| var this$1 = this; |
| |
| function err(message) { |
| errors.push(message); |
| } |
| |
| var state = stateOverride || 'scheme start', |
| cursor = 0, |
| buffer = '', |
| seenAt = false, |
| seenBracket = false, |
| errors = []; |
| |
| loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { |
| var c = input[cursor]; |
| switch (state) { |
| case 'scheme start': |
| if (c && ALPHA.test(c)) { |
| buffer += c.toLowerCase(); // ASCII-safe |
| state = 'scheme'; |
| } else if (!stateOverride) { |
| buffer = ''; |
| state = 'no scheme'; |
| continue; |
| } else { |
| err('Invalid scheme.'); |
| break loop; |
| } |
| break; |
| |
| case 'scheme': |
| if (c && ALPHANUMERIC.test(c)) { |
| buffer += c.toLowerCase(); // ASCII-safe |
| } else if (':' == c) { |
| this$1._scheme = buffer; |
| buffer = ''; |
| if (stateOverride) { |
| break loop; |
| } |
| if (isRelativeScheme(this$1._scheme)) { |
| this$1._isRelative = true; |
| } |
| if ('file' == this$1._scheme) { |
| state = 'relative'; |
| } else if (this$1._isRelative && base && base._scheme == this$1._scheme) { |
| state = 'relative or authority'; |
| } else if (this$1._isRelative) { |
| state = 'authority first slash'; |
| } else { |
| state = 'scheme data'; |
| } |
| } else if (!stateOverride) { |
| buffer = ''; |
| cursor = 0; |
| state = 'no scheme'; |
| continue; |
| } else if (EOF == c) { |
| break loop; |
| } else { |
| err('Code point not allowed in scheme: ' + c); |
| break loop; |
| } |
| break; |
| |
| case 'scheme data': |
| if ('?' == c) { |
| state = 'query'; |
| } else if ('#' == c) { |
| this$1._fragment = '#'; |
| state = 'fragment'; |
| } else { |
| // XXX error handling |
| if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { |
| this$1._schemeData += percentEscape(c); |
| } |
| } |
| break; |
| |
| case 'no scheme': |
| if (!base || !isRelativeScheme(base._scheme)) { |
| err('Missing scheme.'); |
| invalid.call(this$1); |
| } else { |
| state = 'relative'; |
| continue; |
| } |
| break; |
| |
| case 'relative or authority': |
| if ('/' == c && '/' == input[cursor + 1]) { |
| state = 'authority ignore slashes'; |
| } else { |
| err('Expected /, got: ' + c); |
| state = 'relative'; |
| continue; |
| } |
| break; |
| |
| case 'relative': |
| this$1._isRelative = true; |
| if ('file' != this$1._scheme) { this$1._scheme = base._scheme; } |
| if (EOF == c) { |
| this$1._host = base._host; |
| this$1._port = base._port; |
| this$1._path = base._path.slice(); |
| this$1._query = base._query; |
| this$1._username = base._username; |
| this$1._password = base._password; |
| break loop; |
| } else if ('/' == c || '\\' == c) { |
| if ('\\' == c) { err('\\ is an invalid code point.'); } |
| state = 'relative slash'; |
| } else if ('?' == c) { |
| this$1._host = base._host; |
| this$1._port = base._port; |
| this$1._path = base._path.slice(); |
| this$1._query = '?'; |
| this$1._username = base._username; |
| this$1._password = base._password; |
| state = 'query'; |
| } else if ('#' == c) { |
| this$1._host = base._host; |
| this$1._port = base._port; |
| this$1._path = base._path.slice(); |
| this$1._query = base._query; |
| this$1._fragment = '#'; |
| this$1._username = base._username; |
| this$1._password = base._password; |
| state = 'fragment'; |
| } else { |
| var nextC = input[cursor + 1]; |
| var nextNextC = input[cursor + 2]; |
| if ('file' != this$1._scheme || !ALPHA.test(c) || nextC != ':' && nextC != '|' || EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC) { |
| this$1._host = base._host; |
| this$1._port = base._port; |
| this$1._username = base._username; |
| this$1._password = base._password; |
| this$1._path = base._path.slice(); |
| this$1._path.pop(); |
| } |
| state = 'relative path'; |
| continue; |
| } |
| break; |
| |
| case 'relative slash': |
| if ('/' == c || '\\' == c) { |
| if ('\\' == c) { |
| err('\\ is an invalid code point.'); |
| } |
| if ('file' == this$1._scheme) { |
| state = 'file host'; |
| } else { |
| state = 'authority ignore slashes'; |
| } |
| } else { |
| if ('file' != this$1._scheme) { |
| this$1._host = base._host; |
| this$1._port = base._port; |
| this$1._username = base._username; |
| this$1._password = base._password; |
| } |
| state = 'relative path'; |
| continue; |
| } |
| break; |
| |
| case 'authority first slash': |
| if ('/' == c) { |
| state = 'authority second slash'; |
| } else { |
| err("Expected '/', got: " + c); |
| state = 'authority ignore slashes'; |
| continue; |
| } |
| break; |
| |
| case 'authority second slash': |
| state = 'authority ignore slashes'; |
| if ('/' != c) { |
| err("Expected '/', got: " + c); |
| continue; |
| } |
| break; |
| |
| case 'authority ignore slashes': |
| if ('/' != c && '\\' != c) { |
| state = 'authority'; |
| continue; |
| } else { |
| err('Expected authority, got: ' + c); |
| } |
| break; |
| |
| case 'authority': |
| if ('@' == c) { |
| if (seenAt) { |
| err('@ already seen.'); |
| buffer += '%40'; |
| } |
| seenAt = true; |
| for (var i = 0; i < buffer.length; i++) { |
| var cp = buffer[i]; |
| if ('\t' == cp || '\n' == cp || '\r' == cp) { |
| err('Invalid whitespace in authority.'); |
| continue; |
| } |
| // XXX check URL code points |
| if (':' == cp && null === this$1._password) { |
| this$1._password = ''; |
| continue; |
| } |
| var tempC = percentEscape(cp); |
| null !== this$1._password ? this$1._password += tempC : this$1._username += tempC; |
| } |
| buffer = ''; |
| } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { |
| cursor -= buffer.length; |
| buffer = ''; |
| state = 'host'; |
| continue; |
| } else { |
| buffer += c; |
| } |
| break; |
| |
| case 'file host': |
| if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { |
| if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { |
| state = 'relative path'; |
| } else if (buffer.length == 0) { |
| state = 'relative path start'; |
| } else { |
| this$1._host = IDNAToASCII.call(this$1, buffer); |
| buffer = ''; |
| state = 'relative path start'; |
| } |
| continue; |
| } else if ('\t' == c || '\n' == c || '\r' == c) { |
| err('Invalid whitespace in file host.'); |
| } else { |
| buffer += c; |
| } |
| break; |
| |
| case 'host': |
| case 'hostname': |
| if (':' == c && !seenBracket) { |
| // XXX host parsing |
| this$1._host = IDNAToASCII.call(this$1, buffer); |
| buffer = ''; |
| state = 'port'; |
| if ('hostname' == stateOverride) { |
| break loop; |
| } |
| } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { |
| this$1._host = IDNAToASCII.call(this$1, buffer); |
| buffer = ''; |
| state = 'relative path start'; |
| if (stateOverride) { |
| break loop; |
| } |
| continue; |
| } else if ('\t' != c && '\n' != c && '\r' != c) { |
| if ('[' == c) { |
| seenBracket = true; |
| } else if (']' == c) { |
| seenBracket = false; |
| } |
| buffer += c; |
| } else { |
| err('Invalid code point in host/hostname: ' + c); |
| } |
| break; |
| |
| case 'port': |
| if (/[0-9]/.test(c)) { |
| buffer += c; |
| } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { |
| if ('' != buffer) { |
| var temp = parseInt(buffer, 10); |
| if (temp != relative[this$1._scheme]) { |
| this$1._port = temp + ''; |
| } |
| buffer = ''; |
| } |
| if (stateOverride) { |
| break loop; |
| } |
| state = 'relative path start'; |
| continue; |
| } else if ('\t' == c || '\n' == c || '\r' == c) { |
| err('Invalid code point in port: ' + c); |
| } else { |
| invalid.call(this$1); |
| } |
| break; |
| |
| case 'relative path start': |
| if ('\\' == c) { err("'\\' not allowed in path."); } |
| state = 'relative path'; |
| if ('/' != c && '\\' != c) { |
| continue; |
| } |
| break; |
| |
| case 'relative path': |
| if (EOF == c || '/' == c || '\\' == c || !stateOverride && ('?' == c || '#' == c)) { |
| if ('\\' == c) { |
| err('\\ not allowed in relative path.'); |
| } |
| var tmp; |
| if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { |
| buffer = tmp; |
| } |
| if ('..' == buffer) { |
| this$1._path.pop(); |
| if ('/' != c && '\\' != c) { |
| this$1._path.push(''); |
| } |
| } else if ('.' == buffer && '/' != c && '\\' != c) { |
| this$1._path.push(''); |
| } else if ('.' != buffer) { |
| if ('file' == this$1._scheme && this$1._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { |
| buffer = buffer[0] + ':'; |
| } |
| this$1._path.push(buffer); |
| } |
| buffer = ''; |
| if ('?' == c) { |
| this$1._query = '?'; |
| state = 'query'; |
| } else if ('#' == c) { |
| this$1._fragment = '#'; |
| state = 'fragment'; |
| } |
| } else if ('\t' != c && '\n' != c && '\r' != c) { |
| buffer += percentEscape(c); |
| } |
| break; |
| |
| case 'query': |
| if (!stateOverride && '#' == c) { |
| this$1._fragment = '#'; |
| state = 'fragment'; |
| } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { |
| this$1._query += percentEscapeQuery(c); |
| } |
| break; |
| |
| case 'fragment': |
| if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { |
| this$1._fragment += c; |
| } |
| break; |
| } |
| |
| cursor++; |
| } |
| } |
| |
| function clear() { |
| this._scheme = ''; |
| this._schemeData = ''; |
| this._username = ''; |
| this._password = null; |
| this._host = ''; |
| this._port = ''; |
| this._path = []; |
| this._query = ''; |
| this._fragment = ''; |
| this._isInvalid = false; |
| this._isRelative = false; |
| } |
| |
| // Does not process domain names or IP addresses. |
| // Does not handle encoding for the query parameter. |
| function URL(url, base /* , encoding */) { |
| if (base !== undefined && !(base instanceof URL)) { base = new URL(String(base)); } |
| |
| this._url = url; |
| clear.call(this); |
| |
| var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); |
| // encoding = encoding || 'utf-8' |
| |
| parse.call(this, input, null, base); |
| } |
| |
| URL.prototype = { |
| toString: function toString() { |
| return this.href; |
| }, |
| get href() { |
| if (this._isInvalid) { return this._url; } |
| |
| var authority = ''; |
| if ('' != this._username || null != this._password) { |
| authority = this._username + (null != this._password ? ':' + this._password : '') + '@'; |
| } |
| |
| return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment; |
| }, |
| set href(href) { |
| clear.call(this); |
| parse.call(this, href); |
| }, |
| |
| get protocol() { |
| return this._scheme + ':'; |
| }, |
| set protocol(protocol) { |
| if (this._isInvalid) { return; } |
| parse.call(this, protocol + ':', 'scheme start'); |
| }, |
| |
| get host() { |
| return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host; |
| }, |
| set host(host) { |
| if (this._isInvalid || !this._isRelative) { return; } |
| parse.call(this, host, 'host'); |
| }, |
| |
| get hostname() { |
| return this._host; |
| }, |
| set hostname(hostname) { |
| if (this._isInvalid || !this._isRelative) { return; } |
| parse.call(this, hostname, 'hostname'); |
| }, |
| |
| get port() { |
| return this._port; |
| }, |
| set port(port) { |
| if (this._isInvalid || !this._isRelative) { return; } |
| parse.call(this, port, 'port'); |
| }, |
| |
| get pathname() { |
| return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData; |
| }, |
| set pathname(pathname) { |
| if (this._isInvalid || !this._isRelative) { return; } |
| this._path = []; |
| parse.call(this, pathname, 'relative path start'); |
| }, |
| |
| get search() { |
| return this._isInvalid || !this._query || '?' == this._query ? '' : this._query; |
| }, |
| set search(search) { |
| if (this._isInvalid || !this._isRelative) { return; } |
| this._query = '?'; |
| if ('?' == search[0]) { search = search.slice(1); } |
| parse.call(this, search, 'query'); |
| }, |
| |
| get searchParams() { |
| return new URLSearchParams(this.search); |
| }, |
| |
| get hash() { |
| return this._isInvalid || !this._fragment || '#' == this._fragment ? '' : this._fragment; |
| }, |
| set hash(hash) { |
| if (this._isInvalid) { return; } |
| this._fragment = '#'; |
| if ('#' == hash[0]) { hash = hash.slice(1); } |
| parse.call(this, hash, 'fragment'); |
| }, |
| |
| get origin() { |
| var host; |
| if (this._isInvalid || !this._scheme) { |
| return ''; |
| } |
| // javascript: Gecko returns String(""), WebKit/Blink String("null") |
| // Gecko throws error for "data://" |
| // data: Gecko returns "", Blink returns "data://", WebKit returns "null" |
| // Gecko returns String("") for file: mailto: |
| // WebKit/Blink returns String("SCHEME://") for file: mailto: |
| switch (this._scheme) { |
| case 'data': |
| case 'file': |
| case 'javascript': |
| case 'mailto': |
| return 'null'; |
| } |
| host = this.host; |
| if (!host) { |
| return ''; |
| } |
| return this._scheme + '://' + host; |
| } |
| }; |
| |
| module.exports = URL; |
| |
| /***/ }), |
| /* 10 */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| // https://github.com/ericf/css-mediaquery |
| |
| var RE_MEDIA_QUERY = /^(?:(only|not)?\s*([_a-z][_a-z0-9-]*)|(\([^\)]+\)))(?:\s*and\s*(.*))?$/i, |
| RE_MQ_EXPRESSION = /^\(\s*([_a-z-][_a-z0-9-]*)\s*(?:\:\s*([^\)]+))?\s*\)$/, |
| RE_MQ_FEATURE = /^(?:(min|max)-)?(.+)/; |
| |
| function _matches(media, values) { |
| return _parseQuery(media).some(function (query) { |
| var inverse = query.inverse; |
| |
| var typeMatch = query.type === 'all' || values.type === query.type; |
| |
| if (typeMatch && inverse || !(typeMatch || inverse)) { |
| return false; |
| } |
| |
| var expressionsMatch = query.expressions.every(function (expression) { |
| var feature = expression.feature, |
| modifier = expression.modifier, |
| expValue = expression.value, |
| value = values[feature]; |
| |
| if (!value) { |
| return false; |
| } |
| |
| switch (feature) { |
| case 'width': |
| case 'height': |
| expValue = parseFloat(expValue); |
| value = parseFloat(value); |
| break; |
| } |
| |
| switch (modifier) { |
| case 'min': |
| return value >= expValue; |
| case 'max': |
| return value <= expValue; |
| default: |
| return value === expValue; |
| } |
| }); |
| |
| return expressionsMatch && !inverse || !expressionsMatch && inverse; |
| }); |
| } |
| |
| function _parseQuery(media) { |
| return media.split(',').map(function (query) { |
| query = query.trim(); |
| |
| var captures = query.match(RE_MEDIA_QUERY); |
| |
| if (!captures) { |
| throw new SyntaxError('Invalid CSS media query: "' + query + '"'); |
| } |
| |
| var modifier = captures[1], |
| type = captures[2], |
| expressions = ((captures[3] || '') + (captures[4] || '')).trim(), |
| parsed = {}; |
| |
| parsed.inverse = !!modifier && modifier.toLowerCase() === 'not'; |
| parsed.type = type ? type.toLowerCase() : 'all'; |
| |
| if (!expressions) { |
| parsed.expressions = []; |
| return parsed; |
| } |
| |
| expressions = expressions.match(/\([^\)]+\)/g); |
| |
| if (!expressions) { |
| throw new SyntaxError('Invalid CSS media query: "' + query + '"'); |
| } |
| |
| parsed.expressions = expressions.map(function (expression) { |
| var captures = expression.match(RE_MQ_EXPRESSION); |
| |
| if (!captures) { |
| throw new SyntaxError('Invalid CSS media query: "' + query + '"'); |
| } |
| |
| var feature = captures[1].toLowerCase().match(RE_MQ_FEATURE); |
| |
| return { |
| modifier: feature[1], |
| feature: feature[2], |
| value: captures[2] |
| }; |
| }); |
| |
| return parsed; |
| }); |
| } |
| |
| function matchMedia(media) { |
| var mql = { |
| matches: false, |
| media: media |
| }; |
| |
| if (media === '') { |
| mql.matches = true; |
| return mql; |
| } |
| |
| mql.matches = _matches(media, { |
| type: 'screen', |
| width: window.screen.width, |
| height: window.screen.height |
| }); |
| |
| return mql; |
| } |
| |
| module.exports = matchMedia; |
| |
| /***/ }) |
| /******/ ])}; |
| |
| /***/ }), |
| /* 7 */ |
| /*!********************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/define.weex.js ***! |
| \********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| module.exports = function (modules) { |
| function define(name, deps, factory) { |
| if (deps instanceof Function) { |
| factory = deps; |
| deps = []; |
| } |
| |
| modules[name] = { |
| factory: factory, |
| deps: deps, |
| module: { exports: {} }, |
| isInitialized: false, |
| hasError: false |
| }; |
| } |
| |
| return define; |
| }; |
| |
| /***/ }), |
| /* 8 */ |
| /*!*********************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/require.weex.js ***! |
| \*********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| module.exports = function (modules) { |
| function require(name) { |
| var mod = modules[name]; |
| |
| if (mod && mod.isInitialized) { |
| return mod.module.exports; |
| } |
| |
| if (!mod) { |
| throw new Error('Requiring unknown module "' + name + '"'); |
| } |
| |
| if (mod.hasError) { |
| throw new Error('Requiring module "' + name + '" which threw an exception'); |
| } |
| |
| try { |
| mod.isInitialized = true; |
| mod.factory(require, mod.module.exports, mod.module); |
| } catch (e) { |
| mod.hasError = true; |
| mod.isInitialized = false; |
| throw e; |
| } |
| |
| return mod.module.exports; |
| } |
| |
| return require; |
| }; |
| |
| /***/ }), |
| /* 9 */ |
| /*!***********************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/downgrade.weex.js ***! |
| \***********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _semver = __webpack_require__(/*! ./semver */ 10); |
| |
| var _semver2 = _interopRequireDefault(_semver); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function normalizeVersion(v) { |
| if (v == '*') { |
| return v; |
| } |
| v = typeof v === 'string' ? v : ''; |
| var split = v.split('.'); |
| var i = 0; |
| var result = []; |
| |
| while (i < 3) { |
| var s = typeof split[i] === 'string' && split[i] ? split[i] : '0'; |
| result.push(s); |
| i++; |
| } |
| |
| return result.join('.'); |
| } /* global WXEnvironment */ |
| |
| function getError(key, val, criteria) { |
| var result = { |
| isDowngrade: true, |
| errorType: 1, |
| code: 1000 |
| }; |
| var getMsg = function getMsg(key, val, criteria) { |
| return 'Downgrade[' + key + '] :: deviceInfo ' + val + ' matched criteria ' + criteria; |
| }; |
| var _key = key.toLowerCase(); |
| |
| if (_key.indexOf('osversion') >= 0) { |
| result.code = 1001; |
| } else if (_key.indexOf('appversion') >= 0) { |
| result.code = 1002; |
| } else if (_key.indexOf('weexversion') >= 0) { |
| result.code = 1003; |
| } else if (_key.indexOf('devicemodel') >= 0) { |
| result.code = 1004; |
| } |
| |
| result.errorMessage = getMsg(key, val, criteria); |
| return result; |
| } |
| |
| /** |
| * config |
| * |
| * { |
| * ios: { |
| * osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * deviceModel: ['modelA', 'modelB', ...] |
| * }, |
| * android: { |
| * osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0' |
| * deviceModel: ['modelA', 'modelB', ...] |
| * } |
| * } |
| * |
| */ |
| function check(config) { |
| var result = { |
| isDowngrade: false |
| }; |
| |
| var deviceInfo = WXEnvironment; |
| |
| var platform = deviceInfo.platform || 'unknow'; |
| var dPlatform = platform.toLowerCase(); |
| var cObj = config[dPlatform] || {}; |
| |
| for (var i in deviceInfo) { |
| var key = i; |
| var keyLower = key.toLowerCase(); |
| var val = deviceInfo[i]; |
| var isVersion = keyLower.indexOf('version') >= 0; |
| var isDeviceModel = keyLower.indexOf('devicemodel') >= 0; |
| var criteria = cObj[i]; |
| |
| if (criteria && isVersion) { |
| var c = normalizeVersion(criteria); |
| var d = normalizeVersion(deviceInfo[i]); |
| |
| if (_semver2.default.satisfies(d, c)) { |
| result = getError(key, val, criteria); |
| break; |
| } |
| } else if (isDeviceModel) { |
| var _criteria = Array.isArray(criteria) ? criteria : [criteria]; |
| |
| if (_criteria.indexOf(val) >= 0) { |
| result = getError(key, val, criteria); |
| break; |
| } |
| } |
| } |
| |
| return result; |
| } |
| |
| module.exports = function (__weex_require__) { |
| return function (config) { |
| var nativeInstanceWrap = __weex_require__('@weex-module/instanceWrap'); |
| var result = check(config); |
| if (result.isDowngrade) { |
| nativeInstanceWrap.error(result.errorType, result.code, result.errorMessage); |
| return true; |
| } |
| return false; |
| }; |
| }; |
| |
| /***/ }), |
| /* 10 */ |
| /*!***************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/semver.js ***! |
| \***************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
| |
| exports.default = { |
| satisfies: function satisfies(left, right) { |
| var regex = /(\W+)?([\d|.]+)/; |
| |
| if ((typeof left === 'undefined' ? 'undefined' : _typeof(left)) + (typeof right === 'undefined' ? 'undefined' : _typeof(right)) != 'stringstring') { return false; } |
| |
| if (right == '*') { |
| return true; |
| } |
| |
| var arr = right.match(regex); |
| var a = left.split('.'), |
| i = 0, |
| b = arr[2].split('.'), |
| len = Math.max(a.length, b.length); |
| |
| var flag = 0; |
| for (var _i = 0; _i < len; _i++) { |
| if (a[_i] && !b[_i] && parseInt(a[_i]) > 0 || parseInt(a[_i]) > parseInt(b[_i])) { |
| flag = 1; |
| break; |
| } else if (b[_i] && !a[_i] && parseInt(b[_i]) > 0 || parseInt(a[_i]) < parseInt(b[_i])) { |
| flag = -1; |
| break; |
| } |
| } |
| |
| switch (arr[1]) { |
| case '<': |
| if (flag === -1) { |
| return true; |
| } |
| break; |
| case '<=': |
| if (flag !== 1) { |
| return true; |
| } |
| break; |
| case '>': |
| if (flag === 1) { |
| return true; |
| } |
| break; |
| case '>=': |
| if (flag !== -1) { |
| return true; |
| } |
| break; |
| default: |
| if (flag === 0) { |
| return true; |
| } |
| break; |
| } |
| return false; |
| } |
| }; |
| module.exports = exports['default']; |
| |
| /***/ }), |
| /* 11 */ |
| /*!**********************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/document.weex.js ***! |
| \**********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _emitter = __webpack_require__(/*! ./emitter */ 1); |
| |
| var _emitter2 = _interopRequireDefault(_emitter); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| var DOM_MODULE = '@weex-module/dom'; |
| var VISIBLE = 'visible'; |
| var HIDDEN = 'hidden'; |
| var VISIBILITY_CHANGE_EVENT = 'visibilitychange'; |
| |
| function addBodyAppearListener(document) { |
| document.body.addEvent('viewappear', function (e) { |
| document.visibilityState = VISIBLE; |
| e.type = VISIBILITY_CHANGE_EVENT; |
| document.dispatchEvent(e); |
| }); |
| |
| document.body.addEvent('viewdisappear', function (e) { |
| document.visibilityState = HIDDEN; |
| e.type = VISIBILITY_CHANGE_EVENT; |
| document.dispatchEvent(e); |
| }); |
| } |
| |
| function removeBodyAppearListener(document) { |
| if (document.body) { |
| document.body.removeEvent('viewappear'); |
| document.body.removeEvent('viewdisappear'); |
| } |
| } |
| |
| module.exports = function (__weex_require__, document) { |
| // Add w3c events |
| var documentEmitter = new _emitter2.default(); |
| var hasVisibilityEventPending = false; |
| |
| // Weex freezed the document maybe throw error |
| try { |
| document.addEventListener = function (type, listener) { |
| if (type === VISIBILITY_CHANGE_EVENT) { |
| if (document.body) { |
| addBodyAppearListener(document); |
| } else { |
| hasVisibilityEventPending = true; |
| } |
| } |
| documentEmitter.on(type, listener); |
| }; |
| |
| document.removeEventListener = function (type, listener) { |
| if (type === VISIBILITY_CHANGE_EVENT) { |
| removeBodyAppearListener(document); |
| } |
| documentEmitter.off(type, listener); |
| }; |
| |
| document.dispatchEvent = function (e) { |
| documentEmitter.emit(e.type, e); |
| }; |
| |
| // FontFace |
| document.fonts = { |
| add: function add(fontFace) { |
| var domModule = __weex_require__(DOM_MODULE); |
| domModule.addRule('fontFace', { |
| fontFamily: fontFace.family, |
| src: fontFace.source // url('uri') : single quotes are required around uri, and double quotes can not work in weex |
| }); |
| } |
| }; |
| |
| // Init visibility state |
| document.visibilityState = VISIBLE; |
| |
| // Hijack the origin createBody |
| var originCreateBody = document.createBody; |
| |
| Object.defineProperty(document, 'createBody', { |
| value: function value() { |
| var body = originCreateBody.apply(document, arguments); |
| |
| if (hasVisibilityEventPending) { |
| addBodyAppearListener(document); |
| } |
| return body; |
| } |
| }); |
| } catch (e) { |
| console.log(e); |
| } |
| |
| return document; |
| }; |
| |
| /***/ }), |
| /* 12 */ |
| /*!**********************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/location.weex.js ***! |
| \**********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var LOCATION_MODULE = '@weex-module/location'; |
| var NAVIGATOR_MODULE = '@weex-module/navigator'; |
| |
| module.exports = function (__weex_require__, location) { |
| location.assign = function (url) { |
| var weexNavigator = __weex_require__(NAVIGATOR_MODULE); |
| weexNavigator.push({ |
| url: url, |
| animated: 'true' |
| }, function (e) { |
| // noop |
| }); |
| }; |
| |
| location.replace = function (url) { |
| var weexLocation = __weex_require__(LOCATION_MODULE); |
| weexLocation.replace(url); |
| }; |
| |
| location.reload = function (forceReload) { |
| var weexLocation = __weex_require__(LOCATION_MODULE); |
| weexLocation.reload(forceReload); |
| }; |
| |
| return location; |
| }; |
| |
| /***/ }), |
| /* 13 */ |
| /*!*******************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/fetch.weex.js ***! |
| \*******************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var STREAM_MODULE = '@weex-module/stream'; |
| |
| module.exports = function (__weex_require__, Promise) { |
| function normalizeName(name) { |
| if (typeof name !== 'string') { |
| name = String(name); |
| } |
| // FIXME: In spdy the response header has name like ":version" that is invalid |
| // if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { |
| // throw new TypeError('Invalid character in header field name'); |
| // } |
| return name.toLowerCase(); |
| } |
| |
| function normalizeValue(value) { |
| if (typeof value !== 'string') { |
| value = String(value); |
| } |
| return value; |
| } |
| |
| function Headers(headers) { |
| this.originHeaders = headers; |
| this.map = {}; |
| |
| if (headers instanceof Headers) { |
| headers.forEach(function (value, name) { |
| this.append(name, value); |
| }, this); |
| } else if (headers) { |
| Object.getOwnPropertyNames(headers).forEach(function (name) { |
| this.append(name, headers[name]); |
| }, this); |
| } |
| } |
| |
| Headers.prototype.append = function (name, value) { |
| name = normalizeName(name); |
| value = normalizeValue(value); |
| var oldValue = this.map[name]; |
| this.map[name] = oldValue ? oldValue + ',' + value : value; |
| }; |
| |
| Headers.prototype.delete = function (name) { |
| delete this.map[normalizeName(name)]; |
| }; |
| |
| Headers.prototype.get = function (name) { |
| name = normalizeName(name); |
| return this.has(name) ? this.map[name] : null; |
| }; |
| |
| Headers.prototype.has = function (name) { |
| return this.map.hasOwnProperty(normalizeName(name)); |
| }; |
| |
| Headers.prototype.set = function (name, value) { |
| this.map[normalizeName(name)] = [normalizeValue(value)]; |
| }; |
| |
| Headers.prototype.forEach = function (callback, thisArg) { |
| var this$1 = this; |
| |
| for (var name in this.map) { |
| if (this$1.map.hasOwnProperty(name)) { |
| callback.call(thisArg, this$1.map[name], name, this$1); |
| } |
| } |
| }; |
| |
| function consumed(body) { |
| if (body.bodyUsed) { |
| return Promise.reject(new TypeError('Already read')); |
| } |
| body.bodyUsed = true; |
| } |
| |
| function Body() { |
| this.bodyUsed = false; |
| |
| this._initBody = function (body, options) { |
| this._bodyInit = body; |
| if (typeof body === 'string') { |
| this._bodyText = body; |
| } else if (!body) { |
| this._bodyText = ''; |
| } else { |
| throw new Error('unsupported BodyInit type'); |
| } |
| }; |
| |
| this.text = function () { |
| var rejected = consumed(this); |
| return rejected ? rejected : Promise.resolve(this._bodyText); |
| }; |
| |
| this.json = function () { |
| return this.text().then(JSON.parse); |
| }; |
| |
| return this; |
| } |
| |
| // HTTP methods whose capitalization should be normalized |
| var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; |
| |
| function normalizeMethod(method) { |
| var upcased = method.toUpperCase(); |
| return methods.indexOf(upcased) > -1 ? upcased : method; |
| } |
| |
| function Request(input, options) { |
| options = options || {}; |
| var body = options.body; |
| if (Request.prototype.isPrototypeOf(input)) { |
| if (input.bodyUsed) { |
| throw new TypeError('Already read'); |
| } |
| this.url = input.url; |
| this.credentials = input.credentials; |
| if (!options.headers) { |
| this.headers = new Headers(input.headers); |
| } |
| this.method = input.method; |
| this.mode = input.mode; |
| if (!body) { |
| body = input._bodyInit; |
| input.bodyUsed = true; |
| } |
| } else { |
| this.url = input; |
| } |
| |
| this.credentials = options.credentials || this.credentials || 'omit'; |
| if (options.headers || !this.headers) { |
| this.headers = new Headers(options.headers); |
| } |
| this.method = normalizeMethod(options.method || this.method || 'GET'); |
| this.mode = options.mode || this.mode || null; |
| this.referrer = null; |
| |
| if ((this.method === 'GET' || this.method === 'HEAD') && body) { |
| throw new TypeError('Body not allowed for GET or HEAD requests'); |
| } |
| this._initBody(body, options); |
| } |
| |
| Request.prototype.clone = function () { |
| return new Request(this); |
| }; |
| |
| function headers(xhr) { |
| var head = new Headers(); |
| var pairs = xhr.getAllResponseHeaders().trim().split('\n'); |
| pairs.forEach(function (header) { |
| var split = header.trim().split(':'); |
| var key = split.shift().trim(); |
| var value = split.join(':').trim(); |
| head.append(key, value); |
| }); |
| return head; |
| } |
| |
| Body.call(Request.prototype); |
| |
| function Response(bodyInit, options) { |
| if (!options) { |
| options = {}; |
| } |
| |
| this.type = 'default'; |
| this.status = 'status' in options ? options.status : 200; |
| this.ok = this.status >= 200 && this.status < 300; |
| this.statusText = 'statusText' in options ? options.statusText : 'OK'; |
| this.headers = new Headers(options.headers); |
| this.url = options.url || ''; |
| this._initBody(bodyInit, options); |
| } |
| |
| Body.call(Response.prototype); |
| |
| Response.prototype.clone = function () { |
| return new Response(this._bodyInit, { |
| status: this.status, |
| statusText: this.statusText, |
| headers: new Headers(this.headers), |
| url: this.url |
| }); |
| }; |
| |
| Response.error = function () { |
| var response = new Response(null, { status: 0, statusText: '' }); |
| response.type = 'error'; |
| return response; |
| }; |
| |
| var redirectStatuses = [301, 302, 303, 307, 308]; |
| |
| Response.redirect = function (url, status) { |
| if (redirectStatuses.indexOf(status) === -1) { |
| throw new RangeError('Invalid status code'); |
| } |
| |
| return new Response(null, { status: status, headers: { location: url } }); |
| }; |
| |
| var fetch = function fetch(input, init) { |
| return new Promise(function (resolve, reject) { |
| var request; |
| if (Request.prototype.isPrototypeOf(input) && !init) { |
| request = input; |
| } else { |
| request = new Request(input, init); |
| } |
| |
| var params = { |
| url: request.url, |
| method: request.method, |
| headers: request.headers && request.headers.originHeaders |
| }; |
| |
| if (typeof request._bodyInit !== 'undefined') { |
| params.body = request._bodyInit; |
| } |
| |
| params.type = init && init.dataType ? init.dataType : 'text'; |
| |
| var nativeFetch = __weex_require__(STREAM_MODULE).fetch; |
| nativeFetch(params, function (response) { |
| try { |
| typeof response === 'string' && (response = JSON.parse(response)); |
| var data = typeof response.data === 'string' ? response.data : JSON.stringify(response.data); |
| |
| var res = new Response(data, { |
| status: response.status, |
| statusText: response.statusText, |
| headers: response.headers, |
| url: request.url |
| }); |
| resolve(res); |
| } catch (err) { |
| reject(err); |
| } |
| }, function (progress) {}); |
| }); |
| }; |
| |
| return { |
| fetch: fetch, |
| Headers: Headers, |
| Request: Request, |
| Response: Response |
| }; |
| }; |
| |
| /***/ }), |
| /* 14 */ |
| /*!****************************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/xmlhttprequest.weex.js ***! |
| \****************************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } |
| |
| function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } } |
| |
| var STREAM_MODULE = '@weex-module/stream'; |
| var eventTarget = __webpack_require__(/*! event-target-shim */ 2); |
| |
| var UNSENT = 0; |
| var OPENED = 1; |
| var HEADERS_RECEIVED = 2; |
| var LOADING = 3; |
| var DONE = 4; |
| |
| var XHR_EVENTS = ['abort', 'error', 'load', 'loadstart', 'progress', 'timeout', 'loadend', 'readystatechange']; |
| |
| module.exports = function (__weex_require__) { |
| var _class, _temp; |
| |
| var XMLHttpRequest = (_temp = _class = function (_eventTarget) { |
| _inherits(XMLHttpRequest, _eventTarget); |
| |
| // EventTarget automatically initializes these to `null`. |
| function XMLHttpRequest() { |
| _classCallCheck(this, XMLHttpRequest); |
| |
| var _this = _possibleConstructorReturn(this, (XMLHttpRequest.__proto__ || Object.getPrototypeOf(XMLHttpRequest)).call(this)); |
| |
| _this.UNSENT = UNSENT; |
| _this.OPENED = OPENED; |
| _this.HEADERS_RECEIVED = HEADERS_RECEIVED; |
| _this.LOADING = LOADING; |
| _this.DONE = DONE; |
| _this.readyState = UNSENT; |
| _this.status = 0; |
| _this.statusText = ''; |
| _this.timeout = 0; |
| _this._aborted = false; |
| _this._hasError = false; |
| _this._method = null; |
| _this._response = ''; |
| _this._url = null; |
| _this._timedOut = false; |
| |
| _this._reset(); |
| return _this; |
| } |
| |
| _createClass(XMLHttpRequest, [{ |
| key: '_reset', |
| value: function _reset() { |
| this.readyState = this.UNSENT; |
| this.responseHeaders = undefined; |
| this.status = 0; |
| |
| this._hasError = false; |
| this._headers = {}; |
| this._response = ''; |
| this._responseType = ''; |
| this._sent = false; |
| this._lowerCaseResponseHeaders = {}; |
| |
| this._timedOut = false; |
| } |
| }, { |
| key: 'getAllResponseHeaders', |
| value: function getAllResponseHeaders() { |
| if (!this.responseHeaders) { |
| // according to the spec, return null if no response has been received |
| return null; |
| } |
| var headers = this.responseHeaders || {}; |
| return Object.keys(headers).map(function (headerName) { |
| return headerName + ': ' + headers[headerName]; |
| }).join('\r\n'); |
| } |
| }, { |
| key: 'getResponseHeader', |
| value: function getResponseHeader(header) { |
| var value = this._lowerCaseResponseHeaders[header.toLowerCase()]; |
| return value !== undefined ? value : null; |
| } |
| }, { |
| key: 'setRequestHeader', |
| value: function setRequestHeader(header, value) { |
| if (this.readyState !== this.OPENED) { |
| throw new Error('Request has not been opened'); |
| } |
| this._headers[header.toLowerCase()] = String(value); |
| } |
| }, { |
| key: 'open', |
| value: function open(method, url, async) { |
| /* Other optional arguments are not supported yet */ |
| if (this.readyState !== this.UNSENT) { |
| throw new Error('Cannot open, already sending'); |
| } |
| if (async !== undefined && !async) { |
| // async is default |
| throw new Error('Synchronous http requests are not supported'); |
| } |
| if (!url) { |
| throw new Error('Cannot load an empty url'); |
| } |
| this._method = method.toUpperCase(); |
| this._url = url; |
| this._aborted = false; |
| this.setReadyState(this.OPENED); |
| } |
| }, { |
| key: 'send', |
| value: function send(data) { |
| var _this2 = this; |
| |
| if (this.readyState !== this.OPENED) { |
| throw new Error('Request has not been opened'); |
| } |
| if (this._sent) { |
| throw new Error('Request has already been sent'); |
| } |
| this._sent = true; |
| |
| var nativeFetch = __weex_require__(STREAM_MODULE).fetch; |
| |
| nativeFetch({ |
| method: this._method, |
| url: this._url, |
| headers: this._headers, |
| body: data, |
| type: 'text' |
| }, function (response) { |
| try { |
| typeof response === 'string' && (response = JSON.parse(response)); |
| |
| _this2.status = response.status; |
| _this2.statusText = response.statusText; |
| _this2.setResponseHeaders(response.headers); |
| |
| if (response.ok) { |
| _this2._response = response.data; |
| } else { |
| if (_this2._responseType === '' || _this2._responseType === 'text') { |
| _this2._response = response.data; |
| } |
| _this2._hasError = true; |
| } |
| } catch (err) {} |
| |
| _this2.setReadyState(_this2.DONE); |
| }, function (progress) { |
| _this2.status = progress.status; |
| _this2.statusText = progress.statusText; |
| _this2.setResponseHeaders(progress.headers); |
| _this2.setReadyState(progress.readyState); |
| }); |
| } |
| }, { |
| key: 'abort', |
| value: function abort() { |
| this._aborted = true; |
| |
| // TODO: Weex native not support abort now |
| |
| // only call onreadystatechange if there is something to abort, |
| // below logic is per spec |
| if (!(this.readyState === this.UNSENT || this.readyState === this.OPENED && !this._sent || this.readyState === this.DONE)) { |
| this._reset(); |
| this.setReadyState(this.DONE); |
| } |
| // Reset again after, in case modified in handler |
| this._reset(); |
| } |
| }, { |
| key: 'setResponseHeaders', |
| value: function setResponseHeaders(responseHeaders) { |
| this.responseHeaders = responseHeaders || null; |
| var headers = responseHeaders || {}; |
| this._lowerCaseResponseHeaders = Object.keys(headers).reduce(function (lcaseHeaders, headerName) { |
| lcaseHeaders[headerName.toLowerCase()] = headers[headerName]; |
| return lcaseHeaders; |
| }, {}); |
| } |
| }, { |
| key: 'setReadyState', |
| value: function setReadyState(newState) { |
| this.readyState = newState; |
| this.dispatchEvent({ type: 'readystatechange' }); |
| if (newState === this.DONE) { |
| if (this._aborted) { |
| this.dispatchEvent({ type: 'abort' }); |
| } else if (this._hasError) { |
| if (this._timedOut) { |
| this.dispatchEvent({ type: 'timeout' }); |
| } else { |
| this.dispatchEvent({ type: 'error' }); |
| } |
| } else { |
| this.dispatchEvent({ type: 'load' }); |
| } |
| this.dispatchEvent({ type: 'loadend' }); |
| } |
| } |
| }, { |
| key: 'responseType', |
| get: function get() { |
| return this._responseType; |
| }, |
| set: function set(responseType) { |
| if (this._sent) { |
| throw new Error('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The ' + 'response type cannot be set after the request has been sent.'); |
| } |
| |
| this._responseType = responseType; |
| } |
| }, { |
| key: 'responseText', |
| get: function get() { |
| if (this._responseType !== '' && this._responseType !== 'text') { |
| throw new Error("The 'responseText' property is only available if 'responseType' " + ('is set to \'\' or \'text\', but it is \'' + this._responseType + '\'.')); |
| } |
| if (this.readyState < LOADING) { |
| return ''; |
| } |
| return this._response; |
| } |
| }, { |
| key: 'response', |
| get: function get() { |
| var responseType = this.responseType; |
| |
| if (responseType === '' || responseType === 'text') { |
| return this.readyState < LOADING || this._hasError ? '' : this._response; |
| } |
| |
| if (this.readyState !== DONE) { |
| return null; |
| } |
| } |
| }]); |
| |
| return XMLHttpRequest; |
| }(eventTarget.apply(undefined, XHR_EVENTS)), _class.UNSENT = UNSENT, _class.OPENED = OPENED, _class.HEADERS_RECEIVED = HEADERS_RECEIVED, _class.LOADING = LOADING, _class.DONE = DONE, _temp); |
| |
| |
| return XMLHttpRequest; |
| }; |
| |
| /***/ }), |
| /* 15 */ |
| /*!***********************************************************************************************!*\ |
| !*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/custom-event-target.js ***! |
| \***********************************************************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| /** |
| * @author Toru Nagashima |
| * @copyright 2015 Toru Nagashima. All rights reserved. |
| * See LICENSE file in root directory for full license. |
| */ |
| |
| |
| //----------------------------------------------------------------------------- |
| // Requirements |
| //----------------------------------------------------------------------------- |
| |
| var Commons = __webpack_require__(/*! ./commons */ 0); |
| var LISTENERS = Commons.LISTENERS; |
| var ATTRIBUTE = Commons.ATTRIBUTE; |
| var newNode = Commons.newNode; |
| |
| //----------------------------------------------------------------------------- |
| // Helpers |
| //----------------------------------------------------------------------------- |
| |
| /** |
| * Gets a specified attribute listener from a given EventTarget object. |
| * |
| * @param {EventTarget} eventTarget - An EventTarget object to get. |
| * @param {string} type - An event type to get. |
| * @returns {function|null} The found attribute listener. |
| */ |
| function getAttributeListener(eventTarget, type) { |
| var node = eventTarget[LISTENERS][type]; |
| while (node != null) { |
| if (node.kind === ATTRIBUTE) { |
| return node.listener |
| } |
| node = node.next; |
| } |
| return null |
| } |
| |
| /** |
| * Sets a specified attribute listener to a given EventTarget object. |
| * |
| * @param {EventTarget} eventTarget - An EventTarget object to set. |
| * @param {string} type - An event type to set. |
| * @param {function|null} listener - A listener to be set. |
| * @returns {void} |
| */ |
| function setAttributeListener(eventTarget, type, listener) { |
| if (typeof listener !== "function" && typeof listener !== "object") { |
| listener = null; // eslint-disable-line no-param-reassign |
| } |
| |
| var prev = null; |
| var node = eventTarget[LISTENERS][type]; |
| while (node != null) { |
| if (node.kind === ATTRIBUTE) { |
| // Remove old value. |
| if (prev == null) { |
| eventTarget[LISTENERS][type] = node.next; |
| } |
| else { |
| prev.next = node.next; |
| } |
| } |
| else { |
| prev = node; |
| } |
| |
| node = node.next; |
| } |
| |
| // Add new value. |
| if (listener != null) { |
| if (prev == null) { |
| eventTarget[LISTENERS][type] = newNode(listener, ATTRIBUTE); |
| } |
| else { |
| prev.next = newNode(listener, ATTRIBUTE); |
| } |
| } |
| } |
| |
| //----------------------------------------------------------------------------- |
| // Public Interface |
| //----------------------------------------------------------------------------- |
| |
| /** |
| * Defines an `EventTarget` implementation which has `onfoobar` attributes. |
| * |
| * @param {EventTarget} EventTargetBase - A base implementation of EventTarget. |
| * @param {string[]} types - A list of event types which are defined as attribute listeners. |
| * @returns {EventTarget} The defined `EventTarget` implementation which has attribute listeners. |
| */ |
| module.exports.defineCustomEventTarget = function(EventTargetBase, types) { |
| /** |
| * The constructor of custom event target. |
| * @constructor |
| */ |
| function EventTarget() { |
| EventTargetBase.call(this); |
| } |
| |
| var descripter = { |
| constructor: { |
| value: EventTarget, |
| configurable: true, |
| writable: true, |
| }, |
| }; |
| |
| types.forEach(function(type) { |
| descripter["on" + type] = { |
| get: function() { |
| return getAttributeListener(this, type) |
| }, |
| set: function(listener) { |
| setAttributeListener(this, type, listener); |
| }, |
| configurable: true, |
| enumerable: true, |
| }; |
| }); |
| |
| EventTarget.prototype = Object.create(EventTargetBase.prototype, descripter); |
| |
| return EventTarget |
| }; |
| |
| |
| /***/ }), |
| /* 16 */ |
| /*!*****************************************************************************************!*\ |
| !*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/event-wrapper.js ***! |
| \*****************************************************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| /** |
| * @author Toru Nagashima |
| * @copyright 2015 Toru Nagashima. All rights reserved. |
| * See LICENSE file in root directory for full license. |
| */ |
| |
| |
| //----------------------------------------------------------------------------- |
| // Requirements |
| //----------------------------------------------------------------------------- |
| |
| var createUniqueKey = __webpack_require__(/*! ./commons */ 0).createUniqueKey; |
| |
| //----------------------------------------------------------------------------- |
| // Constsnts |
| //----------------------------------------------------------------------------- |
| |
| /** |
| * The key of the flag which is turned on by `stopImmediatePropagation` method. |
| * |
| * @type {symbol|string} |
| * @private |
| */ |
| var STOP_IMMEDIATE_PROPAGATION_FLAG = |
| createUniqueKey("stop_immediate_propagation_flag"); |
| |
| /** |
| * The key of the flag which is turned on by `preventDefault` method. |
| * |
| * @type {symbol|string} |
| * @private |
| */ |
| var CANCELED_FLAG = createUniqueKey("canceled_flag"); |
| |
| /** |
| * The key of the flag that it cannot use `preventDefault` method. |
| * |
| * @type {symbol|string} |
| * @private |
| */ |
| var PASSIVE_LISTENER_FLAG = createUniqueKey("passive_listener_flag"); |
| |
| /** |
| * The key of the original event object. |
| * |
| * @type {symbol|string} |
| * @private |
| */ |
| var ORIGINAL_EVENT = createUniqueKey("original_event"); |
| |
| /** |
| * Method definitions for the event wrapper. |
| * |
| * @type {object} |
| * @private |
| */ |
| var wrapperPrototypeDefinition = Object.freeze({ |
| stopPropagation: Object.freeze({ |
| value: function stopPropagation() { |
| var e = this[ORIGINAL_EVENT]; |
| if (typeof e.stopPropagation === "function") { |
| e.stopPropagation(); |
| } |
| }, |
| writable: true, |
| configurable: true, |
| }), |
| |
| stopImmediatePropagation: Object.freeze({ |
| value: function stopImmediatePropagation() { |
| this[STOP_IMMEDIATE_PROPAGATION_FLAG] = true; |
| |
| var e = this[ORIGINAL_EVENT]; |
| if (typeof e.stopImmediatePropagation === "function") { |
| e.stopImmediatePropagation(); |
| } |
| }, |
| writable: true, |
| configurable: true, |
| }), |
| |
| preventDefault: Object.freeze({ |
| value: function preventDefault() { |
| if (this[PASSIVE_LISTENER_FLAG]) { |
| return |
| } |
| if (this.cancelable === true) { |
| this[CANCELED_FLAG] = true; |
| } |
| |
| var e = this[ORIGINAL_EVENT]; |
| if (typeof e.preventDefault === "function") { |
| e.preventDefault(); |
| } |
| }, |
| writable: true, |
| configurable: true, |
| }), |
| |
| defaultPrevented: Object.freeze({ |
| get: function defaultPrevented() { |
| return this[CANCELED_FLAG] |
| }, |
| enumerable: true, |
| configurable: true, |
| }), |
| }); |
| |
| //----------------------------------------------------------------------------- |
| // Public Interface |
| //----------------------------------------------------------------------------- |
| |
| module.exports.STOP_IMMEDIATE_PROPAGATION_FLAG = STOP_IMMEDIATE_PROPAGATION_FLAG; |
| module.exports.PASSIVE_LISTENER_FLAG = PASSIVE_LISTENER_FLAG; |
| |
| /** |
| * Creates an event wrapper. |
| * |
| * We cannot modify several properties of `Event` object, so we need to create the wrapper. |
| * Plus, this wrapper supports non `Event` objects. |
| * |
| * @param {Event|{type: string}} event - An original event to create the wrapper. |
| * @param {EventTarget} eventTarget - The event target of the event. |
| * @returns {Event} The created wrapper. This object is implemented `Event` interface. |
| * @private |
| */ |
| module.exports.createEventWrapper = function createEventWrapper(event, eventTarget) { |
| var timeStamp = ( |
| typeof event.timeStamp === "number" ? event.timeStamp : Date.now() |
| ); |
| var propertyDefinition = { |
| type: {value: event.type, enumerable: true}, |
| target: {value: eventTarget, enumerable: true}, |
| currentTarget: {value: eventTarget, enumerable: true}, |
| eventPhase: {value: 2, enumerable: true}, |
| bubbles: {value: Boolean(event.bubbles), enumerable: true}, |
| cancelable: {value: Boolean(event.cancelable), enumerable: true}, |
| timeStamp: {value: timeStamp, enumerable: true}, |
| isTrusted: {value: false, enumerable: true}, |
| }; |
| propertyDefinition[STOP_IMMEDIATE_PROPAGATION_FLAG] = {value: false, writable: true}; |
| propertyDefinition[CANCELED_FLAG] = {value: false, writable: true}; |
| propertyDefinition[PASSIVE_LISTENER_FLAG] = {value: false, writable: true}; |
| propertyDefinition[ORIGINAL_EVENT] = {value: event}; |
| |
| // For CustomEvent. |
| if (typeof event.detail !== "undefined") { |
| propertyDefinition.detail = {value: event.detail, enumerable: true}; |
| } |
| |
| return Object.create( |
| Object.create(event, wrapperPrototypeDefinition), |
| propertyDefinition |
| ) |
| }; |
| |
| |
| /***/ }), |
| /* 17 */ |
| /*!***********************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/websocket.weex.js ***! |
| \***********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
| |
| function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } |
| |
| function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| var eventTarget = __webpack_require__(/*! event-target-shim */ 2); |
| |
| var WEB_SOCKET_MODULE = '@weex-module/webSocket'; |
| |
| var CONNECTING = 0; |
| var OPEN = 1; |
| var CLOSING = 2; |
| var CLOSED = 3; |
| |
| var CLOSE_NORMAL = 1000; |
| |
| var WEBSOCKET_EVENTS = ['close', 'error', 'message', 'open']; |
| |
| /** |
| * Event object passed to the `onopen`, `onclose`, `onmessage`, `onerror` |
| * callbacks of `WebSocket`. |
| * |
| * The `type` property is "open", "close", "message", "error" respectively. |
| * |
| * In case of "message", the `data` property contains the incoming data. |
| */ |
| |
| var WebSocketEvent = function WebSocketEvent(type, eventInitDict) { |
| _classCallCheck(this, WebSocketEvent); |
| |
| this.type = type.toString(); |
| Object.assign(this, eventInitDict); |
| }; |
| |
| module.exports = function (__weex_require__) { |
| var _class, _temp; |
| |
| /** |
| * Browser-compatible WebSockets implementation. |
| * |
| * See https://developer.mozilla.org/en-US/docs/Web/API/WebSocket |
| * See https://github.com/websockets/ws |
| */ |
| var WebSocket = (_temp = _class = function (_eventTarget) { |
| _inherits(WebSocket, _eventTarget); |
| |
| function WebSocket(url, protocols) { |
| _classCallCheck(this, WebSocket); |
| |
| var _this = _possibleConstructorReturn(this, (WebSocket.__proto__ || Object.getPrototypeOf(WebSocket)).call(this)); |
| |
| var websocket = __weex_require__(WEB_SOCKET_MODULE); |
| // eslint-disable-next-line new-cap |
| websocket.WebSocket(url, protocols); |
| _this.readyState = CONNECTING; |
| _this.websocket = websocket; |
| |
| websocket.onmessage(function (ev) { |
| _this.dispatchEvent(new WebSocketEvent('message', ev)); |
| }); |
| |
| websocket.onopen(function (ev) { |
| _this.readyState = OPEN; |
| _this.dispatchEvent(new WebSocketEvent('open')); |
| }); |
| |
| websocket.onclose(function (ev) { |
| _this.readyState = CLOSED; |
| _this.dispatchEvent(new WebSocketEvent('close', { |
| code: ev.code, |
| reason: ev.reason |
| })); |
| }); |
| |
| websocket.onerror(function (ev) { |
| _this.dispatchEvent(new WebSocketEvent('error', ev)); |
| }); |
| return _this; |
| } |
| |
| _createClass(WebSocket, [{ |
| key: 'close', |
| value: function close(code, reason) { |
| if (this.readyState === CLOSING || this.readyState === CLOSED) { |
| return; |
| } |
| |
| this.readyState = CLOSING; |
| this.websocket.close(code, reason); |
| } |
| }, { |
| key: 'send', |
| value: function send(data) { |
| if (typeof data === 'string') { |
| this.websocket.send(data); |
| return; |
| } |
| |
| throw new Error('Unsupported data type'); |
| } |
| }]); |
| |
| return WebSocket; |
| }(eventTarget(WEBSOCKET_EVENTS)), _class.CONNECTING = CONNECTING, _class.OPEN = OPEN, _class.CLOSING = CLOSING, _class.CLOSED = CLOSED, _temp); |
| |
| |
| return WebSocket; |
| }; |
| |
| /***/ }), |
| /* 18 */ |
| /*!*******************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/timer.weex.js ***! |
| \*******************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| var TIMER_MODULE = '@weex-module/timer'; |
| |
| module.exports = function (__weex_require__, document) { |
| var setTimeout = function setTimeout(handler, time) { |
| var timer = __weex_require__(TIMER_MODULE); |
| timer.setTimeout(handler, time); |
| return document.taskCenter.callbackManager.lastCallbackId.toString(); |
| }; |
| |
| var setInterval = function setInterval(handler, time) { |
| var timer = __weex_require__(TIMER_MODULE); |
| timer.setInterval(handler, time); |
| return document.taskCenter.callbackManager.lastCallbackId.toString(); |
| }; |
| |
| var clearTimeout = function clearTimeout(n) { |
| var timer = __weex_require__(TIMER_MODULE); |
| timer.clearTimeout(n); |
| }; |
| |
| var clearInterval = function clearInterval(n) { |
| var timer = __weex_require__(TIMER_MODULE); |
| timer.clearInterval(n); |
| }; |
| |
| var requestAnimationFrame = function requestAnimationFrame(callback) { |
| var timer = __weex_require__(TIMER_MODULE); |
| return timer.setTimeout(callback, 16); |
| }; |
| |
| var cancelAnimationFrame = function cancelAnimationFrame(n) { |
| var timer = __weex_require__(TIMER_MODULE); |
| timer.clearTimeout(n); |
| }; |
| |
| return { |
| setTimeout: setTimeout, |
| clearTimeout: clearTimeout, |
| setInterval: setInterval, |
| clearInterval: clearInterval, |
| requestAnimationFrame: requestAnimationFrame, |
| cancelAnimationFrame: cancelAnimationFrame |
| }; |
| }; |
| |
| /***/ }), |
| /* 19 */ |
| /*!********************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/base64.weex.js ***! |
| \********************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| module.exports = function () { |
| var base64 = {}; |
| var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; |
| |
| // encoder |
| // [https://gist.github.com/999166] by [https://github.com/nignag] |
| base64.btoa = function (input) { |
| var str = String(input); |
| for ( |
| // initialize result and counter |
| var block, charCode, idx = 0, map = chars, output = ''; |
| // if the next str index does not exist: |
| // change the mapping table to "=" |
| // check if d has no fractional digits |
| str.charAt(idx | 0) || (map = '=', idx % 1); |
| // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 |
| output += map.charAt(63 & block >> 8 - idx % 1 * 8)) { |
| charCode = str.charCodeAt(idx += 3 / 4); |
| if (charCode > 0xFF) { |
| throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); |
| } |
| block = block << 8 | charCode; |
| } |
| return output; |
| }; |
| |
| // decoder |
| // [https://gist.github.com/1020396] by [https://github.com/atk] |
| base64.atob = function (input) { |
| var str = String(input).replace(/=+$/, ''); |
| if (str.length % 4 == 1) { |
| throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); |
| } |
| for ( |
| // initialize result and counters |
| var bc = 0, bs, buffer, idx = 0, output = ''; |
| // get next character |
| buffer = str.charAt(idx++); |
| // character found in table? initialize bit storage and add its ascii value; |
| ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, |
| // and if not first of each 4 characters, |
| // convert the first 8 bits to one ascii character |
| bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) { |
| // try to find character in table (0-63, not found => -1) |
| buffer = chars.indexOf(buffer); |
| } |
| return output; |
| }; |
| |
| return base64; |
| }; |
| |
| /***/ }), |
| /* 20 */ |
| /*!*************************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/performance.weex.js ***! |
| \*************************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } |
| |
| module.exports = function (responseEnd) { |
| var _performance$timing; |
| |
| var performance = {}; |
| // TODO: current can not get navigationStart time |
| performance.timing = (_performance$timing = { |
| unloadEventStart: 0, |
| unloadEventEnd: 0, |
| navigationStart: responseEnd, |
| redirectStart: 0, |
| redirectEnd: 0, |
| fetchStart: responseEnd, |
| domainLookupStart: responseEnd, |
| domainLookupEnd: responseEnd, |
| connectStart: responseEnd, |
| secureConnectionStart: responseEnd |
| }, _defineProperty(_performance$timing, "connectStart", responseEnd), _defineProperty(_performance$timing, "requestStart", responseEnd), _defineProperty(_performance$timing, "responseStart", responseEnd), _defineProperty(_performance$timing, "responseEnd", responseEnd), _defineProperty(_performance$timing, "domLoading", 0), _defineProperty(_performance$timing, "domInteractive", 0), _defineProperty(_performance$timing, "domComplete", 0), _defineProperty(_performance$timing, "domContentLoadedEventStart", 0), _defineProperty(_performance$timing, "domContentLoadedEventEnd", 0), _defineProperty(_performance$timing, "loadEventStart", 0), _defineProperty(_performance$timing, "loadEventEnd", 0), _performance$timing); |
| performance.now = function () { |
| return Date.now() - performance.timing.navigationStart; |
| }; |
| |
| return performance; |
| }; |
| |
| /***/ }), |
| /* 21 */ |
| /*!*******************************************************!*\ |
| !*** ./packages/weex-rax-framework/src/event.weex.js ***! |
| \*******************************************************/ |
| /*! no static exports found */ |
| /*! all exports used */ |
| /***/ (function(module, exports, __webpack_require__) { |
| |
| "use strict"; |
| |
| |
| function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } |
| |
| function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } } |
| |
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
| |
| module.exports = function () { |
| var Event = function Event(type) { |
| var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| _classCallCheck(this, Event); |
| |
| this.type = type; |
| this.bubbles = Boolean(params.bubbles); |
| this.cancelable = Boolean(params.cancelable); |
| }; |
| |
| var CustomEvent = function (_Event) { |
| _inherits(CustomEvent, _Event); |
| |
| function CustomEvent(type) { |
| var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| _classCallCheck(this, CustomEvent); |
| |
| var _this = _possibleConstructorReturn(this, (CustomEvent.__proto__ || Object.getPrototypeOf(CustomEvent)).call(this, type, params)); |
| |
| _this.detail = params.detail; |
| return _this; |
| } |
| |
| return CustomEvent; |
| }(Event); |
| |
| return { |
| Event: Event, |
| CustomEvent: CustomEvent |
| }; |
| }; |
| |
| /***/ }) |
| /******/ ]); |
| }); |
| |
| var Rax = unwrapExports(framework_weex); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var frameworks$1 = { |
| Vanilla: Vanilla, |
| Vue: Vue, |
| Rax: Rax, |
| Weex: Weex$2 |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var protocol = { |
| |
| // weex instances |
| _instances: {}, |
| |
| // api meta info |
| _meta: {}, |
| |
| // Weex.registerApiModule used this to register and access apiModules. |
| apiModule: {}, |
| |
| // get the api method meta info array for the module. |
| getApiModuleMeta: function (moduleName) { |
| var metaObj = {}; |
| metaObj[moduleName] = this._meta[moduleName]; |
| return metaObj |
| }, |
| |
| // Set meta info for a api module. |
| // If there is a same named api, just replace it. |
| // opts: |
| // - metaObj: meta object like |
| // { |
| // dom: [{ |
| // name: 'addElement', |
| // args: ['string', 'object'] |
| // }] |
| // } |
| setApiModuleMeta: function (metaObj) { |
| var moduleName; |
| for (var k in metaObj) { |
| if (metaObj.hasOwnProperty(k)) { |
| moduleName = k; |
| } |
| } |
| var metaArray = this._meta[moduleName]; |
| if (!metaArray) { |
| this._meta[moduleName] = metaObj[moduleName]; |
| } |
| else { |
| var nameObj = {}; |
| metaObj[moduleName].forEach(function (api) { |
| nameObj[api.name] = api; |
| }); |
| metaArray.forEach(function (api, i) { |
| if (nameObj[api.name]) { |
| metaArray[i] = nameObj[api.name]; |
| delete nameObj[api.name]; |
| } |
| }); |
| for (var k$1 in metaObj) { |
| if (metaObj.hasOwnProperty(k$1)) { |
| metaArray.push(metaObj[k$1]); |
| } |
| } |
| } |
| this._meta[moduleName] = metaObj[moduleName]; |
| }, |
| |
| // Set meta info for a single api. |
| // opts: |
| // - moduleName: api module name. |
| // - meta: a meta object like: |
| // { |
| // name: 'addElement', |
| // args: ['string', 'object'] |
| // } |
| setApiMeta: function (moduleName, meta) { |
| var metaArray = this._meta[moduleName]; |
| if (!metaArray) { |
| this._meta[moduleName] = [meta]; |
| } |
| else { |
| var metaIdx = -1; |
| metaArray.forEach(function (api, i) { |
| var name; // todo |
| if (meta.name === name) { |
| metaIdx = i; |
| } |
| }); |
| if (metaIdx !== -1) { |
| metaArray[metaIdx] = meta; |
| } |
| else { |
| metaArray.push(meta); |
| } |
| } |
| } |
| }; |
| |
| // _registerModules([{ |
| // modal: [{ |
| // name: 'toast', |
| // args: ['object', 'function'] |
| // }, { |
| // name: 'alert', |
| // args: ['object', 'function'] |
| // }, { |
| // name: 'confirm', |
| // args: ['object', 'function'] |
| // }, { |
| // name: 'prompt', |
| // args: ['object', 'function'] |
| // }] |
| // }, { |
| // animation: [{ |
| // name: 'transition', |
| // args: ['string', 'object', 'function'] |
| // }] |
| // }]) |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var config$4 = { |
| weexVersion: '0.5.0', |
| debug: false, |
| validRoots: ['div', 'list', 'vlist', 'scroller'], |
| downgrade: { |
| // root: true |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function isArray (arr) { |
| return Array.isArray |
| ? Array.isArray(arr) |
| : (Object.prototype.toString.call(arr) === '[object Array]') |
| } |
| |
| function slice (arr, start, end) { |
| if (isArray(arr)) { |
| return arr.slice(start, end) |
| } |
| var slice = Array.prototype.slice; |
| return slice.call(arr, start, end) |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* global Image */ |
| |
| // const WEAPP_STYLE_ID = 'weapp-style' |
| |
| var vendors = ['ms', 'moz', 'webkit', 'o']; |
| |
| var _isWebpSupported = false; (function isSupportWebp () { |
| try { |
| var webP = new Image(); |
| webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdA' |
| + 'SoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; |
| webP.onload = function () { |
| if (webP.height === 2) { |
| _isWebpSupported = true; |
| } |
| }; |
| } |
| catch (e) { |
| // do nothing. |
| } |
| })(); |
| |
| var _isStickySupported = false; (function isSupportSticky () { |
| var element = document.createElement('div'); |
| var elementStyle = element.style; |
| elementStyle.cssText = vendors.concat(['']).map(function (vendor) { |
| return 'position:' |
| + (vendor ? '-' + vendor + '-' : '') |
| + 'sticky' |
| }).join(';') + ';'; |
| _isStickySupported = elementStyle.position.indexOf('sticky') !== -1; |
| })(); |
| |
| // export function extend (to, from) { |
| // for (const key in from) { |
| // to[key] = from[key] |
| // } |
| // return to |
| // } |
| |
| // export function isPlainObject (obj) { |
| // return Object.prototype.toString.call(obj) |
| // .slice(8, -1).toLowerCase() === 'object' |
| // } |
| |
| function getType (obj) { |
| return Object.prototype.toString.call(obj) |
| .slice(8, -1).toLowerCase() |
| } |
| |
| function appendStyle (css, styleId, replace) { |
| var style = document.getElementById(styleId); |
| if (style && replace) { |
| style.parentNode.removeChild(style); |
| style = null; |
| } |
| if (!style) { |
| style = document.createElement('style'); |
| style.type = 'text/css'; |
| styleId && (style.id = styleId); |
| document.getElementsByTagName('head')[0].appendChild(style); |
| } |
| style.appendChild(document.createTextNode(css)); |
| } |
| |
| function getUniqueFromArray (arr) { |
| if (!isArray(arr)) { |
| return [] |
| } |
| var res = []; |
| var unique = {}; |
| var val; |
| for (var i = 0, l = arr.length; i < l; i++) { |
| val = arr[i]; |
| if (unique[val]) { |
| continue |
| } |
| unique[val] = true; |
| res.push(val); |
| } |
| return res |
| } |
| |
| function detectWebp () { |
| return _isWebpSupported |
| } |
| |
| function detectSticky () { |
| return _isStickySupported |
| } |
| |
| function getRandom (num) { |
| var _defaultNum = 10; |
| if (typeof num !== 'number' || num <= 0) { |
| num = _defaultNum; |
| } |
| var _max = Math.pow(10, num); |
| return Math.floor(Date.now() + Math.random() * _max) % _max |
| } |
| |
| function getRgb (color) { |
| var match; |
| color = color + ''; |
| match = color.match(/#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/); |
| if (match) { |
| return { |
| r: parseInt(match[1], 16), |
| g: parseInt(match[2], 16), |
| b: parseInt(match[3], 16) |
| } |
| } |
| match = color.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/); |
| if (match) { |
| return { |
| r: parseInt(match[1]), |
| g: parseInt(match[2]), |
| b: parseInt(match[3]) |
| } |
| } |
| } |
| |
| // direction: 'l' | 'r', default is 'r' |
| // num: how many times to loop, should be a positive integer |
| function loopArray (arr, num, direction) { |
| if (!isArray(arr)) { |
| return |
| } |
| var isLeft = (direction + '').toLowerCase() === 'l'; |
| var len = arr.length; |
| num = num % len; |
| if (num < 0) { |
| num = -num; |
| isLeft = !isLeft; |
| } |
| if (num === 0) { |
| return arr |
| } |
| var lp, rp; |
| if (isLeft) { |
| lp = arr.slice(0, num); |
| rp = arr.slice(num); |
| } |
| else { |
| lp = arr.slice(0, len - num); |
| rp = arr.slice(len - num); |
| } |
| return rp.concat(lp) |
| } |
| |
| function throttle (func, wait) { |
| var result; |
| var timerId = null; |
| var previous = 0; |
| var context; |
| var args; |
| var later = function () { |
| previous = Date.now(); |
| timerId = null; |
| result = func.apply(context, args); |
| }; |
| return function () { |
| var now = Date.now(); |
| var remaining = wait - (now - previous); |
| context = this; |
| args = Array.prototype.slice.call(arguments); |
| if (remaining <= 0) { |
| clearTimeout(timerId); |
| timerId = null; |
| previous = now; |
| result = func.apply(context, args); |
| } |
| else if (!timerId) { |
| timerId = setTimeout(later, remaining); |
| } |
| return result |
| } |
| } |
| |
| function camelToKebab (name) { |
| if (!name) { return '' } |
| return name.replace(/([A-Z])/g, function (g, g1) { |
| return ("-" + (g1.toLowerCase())) |
| }) |
| } |
| |
| function kebabToCamel (name) { |
| if (!name) { return '' } |
| return name.replace(/-([a-z])/g, function (g, g1) { |
| console.log(g1); |
| return ("" + (g1.toUpperCase())) |
| }) |
| } |
| |
| function findEnterKeyType (key) { |
| var keys = ['default', 'go', 'next', 'search', 'send']; |
| if (keys.indexOf(key) > -1) { |
| return key |
| } |
| return 'done' |
| } |
| |
| |
| |
| var utils = Object.freeze({ |
| isArray: isArray, |
| slice: slice, |
| vendors: vendors, |
| getType: getType, |
| appendStyle: appendStyle, |
| getUniqueFromArray: getUniqueFromArray, |
| detectWebp: detectWebp, |
| detectSticky: detectSticky, |
| getRandom: getRandom, |
| getRgb: getRgb, |
| loopArray: loopArray, |
| throttle: throttle, |
| camelToKebab: camelToKebab, |
| kebabToCamel: kebabToCamel, |
| findEnterKeyType: findEnterKeyType, |
| extend: extend, |
| def: def$1, |
| remove: remove$1, |
| hasOwn: hasOwn, |
| bind: bind, |
| toArray: toArray, |
| isObject: isObject$4, |
| isPlainObject: isPlainObject, |
| typof: typof$1 |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var _senderMap = {}; |
| |
| function Sender (instance) { |
| if (!(this instanceof Sender)) { |
| return new Sender(instance) |
| } |
| this.instanceId = instance.instanceId; |
| this.weexInstance = instance; |
| _senderMap[this.instanceId] = this; |
| } |
| |
| function _send (instanceId, msg) { |
| callJS(instanceId, [msg]); |
| } |
| |
| Sender.getSender = function (instanceId) { |
| return _senderMap[instanceId] |
| }; |
| |
| Sender.prototype = { |
| |
| // perform a callback to jsframework. |
| performCallback: function (callbackId, data, keepAlive) { |
| var args = [callbackId]; |
| data && args.push(data); |
| keepAlive && args.push(keepAlive); |
| _send(this.instanceId, { |
| method: 'callback', |
| args: args |
| }); |
| }, |
| |
| fireEvent: function (ref, type, func, event) { |
| func.extra && extend(event, func.extra()); |
| _send(this.instanceId, { |
| method: 'fireEvent', |
| args: [ref, type, event, func.updator && func.updator()] |
| }); |
| } |
| |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // sync call native component method. |
| function callNativeComponent (instanceId, ref, method, args, options) { |
| return processCall(instanceId, { |
| component: options.component, |
| ref: ref, |
| method: method, |
| args: args |
| }) |
| } |
| |
| // sync call native module api. |
| function callNativeModule (instanceId, module, method, args, options) { |
| return processCall(instanceId, { module: module, method: method, args: args }) |
| } |
| |
| // callNative: jsFramework will call this method to talk to |
| // this renderer. |
| // params: |
| // - instanceId: string. |
| // - tasks: array of object. |
| // - callbackId: number. |
| function callNative$1 (instanceId, tasks, callbackId) { |
| var calls = []; |
| if (typeof tasks === 'string') { |
| try { |
| calls = JSON.parse(tasks); |
| } |
| catch (e) { |
| console.error('invalid tasks:', tasks); |
| } |
| } |
| else if (isArray(tasks)) { |
| calls = tasks; |
| } |
| var len = calls.length; |
| calls[len - 1].callbackId = (!callbackId && callbackId !== 0) |
| ? -1 |
| : callbackId; |
| for (var i = 0; i < len; i++) { |
| processCall(instanceId, calls[i]); |
| } |
| } |
| |
| function processCall (instanceId, call) { |
| var isComponent = typeof call.module === 'undefined'; |
| var res = isComponent ? componentCall(instanceId, call) : moduleCall(instanceId, call); |
| |
| var callbackId = call.callbackId; |
| if ((callbackId |
| || callbackId === 0 |
| || callbackId === '0') |
| && callbackId !== '-1' |
| && callbackId !== -1) { |
| performNextTick(instanceId, callbackId); |
| } |
| |
| // for sync call. |
| return res |
| } |
| |
| function moduleCall (instanceId, call) { |
| var moduleName = call.module; |
| var methodName = call.method; |
| var module, method; |
| var args = call.args || call.arguments || []; |
| |
| if (!(module = protocol.apiModule[moduleName])) { |
| return |
| } |
| if (!(method = module[methodName])) { |
| return |
| } |
| |
| return method.apply(global.weex.getInstance(instanceId), args) |
| } |
| |
| function componentCall (instanceId, call) { |
| var componentName = call.component; |
| var ref = call.ref; |
| var methodName = call.method; |
| var args = call.args || call.arguments || []; |
| |
| var elem = global.weex.getInstance(instanceId).getComponentManager().getComponent(ref); |
| if (!elem) { |
| return console.error(("[h5-render] component of ref " + ref + " doesn't exist.")) |
| } |
| |
| var method; |
| |
| if (!(method = elem[methodName])) { |
| return console.error(("[h5-render] component " + componentName + " doesn't have a method named " + methodName + ".")) |
| } |
| |
| return method.apply(elem, args) |
| } |
| |
| function performNextTick (instanceId, callbackId) { |
| Sender.getSender(instanceId).performCallback(callbackId); |
| } |
| |
| function nativeLog () { |
| if (config$4.debug) { |
| if (arguments[0].match(/^perf/)) { |
| console.info.apply(console, arguments); |
| return |
| } |
| console.debug.apply(console, arguments); |
| } |
| } |
| |
| function exportsBridgeMethodsToGlobal () { |
| global.callNative = callNative$1; |
| global.callNativeComponent = callNativeComponent; |
| global.callNativeModule = callNativeModule; |
| global.nativeLog = nativeLog; |
| } |
| |
| var receiver = { |
| init: function () { |
| // exports methods to global(window). |
| exportsBridgeMethodsToGlobal(); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var watchedComponents = []; |
| var listened = false; |
| var scrollY = 0; |
| |
| function needWatch (component) { |
| var events = component.data.event; |
| if (events |
| && (events.indexOf('appear') !== -1 |
| || events.indexOf('disappear') !== -1)) { |
| return true |
| } |
| return false |
| } |
| |
| function watchIfNeeded (component) { |
| if (needWatch(component)) { |
| watchedComponents.push(component); |
| if (!listened) { |
| listened = true; |
| var handler = throttle(onScroll, 100); |
| window.addEventListener('scroll', handler, false); |
| } |
| } |
| } |
| |
| function isComponentInWindow (component) { |
| var rect = component.node.getBoundingClientRect(); |
| return rect.right > 0 && rect.left < window.innerWidth && |
| rect.bottom > 0 && rect.top < window.innerHeight |
| } |
| |
| function hasIntersection (rect, ctRect) { |
| return (rect.left < ctRect.right && rect.right > ctRect.left) |
| && (rect.top < ctRect.bottom && rect.bottom > ctRect.top) |
| } |
| |
| function isComponentAppear (component) { |
| // NOTE: no more support embeded scrollers. |
| var parentScroller = component.getParentScroller(); |
| if (!parentScroller) { |
| return isComponentInWindow(component) |
| } |
| return isComponentInWindow(component) |
| && hasIntersection( |
| component.node.getBoundingClientRect(), |
| parentScroller.node.getBoundingClientRect()) |
| } |
| |
| function onScroll (e) { |
| var direction; |
| // NOTE: this condition strongly relies on the scroller's implementation. |
| if (e.originalType === 'scrolling') { |
| direction = e.direction; |
| } |
| else { |
| // NOTE: only VERTICAL window scroll can be detected. |
| var y = window.scrollY; |
| direction = y >= scrollY ? 'up' : 'down'; |
| scrollY = y; |
| } |
| var len = watchedComponents.length; |
| for (var i = 0; i < len; i++) { |
| var component = watchedComponents[i]; |
| var appear = isComponentAppear(component); |
| if (appear) { |
| component.dispatchEvent('appear', { direction: direction }); |
| } |
| else if (!appear) { |
| component.dispatchEvent('disappear', { direction: direction }); |
| } |
| } |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global Event */ |
| |
| // const lazyload = require('./lazyload') |
| // const animation = require('./animation') |
| |
| var RENDERING_INDENT = 800; |
| |
| var _instanceMap = {}; |
| var typeMap = {}; |
| var scrollableTypes = [ |
| 'scroller', |
| 'hscroller', |
| 'vscroller', |
| 'list', |
| 'hlist', |
| 'vlist' |
| ]; |
| |
| function ComponentManager (id) { |
| this.id = id; |
| this.batched = false; |
| this.updates = []; |
| this.componentMap = {}; |
| _instanceMap[this.id] = this; |
| } |
| |
| ComponentManager.getInstance = function (instanceId) { return _instanceMap[instanceId]; }; |
| |
| ComponentManager.registerComponent = function (type, definition) { |
| typeMap[type] = definition; |
| }; |
| |
| ComponentManager.getScrollableTypes = function () { return scrollableTypes; }; |
| |
| ComponentManager.prototype = { |
| |
| getWeexInstance: function getWeexInstance () { |
| if (!this._weexInstance) { |
| this._weexInstance = global.weex |
| ? global.weex.getInstance(this.id) |
| : null; |
| } |
| return this._weexInstance |
| }, |
| |
| // Fire a event 'renderbegin'/'renderend' on body element. |
| rendering: function rendering () { |
| function _renderingEnd () { |
| // get weex instance root |
| window.dispatchEvent(new Event('renderend')); |
| this._renderingTimer = null; |
| } |
| if (this._renderingTimer) { |
| clearTimeout(this._renderingTimer); |
| this._renderingTimer = setTimeout( |
| _renderingEnd.bind(this), |
| RENDERING_INDENT |
| ); |
| } |
| else { |
| window.dispatchEvent(new Event('renderbegin')); |
| this._renderingTimer = setTimeout( |
| _renderingEnd.bind(this), |
| RENDERING_INDENT |
| ); |
| } |
| }, |
| |
| getComponent: function getComponent (ref) { |
| return this.componentMap[ref] |
| }, |
| |
| removeComponent: function removeComponent (ref) { |
| var self = this; |
| if (!ref || !this.componentMap[ref]) { |
| return |
| } |
| // remove from this.componentMap cursively |
| (function _removeCursively (_ref) { |
| var child = self.componentMap[_ref]; |
| var listeners = child._listeners; |
| var children = child.data.children; |
| if (children && children.length) { |
| for (var i = 0, l = children.length; i < l; i++) { |
| _removeCursively(children[i].ref); |
| } |
| } |
| // remove events from _ref component |
| if (listeners) { |
| for (var type in listeners) { |
| child.node.removeEventListener(type, listeners[type]); |
| } |
| } |
| delete child._listeners; |
| delete child.node._listeners; |
| // remove _ref component |
| delete self.componentMap[_ref]; |
| })(ref); |
| }, |
| |
| createElement: function createElement (data, nodeType) { |
| var ComponentType = typeMap[data.type]; |
| if (!ComponentType) { |
| ComponentType = typeMap['div']; |
| } |
| |
| data.instanceId = this.id; |
| var component = new ComponentType(data, nodeType); |
| var ref = data.ref; |
| this.componentMap[ref] = component; |
| component.node.setAttribute('data-ref', ref); |
| |
| return component |
| }, |
| |
| /** |
| * createBody: generate root component |
| * @param {object} element |
| */ |
| createBody: function createBody (element) { |
| console.log('[h5-render] createBody', element); |
| if (this.componentMap['_root']) { |
| return |
| } |
| |
| var nodeType = element.type; |
| element.type = 'root'; |
| element.rootId = this.getWeexInstance().rootId; |
| element.ref = '_root'; |
| |
| var root = this.createElement(element, nodeType); |
| var body = document.querySelector('#' + this.getWeexInstance().rootId) |
| || document.body; |
| body.appendChild(root.node); |
| root._appended = true; |
| |
| this.handleAppend(root); |
| }, |
| |
| appendChild: function appendChild (parentRef, data) { |
| var parent = this.componentMap[parentRef]; |
| |
| if (this.componentMap[data.ref] || !parent) { |
| return |
| } |
| |
| if (parentRef === '_root' && !parent) { |
| parent = this.createElement({ |
| type: 'root', |
| rootId: this.getWeexInstance().rootId, |
| ref: '_root' |
| }); |
| parent._appended = true; |
| } |
| |
| var child = parent.appendChild(data); |
| |
| // In some parent component the implementation of method |
| // appendChild didn't return the component at all, therefor |
| // child maybe a undefined object. |
| if (child) { |
| child.parentRef = parentRef; |
| } |
| |
| if (child && parent._appended) { |
| this.handleAppend(child); |
| } |
| }, |
| |
| // appendChildren (ref, elements) { |
| // for (let i = 0; i < elements.length; i++) { |
| // this.appendChild(ref, elements[i]) |
| // } |
| // }, |
| |
| removeElement: function removeElement (ref) { |
| var this$1 = this; |
| |
| if (isArray(ref)) { |
| return ref.map(function (r) { return this$1.removeElement(r); }) |
| } |
| var component = this.componentMap[ref]; |
| // fire event for rendering dom on body elment. |
| this.rendering(); |
| |
| if (component && component.parentRef) { |
| var parent = this.componentMap[component.parentRef]; |
| component.onRemove && component.onRemove(); |
| parent.removeChild(component); |
| } |
| else if (!component) { |
| console.error(("[h5-render] component of ref '" + ref + "' does not exist.")); |
| } |
| else { |
| console.error(("[h5-render] parent component '" + (component.parentRef) + "' does not exist.")); |
| } |
| }, |
| |
| moveElement: function moveElement (ref, parentRef, index) { |
| var component = this.componentMap[ref]; |
| var newParent = this.componentMap[parentRef]; |
| var oldParentRef = component.parentRef; |
| var children, before, i, l; |
| if (!component) { |
| return console.error(("[h5-render] component of ref '" + ref + "' does not exist.")) |
| } |
| if (!newParent) { |
| return console.error( |
| ("[h5-render] parent component '" + parentRef + "' does not exist.")) |
| } |
| |
| if (index < -1) { |
| index = -1; |
| return console.error('[h5-render] index cannot be less than -1.') |
| } |
| |
| // fire event for rendering. |
| this.rendering(); |
| |
| children = newParent.data.children; |
| if (children |
| && children.length |
| && index !== -1 |
| && index < children.length) { |
| before = this.componentMap[newParent.data.children[index].ref]; |
| } |
| |
| // remove from oldParent.data.children |
| if (oldParentRef && this.componentMap[oldParentRef]) { |
| children = this.componentMap[oldParentRef].data.children; |
| if (children && children.length) { |
| for (i = 0, l = children.length; i < l; i++) { |
| if (children[i].ref === ref) { |
| break |
| } |
| } |
| if (l > i) { |
| children.splice(i, 1); |
| } |
| } |
| } |
| |
| newParent.insertBefore(component, before); |
| |
| component.onMove && component.onMove(parentRef, index); |
| }, |
| |
| insertBefore: function insertBefore (ref, data) { |
| var child, parent; |
| var before = this.componentMap[ref]; |
| child = this.componentMap[data.ref]; |
| before && (parent = this.componentMap[before.parentRef]); |
| if (child || !parent || !before) { |
| return |
| } |
| |
| child = this.createElement(data); |
| if (child) { |
| child.parentRef = before.parentRef; |
| parent.insertBefore(child, before); |
| } |
| else { |
| return |
| } |
| |
| if (this.componentMap[before.parentRef]._appended) { |
| this.handleAppend(child); |
| } |
| }, |
| |
| /** |
| * addElement |
| * If index is larget than any child's index, the |
| * element will be appended behind. |
| * @param {string} parentRef |
| * @param {obj} element (data of the component) |
| * @param {number} index |
| */ |
| addElement: function addElement (parentRef, element, index) { |
| // fire event for rendering dom on body elment. |
| this.rendering(); |
| |
| var parent = this.componentMap[parentRef]; |
| if (!parent) { |
| return |
| } |
| var children = parent.data.children; |
| // -1 means append as the last. |
| if (index < -1) { |
| index = -1; |
| return console.error('[h5-render] index cannot be less than -1.') |
| } |
| if (children && children.length |
| && children.length > index |
| && index !== -1) { |
| this.insertBefore(children[index].ref, element); |
| } |
| else { |
| this.appendChild(parentRef, element); |
| } |
| }, |
| |
| addEvent: function addEvent (ref, type) { |
| var component = this.componentMap[ref]; |
| if (!component) { |
| return console.error(("[h5-render] component of ref '" + ref + "' does not exist.")) |
| } |
| component.bindEvents([type]); |
| }, |
| |
| removeEvent: function removeEvent (ref, type) { |
| var component = this.componentMap[ref]; |
| if (!component) { |
| return console.error(("[h5-render] component of ref '" + ref + "' does not exist.")) |
| } |
| component.unbindEvents([type]); |
| }, |
| |
| updateAttrs: function updateAttrs (ref, attrs) { |
| var component = this.componentMap[ref]; |
| if (!component) { |
| return console.error(("[h5-render] component of ref '" + ref + "' does not exist.")) |
| } |
| component.updateAttrs(attrs); |
| }, |
| |
| // setStyle (ref, key, value) { |
| // const component = this.componentMap[ref] |
| // if (!component) { |
| // return console.error(`[h5-render] component of ref '${ref}' does not exist.`) |
| // } |
| // component.updateStyle({ [key]: value }) |
| // }, |
| |
| updateStyle: function updateStyle (ref, style) { |
| var component = this.componentMap[ref]; |
| if (!component) { |
| return console.error(("[h5-render] component of ref '" + ref + "' does not exist.")) |
| } |
| component.updateStyle(style); |
| }, |
| |
| handleAppend: function handleAppend (component) { |
| var this$1 = this; |
| |
| component._appended = true; |
| component.onAppend && component.onAppend(); |
| |
| // invoke onAppend on children recursively |
| var children = component.data.children; |
| if (children) { |
| for (var i = 0; i < children.length; i++) { |
| var child = this$1.componentMap[children[i].ref]; |
| if (child) { |
| this$1.handleAppend(child); |
| } |
| } |
| } |
| |
| // watch appear/disappear of the component if needed |
| watchIfNeeded(component); |
| |
| // do lazyload if needed |
| component.fireLazyload(); |
| // lazyload.startIfNeeded(component); |
| }, |
| |
| createFinish: function createFinish (callback) { |
| window.dispatchEvent(new Event('weex:createfinish')); |
| }, |
| |
| updateFinish: function updateFinish (callback) { |
| window.dispatchEvent(new Event('weex:updatefinish')); |
| }, |
| |
| refreshFinish: function refreshFinish (callback) { |
| window.dispatchEvent(new Event('weex:refreshfinish')); |
| } |
| |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* global XMLHttpRequest */ |
| |
| function loadByXHR (config, callback) { |
| if (!config.source) { |
| callback(new Error('xhr loader: missing config.source.')); |
| } |
| var xhr = new XMLHttpRequest(); |
| xhr.open('GET', config.source); |
| xhr.onload = function () { |
| callback(null, this.responseText); |
| }; |
| xhr.onerror = function (error) { |
| callback(error); |
| }; |
| xhr.send(); |
| } |
| |
| function loadByJsonp (config, callback) { |
| if (!config.source) { |
| callback(new Error('jsonp loader: missing config.source.')); |
| } |
| var callbackName = config.jsonpCallback || 'weexJsonpCallback'; |
| window[callbackName] = function (code) { |
| if (code) { |
| callback(null, code); |
| } |
| else { |
| callback(new Error('load by jsonp error')); |
| } |
| }; |
| var script = document.createElement('script'); |
| script.src = decodeURIComponent(config.source); |
| script.type = 'text/javascript'; |
| document.body.appendChild(script); |
| } |
| |
| function loadBySourceCode (config, callback) { |
| // src is the jsbundle. |
| // no need to fetch from anywhere. |
| if (config.source) { |
| callback(null, config.source); |
| } |
| else { |
| callback(new Error('source code laoder: missing config.source.')); |
| } |
| } |
| |
| var callbackMap = { |
| xhr: loadByXHR, |
| jsonp: loadByJsonp, |
| source: loadBySourceCode |
| }; |
| |
| function load (options, callback) { |
| var loadFn = callbackMap[options.loader]; |
| loadFn(options, callback); |
| } |
| |
| function registerLoader (name, loaderFunc) { |
| if (typeof loaderFunc === 'function') { |
| callbackMap[name] = loaderFunc; |
| } |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * @fileOverview |
| * A simple virtual dom implementation |
| */ |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var NOT_PX_NUMBER_PROPERTIES = ['flex', 'opacity', 'zIndex', 'fontWeight']; |
| |
| |
| |
| function getFilters (key) { |
| if (NOT_PX_NUMBER_PROPERTIES.indexOf(key) !== -1) { |
| return {} |
| } |
| return { |
| number: function (val) { |
| return val + 'px' |
| }, |
| string: function (val) { |
| // string of a number suffixed with a 'px' or 'wx' unit. original RegExp is /^-?\d*\.?\d+(?:px)?$/ |
| var match = val.match(/^([+-]?\d.*)+([p,w]x)$/); |
| if (match && match.length === 3) { |
| if (match[2] === 'px') { |
| return parseFloat(match[1]) + 'px' |
| } |
| else if (match[2] === 'wx') { |
| return parseFloat(match[1]) * global.WXEnvironment.devicePixelRatio + 'px' |
| } |
| } |
| if (key.match(/transform/) && val.match(/translate/)) { |
| var ret = val.replace(/\d*\.?\d+px/g, function (match) { |
| return parseInt(parseFloat(match)) + 'px' |
| }); |
| if (ret.match(/wx/)) { |
| ret = ret.replace(/\d*\.?\d+wx/g, function (match) { |
| return parseInt(parseFloat(match)) * global.WXEnvironment.devicePixelRatio + 'px' |
| }); |
| } |
| return ret |
| } |
| if (key.match(/^border$/) && val.match(/^\d+(?:[w,p]x)?\s+/)) { |
| val = val.replace(/^(\d+(?:[w,p]x)?)/, function ($0, $1) { |
| var v = parseFloat($1) * (val.match(/^\d+(?:wx)+/) ? global.WXEnvironment.devicePixelRatio : 1); |
| return v + 'px' |
| }); |
| } |
| return val |
| } |
| } |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var pseudoId = 0; |
| function getPseudoId () { |
| return '' + (pseudoId++) |
| } |
| |
| function create$2 (nodeType) { |
| return document.createElement(nodeType || 'div') |
| } |
| |
| function createChildren$1 () { |
| var this$1 = this; |
| |
| var children = this.data.children; |
| var parentRef = this.data.ref; |
| var componentManager = this.getComponentManager(); |
| if (children && children.length) { |
| var fragment = document.createDocumentFragment(); |
| var isFlex = false; |
| for (var i = 0; i < children.length; i++) { |
| children[i].instanceId = this$1.data.instanceId; |
| var child = componentManager.createElement(children[i]); |
| fragment.appendChild(child.node); |
| child.parentRef = parentRef; |
| if (!isFlex |
| && child.data.style |
| && child.data.style.hasOwnProperty('flex') |
| ) { |
| isFlex = true; |
| } |
| } |
| this.node.appendChild(fragment); |
| } |
| } |
| |
| function appendChild$1 (data) { |
| var children = this.data.children; |
| var componentManager = this.getComponentManager(); |
| var child = componentManager.createElement(data); |
| this.node.appendChild(child.node); |
| // update this.data.children |
| if (!children || !children.length) { |
| this.data.children = [data]; |
| } |
| else { |
| children.push(data); |
| } |
| return child |
| } |
| |
| function insertBefore$1 (child, before) { |
| var children = this.data.children; |
| var i = 0; |
| var l; |
| var isAppend = false; |
| |
| // update this.data.children |
| if (!children || !children.length || !before) { |
| isAppend = true; |
| } |
| else { |
| for (l = children.length; i < l; i++) { |
| if (children[i].ref === before.data.ref) { |
| break |
| } |
| } |
| if (i === l) { |
| isAppend = true; |
| } |
| } |
| |
| if (isAppend) { |
| this.node.appendChild(child.node); |
| children.push(child.data); |
| } |
| else { |
| if (before.fixedPlaceholder) { |
| this.node.insertBefore(child.node, before.fixedPlaceholder); |
| } |
| else if (before.stickyPlaceholder) { |
| this.node.insertBefore(child.node, before.stickyPlaceholder); |
| } |
| else { |
| this.node.insertBefore(child.node, before.node); |
| } |
| children.splice(i, 0, child.data); |
| } |
| } |
| |
| function removeChild$1 (child) { |
| var children = this.data.children; |
| // remove from this.data.children |
| var i = 0; |
| var componentManager = this.getComponentManager(); |
| if (children && children.length) { |
| var l; |
| for (l = children.length; i < l; i++) { |
| if (children[i].ref === child.data.ref) { |
| break |
| } |
| } |
| if (i < l) { |
| children.splice(i, 1); |
| } |
| } |
| // remove from componentMap recursively |
| componentManager.removeComponent(child.data.ref); |
| child.unsetPosition(); |
| child.node.parentNode.removeChild(child.node); |
| } |
| |
| function updateAttrs$1 (attrs) { |
| var this$1 = this; |
| |
| // Note:attr must be injected into the dom element because |
| // it will be accessed from the outside developer by event.target.attr. |
| if (!this.node.attr) { |
| this.node.attr = {}; |
| } |
| for (var key in attrs) { |
| var value = attrs[key]; |
| var attrSetter = this$1.attr[key]; |
| if (typeof attrSetter === 'function') { |
| attrSetter.call(this$1, value); |
| } |
| else { |
| if (typeof value === 'boolean') { |
| this$1.node[key] = value; |
| } |
| else { |
| this$1.node.setAttribute(key, value); |
| } |
| this$1.node.attr[key] = value; |
| } |
| } |
| } |
| |
| function updateStyle$1 (style) { |
| var this$1 = this; |
| |
| var pseudoData = {}; |
| for (var key in style) { |
| var value = style[key]; |
| var pseudoClassReg = /^([^:]+)((?::[^:]+)+)/; |
| var match = key.match(pseudoClassReg); |
| var styleName = (void 0), pseudoName = (void 0); |
| if (match) { |
| styleName = match[1]; |
| pseudoName = match[2]; |
| } |
| else { |
| styleName = key; |
| } |
| |
| var styleSetter = this$1.style[styleName]; |
| if (typeof styleSetter === 'function') { |
| styleSetter.call(this$1, value); |
| continue |
| } |
| var parser = getFilters(styleName)[typeof value]; |
| if (typeof parser === 'function') { |
| value = parser(value); |
| } |
| |
| if (!match) { |
| this$1.node.style[styleName] = value; |
| continue |
| } |
| |
| if (pseudoData[pseudoName]) { |
| pseudoData[pseudoName][styleName] = value; |
| } |
| else { |
| var obj; |
| pseudoData[pseudoName] = ( obj = {}, obj[styleName] = value, obj ); |
| } |
| } |
| |
| if (Object.keys(pseudoData).length > 0) { |
| processPseudoClass(this, 'data-pseudo-id', pseudoData); |
| } |
| } |
| |
| // modify styles of pseudo class. |
| function processPseudoClass (component, idName, pseudoData) { |
| var pseudoId = component.node.getAttribute('data-pseudo-id'); |
| |
| function getCssText (selector, rulesObj) { |
| // TODO: must process vendors if needed. |
| // !important is needed since the style rules is inline for most components. |
| var rulesText = Object.keys(rulesObj).map(function (key) { return ((camelToKebab(key)) + ":" + (rulesObj[key]) + "!important;"); }).join(''); |
| return (selector + "{" + rulesText + "}") |
| } |
| |
| if (!pseudoId) { |
| pseudoId = getPseudoId(); |
| component.node.setAttribute('data-pseudo-id', pseudoId); |
| var style = document.createElement('style'); |
| style.type = 'text/css'; |
| style.setAttribute('data-pseudo-id', pseudoId); |
| document.getElementsByTagName('head')[0].appendChild(style); |
| var cssText = Object.keys(pseudoData).map(function (pseudo) { |
| var rules = pseudoData[pseudo]; |
| return getCssText(("[data-pseudo-id=\"" + pseudoId + "\"]" + pseudo), rules) |
| }).join(''); |
| return style.appendChild(document.createTextNode(cssText)) |
| } |
| |
| var styleSheets = Array.prototype.slice.call(document.styleSheets || []) |
| .filter(function (style) { return style.ownerNode.getAttribute('data-pseudo-id') === pseudoId; }); |
| if (!styleSheets || styleSheets.length <= 0) { |
| return |
| } |
| var styleSheet = styleSheet[0]; |
| var rules = styleSheet.cssRules || styleSheet.rules; |
| Object.keys(pseudoData).forEach(function (pseudo) { |
| var data = pseudoData[pseudo]; |
| var selector = "[data-pseudo-id=\"" + pseudoId + "\"]" + pseudo; |
| var res = Array.prototype.slice.call(rules).reduce(function (res, rule, idx) { |
| (rule.selectorText === selector) && (res.idx = idx); |
| return res |
| }, { idx: -1 }); |
| var idx = res.idx; |
| if (idx !== -1) { |
| var pseudoRule = rules[idx]; |
| var match = pseudoRule.cssText.match(/^[^{]+\{([^}]+)\}/); |
| if (match && match[1]) { |
| var rulesData = match[1].split(';').reduce(function (res, str) { |
| var match = str.match(/(\S+)\s*:\s*(\S+)/); |
| if (match && match[1] && match[2]) { |
| res[match[1]] = match[2]; |
| } |
| return res |
| }, {}); |
| extend(rulesData, data); |
| Object.keys(rulesData).forEach(function (rule) { |
| if (!rulesData[rule]) { delete rulesData[rule]; } |
| }); |
| styleSheet.deleteRule(idx); |
| styleSheet.insertRule(getCssText(selector, rulesData), rules.length - 1); |
| } |
| } |
| else { |
| styleSheet.insertRule(getCssText(selector, data), rules.length); |
| } |
| }); |
| } |
| |
| function bindEvents$2 (evts) { |
| var self = this; |
| var weexInstance = this.getWeexInstance(); |
| evts.map(function (evt) { |
| var func = self.event[evt] || {}; |
| var setter = func.setter; |
| if (setter) { |
| self.node.addEventListener(evt, setter); |
| return |
| } |
| var sender = weexInstance.sender; |
| var listener = function (e) { |
| // do stop bubbling. |
| // do not prevent default, otherwise the touchstart |
| // event will no longer trigger a click event |
| if (e._alreadyTriggered) { |
| return |
| } |
| e._alreadyTriggered = true; |
| var event = extend({}, e); |
| event.target = self.data; |
| sender.fireEvent(self.data.ref, evt, { |
| extra: func.extra && func.extra.bind(self), |
| updator: func.updator && func.updator.bind(self) |
| }, event); |
| }; |
| self.node.addEventListener(evt, listener, false, false); |
| var listeners = self._listeners; |
| if (!listeners) { |
| listeners = self._listeners = {}; |
| self.node._listeners = {}; |
| } |
| listeners[evt] = listener; |
| self.node._listeners[evt] = listener; |
| }); |
| } |
| |
| function unbindEvents (evts) { |
| var self = this; |
| evts.map(function (evt) { |
| var listener = this._listeners; |
| if (listener) { |
| self.node.removeEventListener(evt, listener); |
| self._listeners[evt] = null; |
| self.node._listeners[evt] = null; |
| } |
| }); |
| } |
| |
| |
| var operate = Object.freeze({ |
| create: create$2, |
| createChildren: createChildren$1, |
| appendChild: appendChild$1, |
| insertBefore: insertBefore$1, |
| removeChild: removeChild$1, |
| updateAttrs: updateAttrs$1, |
| updateStyle: updateStyle$1, |
| bindEvents: bindEvents$2, |
| unbindEvents: unbindEvents |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global HTMLElement */ |
| |
| var ua = navigator.userAgent; |
| var isFirefox = !!ua.match(/Firefox/i); |
| var isIEMobile = !!ua.match(/IEMobile/i); |
| var cssPrefix = isFirefox ? '-moz-' : isIEMobile ? '-ms-' : '-webkit-'; |
| var stylePrefix = isFirefox ? 'Moz' : isIEMobile ? 'ms' : 'webkit'; |
| |
| // even sticky, still not work. so... |
| // const supportSticky = detectSticky() |
| |
| function bindParent (sticky) { |
| if (!sticky instanceof Sticky) { |
| return |
| } |
| var scroller = sticky.component.getParentScroller(); |
| var pt; |
| if (scroller) { |
| pt = sticky.parent = scroller; |
| sticky.parentElement = pt.node; |
| } |
| else { |
| pt = sticky.parent = sticky.component.getRootContainer(); |
| sticky.parentElement = pt; |
| } |
| } |
| |
| function setSticky$1 (sticky) { |
| var comp = sticky.component; |
| var element = sticky.element; |
| comp.stickyPlaceholder = sticky.element.cloneNode(true); |
| comp.stickyPlaceholder.removeAttribute('data-ref'); |
| comp.stickyPlaceholder.classList.add('weex-sticky-placeholder'); |
| element.classList.add('weex-sticky'); |
| sticky.preMarginTop = element.style.marginTop; |
| sticky.preTop = element.style.top; |
| element.style.marginTop = sticky.top || '0' + 'px'; |
| |
| element.parentNode.insertBefore( |
| comp.stickyPlaceholder, element); |
| element.style.position = 'fixed'; |
| var top; |
| if (sticky.parent instanceof HTMLElement) { |
| top = 0; |
| } |
| else { |
| top = sticky.parentElement.getBoundingClientRect().top; |
| } |
| element.style.top = top + 'px'; |
| sticky.parentElement.appendChild(element); |
| } |
| |
| /** |
| * unsetSticky |
| * @param {Sticky} sticky : a sticky instance. |
| * @param {string} position : position replacing with (default: 'relative'). |
| */ |
| function unsetSticky$1 (sticky, position) { |
| var comp = sticky.component; |
| var element = sticky.element; |
| position = position ? position + '' : sticky.prePosition; |
| element.style.position = position; |
| element.style.marginTop = sticky.preMarginTop || ''; |
| element.style.top = sticky.preTop || ''; |
| element.classList.remove('weex-sticky'); |
| if (comp.stickyPlaceholder) { |
| var parent = comp.stickyPlaceholder.parentNode; |
| parent.insertBefore(element, comp.stickyPlaceholder); |
| parent.removeChild(comp.stickyPlaceholder); |
| comp.stickyPlaceholder = null; |
| } |
| } |
| |
| /** |
| * @class Sticky |
| * @param {Component} component: a weex component. |
| * @param {object} options config options. |
| * - options.component (optional) incase the component param is missing, it can |
| * be specified in this options. |
| * - options.withinParent=false(optional,only for Android)the sticky effect is |
| * limited within the parent element only. |
| */ |
| function Sticky (component, options) { |
| options = options || {}; |
| this.component = component; |
| this.element = component.node; |
| this.prePosition = this.element.style.position; |
| this.withinParent = options.withinParent || false; |
| this.parent = null; |
| this.init(); |
| } |
| |
| Sticky.prototype = { |
| |
| constructor: Sticky, |
| |
| init: function init () { |
| var elementStyle = this.element.style; |
| elementStyle[stylePrefix + 'Transform'] = 'translateZ(0)'; // fix flickering |
| elementStyle['transform'] = 'translateZ(0)'; |
| bindParent(this); |
| // if (supportSticky) { |
| // elementStyle.position = cssPrefix + 'sticky' |
| // } |
| this._simulateSticky(); |
| this._bindResize(); |
| }, |
| |
| _bindResize: function _bindResize () { |
| var self = this; |
| var isAndroid = (/android/gi).test(navigator.appVersion); |
| var resizeEvent = self._resizeEvent = 'onorientationchange' in window |
| ? 'orientationchange' |
| : 'resize'; |
| var resizeHandler = self._resizeHandler = function () { |
| setTimeout(function () { |
| self.refresh(); |
| }, isAndroid ? 200 : 0); |
| }; |
| window.addEventListener(resizeEvent, resizeHandler, false); |
| }, |
| |
| /** |
| * Refresh a instance. |
| * If withParent is true and the parent' height altered, this |
| * method should be called. |
| */ |
| refresh: function refresh () { |
| // if (supportSticky) { |
| // return |
| // } |
| this._detach(); |
| this._simulateSticky(); |
| }, |
| |
| _simulateSticky: function _simulateSticky () { |
| var self = this; |
| var isInScrollable = this.isInScrollable(); |
| // the initial y offset. |
| this.offset = (isInScrollable |
| ? this.getParentScroller().offset |
| : window.pageYOffset) |
| || 0; |
| var rectTop = this.element.getBoundingClientRect().top; |
| var wrapperTop = 0; |
| if (isInScrollable) { |
| wrapperTop = this.parentElement.getBoundingClientRect().top; |
| } |
| var withinParent = this.withinParent; |
| var thresholdBase = rectTop - wrapperTop + this.offset; |
| /** |
| * curState: |
| * 1 - normal |
| * 2 - sticky |
| * 3 - exceed parent |
| * @type {Number} |
| */ |
| this.curState = 1; |
| var scrollHandler = this._scrollHandler = throttle(function (e) { |
| var thresholdTop = thresholdBase; |
| var ypos = self.isInScrollable() ? e.offset : window.pageYOffset; |
| self.offset = ypos; |
| if (ypos < thresholdTop) { |
| if (self.curState !== 1) { |
| unsetSticky$1(self); |
| self.curState = 1; |
| } |
| } |
| else if ((!withinParent && ypos >= thresholdTop) || |
| (withinParent && ypos >= thresholdTop/* && ypos < thresholdBottom*/)) { |
| if (self.curState !== 2) { |
| setSticky$1(self); |
| self.curState = 2; |
| } |
| } |
| }, 100); |
| window.addEventListener('scroll', scrollHandler, false); |
| |
| // take effect once inited after a destroyment. |
| if (this.offset >= thresholdBase) { |
| var dummyEvent = document.createEvent('HTMLEvents'); |
| dummyEvent.initEvent('scroll', true, true); |
| window.dispatchEvent(dummyEvent); |
| } |
| }, |
| |
| _detach: function _detach (position) { |
| position = position ? position + '' : 'relative'; |
| // if (supportSticky) { |
| // return |
| // } |
| if (this.curState === 2) { |
| unsetSticky$1(this); |
| } |
| window.removeEventListener('scroll', this._scrollHandler, false); |
| }, |
| |
| isInScrollable: function isInScrollable () { |
| if (!this._isInScrollable) { |
| try { |
| this._isInScrollable = this.component.isInScrollable(); |
| } |
| catch (err) { |
| // The parentRef is not in componentManager's componentMap yet, so |
| // it's invalid to get the parent and test if it's scrollable. |
| // This is most likely to happen in the case that the parent |
| // component's 'append' attribute is set to 'tree'. |
| console.error('isInScrollable is not yet available to call', err); |
| } |
| } |
| return this._isInScrollable |
| }, |
| |
| getParentScroller: function getParentScroller () { |
| return this.component.getParentScroller() |
| }, |
| |
| destroy: function destroy (position) { |
| this._detach(position); |
| var elementStyle = this.element.style; |
| elementStyle.removeProperty(cssPrefix + 'transform'); |
| elementStyle.removeProperty('transform'); |
| // if (supportSticky) { |
| // return |
| // } |
| window.removeEventListener(this._resizeEvent, this._resizeHandler, false); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // Set positon to fixed, with a placeholder if it's in a |
| // scrollable component. |
| function setFixed () { |
| // delay processing in case the node is not appended yet. |
| setTimeout(function () { |
| this.node.style.position = 'fixed'; |
| if (!this.isInScrollable()) { |
| return |
| } |
| var parent = this.node.parentNode; |
| if (parent) { |
| // For the elements who are fixed: this fixedPlaceholder |
| // shoud be inserted, and the fixed element itself should |
| // be moved to the root container. |
| this.fixedPlaceholder = document.createElement('div'); |
| this.fixedPlaceholder.classList.add('weex-fixed-placeholder'); |
| this.fixedPlaceholder.style.cssText = [ |
| 'display:none;', |
| 'width:0px;', |
| 'height:0px;' |
| ].join(''); |
| parent.insertBefore(this.fixedPlaceholder, this.node); |
| this.getRootContainer().appendChild(this.node); |
| } |
| }.bind(this), 0); |
| } |
| |
| // unset a fixed node to the pecified 'position' or 'relative' by default. |
| function unsetFixed (position) { |
| // For the elements who are fixed elements before, now |
| // are not fixed: the fixedPlaceholder has to be replaced |
| // by this element. |
| position = position ? position + '' : 'relative'; |
| if (this.fixedPlaceholder) { |
| var parent = this.fixedPlaceholder.parentNode; |
| parent.insertBefore(this.node, this.fixedPlaceholder); |
| parent.removeChild(this.fixedPlaceholder); |
| this.fixedPlaceholder = null; |
| this.node.style.position = position; |
| } |
| } |
| |
| function setSticky () { |
| this.node.style.zIndex = 100; |
| setTimeout(function () { |
| this.sticky = new Sticky(this); |
| }.bind(this), 0); |
| } |
| |
| function unsetSticky () { |
| if (this.sticky) { |
| this.sticky.destroy(); |
| this.sticky = null; |
| } |
| } |
| |
| // usally used to unset sticky and fixed |
| function unsetPosition (position) { |
| this.style.position.call(this, position); |
| } |
| |
| var style = { |
| position: function position (value) { |
| // This is a peace of hacking to fix the problem about |
| // mixing fixed and transform. See 'http://stackoverflo |
| // w.com/questions/15194313/webkit-css-transform3d-posi |
| // tion-fixed-issue' for more info. |
| value !== 'fixed' && this.unsetFixed(); |
| value !== 'sticky' && this.unsetSticky(); |
| if (value === 'fixed') { |
| return this.setFixed() |
| } |
| if (value === 'sticky') { |
| return this.setSticky() |
| } |
| this.node.style.position = value; |
| } |
| }; |
| |
| |
| var position$1 = Object.freeze({ |
| setFixed: setFixed, |
| unsetFixed: unsetFixed, |
| setSticky: setSticky, |
| unsetSticky: unsetSticky, |
| unsetPosition: unsetPosition, |
| style: style |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var boxAlignMap = { |
| stretch: 'stretch', |
| 'flex-start': 'start', |
| 'flex-end': 'end', |
| center: 'center' |
| }; |
| |
| var boxOrientMap = { |
| row: 'horizontal', |
| column: 'vertical' |
| }; |
| |
| var boxPackMap = { |
| 'flex-start': 'start', |
| 'flex-end': 'end', |
| center: 'center', |
| 'space-between': 'justify', |
| 'space-around': 'justify' // Just same as `space-between` |
| }; |
| |
| var flexbox = { |
| style: { |
| flex: function flex (value) { |
| this.node.style.webkitBoxFlex = value; |
| this.node.style.webkitFlex = value; |
| this.node.style.flex = value; |
| }, |
| |
| alignItems: function alignItems (value) { |
| this.node.style.webkitBoxAlign = boxAlignMap[value]; |
| this.node.style.webkitAlignItems = value; |
| this.node.style.alignItems = value; |
| }, |
| |
| alignSelf: function alignSelf (value) { |
| this.node.style.webkitAlignSelf = value; |
| this.node.style.alignSelf = value; |
| }, |
| |
| flexDirection: function flexDirection (value) { |
| this.node.style.webkitBoxOrient = boxOrientMap[value]; |
| this.node.style.webkitFlexDirection = value; |
| this.node.style.flexDirection = value; |
| }, |
| |
| justifyContent: function justifyContent (value) { |
| this.node.style.webkitBoxPack = boxPackMap[value]; |
| this.node.style.webkitJustifyContent = value; |
| this.node.style.justifyContent = value; |
| } |
| } |
| } |
| |
| /* eslint-disable */ |
| ; |
| /* eslint-enable */ |
| |
| (function (win, lib) { |
| var doc = document; |
| var appearEvt; |
| var disappearEvt; |
| |
| function createEvent() { |
| appearEvt = doc.createEvent("HTMLEvents");//创建自定义显示事件 |
| disappearEvt = doc.createEvent("HTMLEvents");//创建自定义消失事件 |
| appearEvt.initEvent('_appear', false, true); |
| disappearEvt.initEvent('_disappear', false, true); |
| } |
| |
| /** |
| * [throttle 节流函数] |
| * @param {[function]} func [执行函数] |
| * @param {[int]} wait [等待时长] |
| * @return {[type]} [description] |
| */ |
| function throttle(func, wait) { |
| var latest = Date.now(), |
| previous = 0,//上次执行的时间 |
| timeout = null,//setTimout任务 |
| context,//上下文 |
| args,//参数 |
| result;//结果 |
| var later = function () { |
| previous = Date.now(); |
| timeout = null;//清空计时器 |
| func.apply(context, args); |
| }; |
| return function () { |
| var now = Date.now(); |
| context = this; |
| args = arguments; |
| |
| var remaining = wait - (now - previous); |
| if (remaining <= 0 || remaining >= wait) { |
| //如果没有剩余时间,或者存在修改过系统时间导致剩余时间增大的情况,则执行 |
| clearTimeout(timeout); |
| timeout = null; |
| result = func.apply(context, args); |
| } else if (timeout == null) { |
| timeout = setTimeout(later, remaining); |
| } |
| return result; |
| } |
| } |
| |
| /** |
| * [getOffset 获取边距尺寸] |
| * @param {[type]} el [description] |
| * @param {[type]} param [description] |
| * @return {[type]} [description] |
| */ |
| function getOffset(el, param) { |
| var el, l, r, b, t; |
| if (!el) { |
| return; |
| } |
| if (!param) { |
| param = {x: 0, y: 0}; |
| } |
| |
| if (el != window) { |
| el = el.getBoundingClientRect(); |
| l = el.left; |
| t = el.top; |
| r = el.right; |
| b = el.bottom; |
| } else { |
| l = 0; |
| t = 0; |
| r = l + el.innerWidth; |
| b = t + el.innerHeight; |
| } |
| return { |
| 'left': l, |
| 'top': t, |
| 'right': r + param.x, |
| 'bottom': b + param.y |
| }; |
| } |
| //元素位置比较 |
| function compareOffset(d1, d2) { |
| var left = d2.right > d1.left && d2.left < d1.right; |
| var top = d2.bottom > d1.top && d2.top < d1.bottom; |
| return left && top; |
| } |
| //获取移动方向 |
| function getDirection(beforeOffset, nowOffset) { |
| var direction = 'none'; |
| var horizental = beforeOffset.left - nowOffset.left; |
| var vertical = beforeOffset.top - nowOffset.top; |
| if (vertical == 0) { |
| if (horizental != 0) { |
| direction = horizental > 0 ? 'left' : 'right'; |
| } else { |
| direction = 'none'; |
| } |
| } |
| if (horizental == 0) { |
| if (vertical != 0) { |
| direction = vertical > 0 ? 'up' : 'down'; |
| } else { |
| direction = 'none'; |
| } |
| } |
| return direction; |
| } |
| |
| function extend(target, el) { |
| for (var k in el) { |
| if (el.hasOwnProperty(k)) { |
| target[k] = el[k]; |
| } |
| } |
| return target; |
| } |
| |
| /** |
| * [__bindEvent 绑定事件,包括滚动、touchmove、transform、resize等] |
| * @return {[type]} [description] |
| */ |
| function __bindEvent() { |
| var self = this; |
| var handle = throttle(function () { |
| __fire.apply(self, arguments); |
| }, this.options.wait); |
| if (this.__handle) { |
| //避免重复绑定 |
| this.container.removeEventListener('scroll', this.__handle); |
| this.__handle = null; |
| } |
| this.__handle = handle; |
| this.container.addEventListener('scroll', handle, false); |
| this.container.addEventListener('resize', function(ev) { |
| __fire.apply(self, arguments); |
| }, false); |
| this.container.addEventListener('animationEnd', function() { |
| __fire.apply(self, arguments); |
| }, false); |
| // android4.0以下 |
| this.container.addEventListener('webkitAnimationEnd', function() { |
| __fire.apply(self, arguments); |
| }, false); |
| this.container.addEventListener('transitionend', function() { |
| __fire.apply(self, arguments); |
| }, false); |
| } |
| |
| //获取容器内所有的加载元素 |
| function __getElements(selector) { |
| var self = this; |
| //获取容器 |
| var container = this.options.container; |
| if (typeof container == 'string') { |
| //如果是字符串,则选择器 |
| this.container = doc.querySelector(container); |
| } else { |
| //对象传值 |
| this.container = container; |
| } |
| //获取容器内的所有目标元素 |
| if (this.container == window) { |
| var appearWatchElements = doc.querySelectorAll(selector); |
| } else { |
| var appearWatchElements = this.container.querySelectorAll(selector); |
| } |
| var appearWatchElements = [].slice.call(appearWatchElements, null); |
| |
| appearWatchElements = appearWatchElements.filter(function(ele) { |
| // 如果已经绑定过,清除appear状态,不再加入到数组里 |
| if (ele.dataset['bind'] == '1') { |
| delete ele._hasAppear; |
| delete ele._hasDisAppear; |
| delete ele._appear; |
| ele.classList.remove(self.options.cls); |
| return false; |
| } else { |
| return true; |
| } |
| }); |
| |
| return appearWatchElements; |
| } |
| |
| function __initBoundingRect(elements) { |
| var self = this; |
| if (elements && elements.length > 0) { |
| [].forEach.call(elements, function (ele) { |
| ele._eleOffset = getOffset(ele); |
| //移除类名 |
| ele.classList.remove(self.options.cls); |
| // 标志已经绑定 |
| ele.dataset['bind'] = 1; |
| }); |
| } |
| } |
| |
| // 触发加载 |
| function __fire() { |
| var container = this.container, |
| elements = this.appearWatchElements, |
| appearCallback = this.options.onAppear,//appear的执行函数 |
| disappearCallback = this.options.onDisappear,//disappear的执行函数 |
| containerOffset = getOffset(container, { |
| x: this.options.x, |
| y: this.options.y |
| }), |
| isOnce = this.options.once,//是否只执行一次 |
| ev = arguments[0] || {}; |
| if (elements && elements.length > 0) { |
| [].forEach.call(elements, function (ele, i) { |
| //获取左右距离 |
| var eleOffset = getOffset(ele); |
| var direction = getDirection(ele._eleOffset, eleOffset); |
| //保存上个时段的位置信息 |
| ele._eleOffset = eleOffset; |
| //查看是否在可视区域范围内 |
| var isInView = compareOffset(containerOffset, eleOffset); |
| var appear = ele._appear; |
| var _hasAppear = ele._hasAppear; |
| var _hasDisAppear = ele._hasDisAppear; |
| appearEvt.data = { |
| direction: direction |
| }; |
| disappearEvt.data = { |
| direction: direction |
| }; |
| if (isInView && !appear) { |
| if ((isOnce && !_hasAppear) || !isOnce) { |
| //如果只触发一次并且没有触发过或者允许触发多次 |
| //如果在可视区域内,并且是从disppear进入appear,则执行回调 |
| appearCallback && appearCallback.call(ele, ev); |
| //触发自定义事件 |
| ele.dispatchEvent(appearEvt); |
| ele._hasAppear = true; |
| ele._appear = true; |
| } |
| } else if (!isInView && appear) { |
| if ((isOnce && !_hasDisAppear) || !isOnce) { |
| //如果不在可视区域内,并且是从appear进入disappear,执行disappear回调 |
| disappearCallback && disappearCallback.call(ele, ev); |
| //触发自定义事件 |
| ele.dispatchEvent(disappearEvt); |
| ele._hasDisAppear = true; |
| ele._appear = false; |
| } |
| } |
| }); |
| } |
| } |
| |
| // proto = extend(proto, listener); |
| |
| function __init(opts) { |
| //扩展参数 |
| extend(this.options, opts || (opts = {})); |
| //获取目标元素 |
| this.appearWatchElements = this.appearWatchElements || __getElements.call(this, '.' + this.options.cls); |
| //初始化位置信息 |
| __initBoundingRect.call(this, this.appearWatchElements); |
| //绑定事件 |
| __bindEvent.call(this); |
| } |
| |
| var Appear = function () { |
| __init.apply(this, arguments); |
| }; |
| |
| |
| var appear = { |
| instances: [], |
| init: function (opts) { |
| var proto = { |
| //默认参数 |
| options: { |
| container: window, |
| wait: 100, |
| x: 0, |
| y: 0, |
| cls: 'lib-appear', |
| once: false, |
| onReset: function () {}, |
| onAppear: function () {}, |
| onDisappear: function () {} |
| }, |
| container: null, |
| appearWatchElements: null, |
| bind: function (node) { |
| var cls = this.options.cls; |
| // 添加需要绑定的appear元素 |
| if (typeof node == 'string') { |
| var elements = __getElements.call(this, node); |
| [].forEach.call(elements, function (ele, i) { |
| if (!ele.classList.contains(cls)) { |
| ele.classList.add(cls); |
| } |
| }); |
| |
| } else if (node.nodeType == 1 && this.container.contains(node)) { |
| //如果传入的是元素并且在包含在容器中,直接添加类名 |
| if (!node.classList.contains(cls)) { |
| //添加类名 |
| node.classList.add(cls); |
| } |
| } else { |
| return this; |
| } |
| //新增的子元素 |
| var newElements = __getElements.call(this, '.' + this.options.cls); |
| //对缓存的子元素做增量 |
| this.appearWatchElements = this.appearWatchElements.concat(newElements); |
| //初始化新子元素的位置信息 |
| __initBoundingRect.call(this, newElements); |
| return this; |
| }, |
| // 重置函数 |
| reset: function (opts) { |
| __init.call(this, opts); |
| this.appearWatchElements.forEach(function(ele) { |
| delete ele._hasAppear; |
| delete ele._hasDisAppear; |
| delete ele._appear; |
| }); |
| return this; |
| }, |
| fire: function () { |
| if (!this.appearWatchElements) { |
| this.appearWatchElements = []; |
| } |
| var newElements = __getElements.call(this, '.' + this.options.cls); |
| this.appearWatchElements = this.appearWatchElements.concat(newElements); |
| //初始化位置信息 |
| __initBoundingRect.call(this, newElements); |
| __fire.call(this); |
| return this; |
| } |
| }; |
| Appear.prototype = proto; |
| var instance = new Appear(opts); |
| this.instances.push(instance); |
| return instance; |
| }, |
| fireAll: function () { |
| var instances = this.instances; |
| instances.forEach(function (instance) { |
| instance.fire(); |
| }); |
| } |
| }; |
| //注册事件 |
| createEvent(); |
| |
| lib.appear = appear; |
| |
| })(window, window.lib || (window.lib = {})); |
| |
| var adapter = createCommonjsModule(function (module) { |
| /* |
| lazyimg |
| Author: _danz |
| */ |
| |
| |
| (function (win, lib) { |
| |
| |
| var adapter = {}; |
| var appearInstance; |
| var runtimeFlags = {}; |
| |
| var config = { |
| 'dataSrc': 'img-src', //指定图片地址的attribute名, 兼做lazy-class的作用 |
| 'lazyHeight': 0, //以此高度提前触发懒加载 |
| 'lazyWidth': 0 //以此宽度提前触发懒加载 |
| }; |
| |
| function extendStrict(main, sub) { |
| var ret = {}; |
| for (var k in main) { |
| if (main.hasOwnProperty(k)) { |
| ret[k] = sub.hasOwnProperty(k) ? sub[k] : main[k]; |
| } |
| } |
| return ret; |
| } |
| |
| function preLoadImg (src, loadCallback, errorCallback) { |
| var img = new Image(); |
| img.src = src; |
| img.onload = loadCallback ? loadCallback.bind(img) : null; |
| img.onerror = errorCallback ? errorCallback.bind(img) : null; |
| } |
| |
| function dispatchEvent (item, type, data) { |
| var evt = document.createEvent('CustomEvent'); |
| evt.initCustomEvent(type, false, false, data); |
| item.dispatchEvent(evt); |
| } |
| |
| function applySrc(item, processedSrc, placeholderSrc) { |
| if (!processedSrc) { |
| return; |
| } |
| if (item.nodeName.toUpperCase() == 'IMG') { |
| item.onerror = function () { |
| this.onerror = null; |
| this.src = placeholderSrc; |
| }; |
| item.setAttribute('src', processedSrc); |
| if (!placeholderSrc) { |
| return |
| } |
| } else { |
| preLoadImg(processedSrc, function () { |
| item.style.backgroundImage = 'url("' + processedSrc + '")'; |
| var naturalWidth = this.width; |
| var naturalHeight = this.height; |
| dispatchEvent(item, 'load', { |
| success: true, |
| size: { naturalWidth: naturalWidth, naturalHeight: naturalHeight } |
| }); |
| }, function () { |
| dispatchEvent(item, 'load', { success: false }); |
| preLoadImg(placeholderSrc, function () { |
| item.style.backgroundImage = 'url("' + placeholderSrc + '")'; |
| }); |
| }); |
| } |
| } |
| |
| function init() { |
| appearInstance = lib.appear.init({ |
| cls: 'imgtmp', //可选,需要遍历的元素 |
| once: true, //可选,是否只触发一次 |
| x: config.lazyWidth, //可选,容器右边距离x以内的元素加载,默认为0 |
| y: config.lazyHeight, //可选,容器底部距离y以内的元素加载,默认为0 |
| onAppear: function (evt) { |
| var item = this; |
| applySrc(item, item.getAttribute('i-lazy-src'), item.dataset.placeholder); |
| item.removeAttribute('i-lazy-src'); |
| } |
| }); |
| } |
| |
| adapter.logConfig = function () { |
| console.log('lib-img Config\n', config); |
| }; |
| |
| adapter.fire = function () { |
| |
| if (!appearInstance) { |
| init(); |
| } |
| |
| var label = 'i_' + Date.now() % 100000; |
| var domList = document.querySelectorAll('[' + config.dataSrc + ']'); |
| |
| [].forEach.call(domList, function (item) { |
| if (item.dataset.lazy == 'false' && item.dataset.lazy != 'true') { |
| applySrc(item, item.getAttribute(config.dataSrc), item.dataset.placeholder); |
| } else { |
| item.classList.add(label); |
| item.setAttribute('i-lazy-src', item.getAttribute(config.dataSrc)); |
| } |
| item.removeAttribute(config.dataSrc); |
| }); |
| |
| appearInstance.bind('.' + label); |
| appearInstance.fire(); |
| }; |
| |
| adapter.defaultSrc = 'data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg=='; |
| |
| lib.img = adapter; |
| |
| module.exports = adapter; |
| |
| })(window, window['lib'] || (window['lib'] = {})); |
| }); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global lib, HTMLElement */ |
| |
| var lazyloadTimer; |
| |
| // fire lazyimg on images. |
| function fire () { |
| setTimeout(function () { return lib.img.fire(); }, 0); |
| } |
| |
| // we don't know when all images are appended |
| // just use setTimeout to do delay lazyload |
| // |
| // -- actually everytime we add a element or update styles, |
| // the component manager will call startIfNeed to fire |
| // lazyload once again in the handleAppend function. so there |
| // is no way that any image element can miss it. See source |
| // code in componentMangager.js. |
| |
| // just for the image component to start lazyload. |
| function startIfNeeded (target) { |
| if (!lazyloadTimer) { |
| lazyloadTimer = setTimeout(function () { |
| fire(); |
| clearTimeout(lazyloadTimer); |
| lazyloadTimer = null; |
| }, 16); |
| } |
| } |
| |
| // for a scope of element, not for a image. |
| function loadIfNeeded (elementScope) { |
| var notPreProcessed = elementScope.querySelectorAll('[img-src]'); |
| // image elements which have attribute 'i-lazy-src' were elements |
| // that had been preprocessed by lib-img-core, but not loaded yet, and |
| // must be loaded when 'appear' events were fired. It turns out the |
| // 'appear' event was not fired correctly in the css-translate-transition |
| // situation, so 'i-lazy-src' must be checked and lazyload must be |
| // fired manually. |
| var preProcessed = elementScope.querySelectorAll('[i-lazy-src]'); |
| if (notPreProcessed.length > 0 || preProcessed.length > 0) { |
| fire(); |
| } |
| } |
| |
| function makeImageLazy (image, src) { |
| image.removeAttribute('img-src'); |
| image.removeAttribute('i-lazy-src'); |
| image.removeAttribute('src'); |
| image.setAttribute('img-src', src); |
| fire(); |
| } |
| |
| function fireLazyload (target) { |
| if (typeof target === 'object' && !(target instanceof HTMLElement)) { |
| target = target.node; |
| } |
| if (!target) { |
| return |
| } |
| if (target.tagName.toLowerCase() === 'image') { |
| return startIfNeeded(target) |
| } |
| return loadIfNeeded(target) |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var appearEvts = ['appear', 'disappear']; |
| |
| /** |
| * check whether a event is valid to dispatch. |
| * @param {Component} comp the component that this event is to trigger on. |
| * @param {string} type the event type. |
| * @return {Boolean} is it valid to dispatch. |
| */ |
| function isEventValid (comp, type) { |
| // if a component has aleary triggered 'appear' event, then |
| // the 'appear' even† can't be triggered again utill the |
| // 'disappear' event triggered. |
| if (appearEvts.indexOf(type) <= -1) { |
| return true |
| } |
| if (comp._appear === undefined && type === 'disappear') { |
| return false |
| } |
| var res; |
| if (comp._appear === undefined && type === 'appear') { |
| res = true; |
| } |
| else { |
| res = type !== comp._appear; |
| } |
| res && (comp._appear = type); |
| return res |
| } |
| |
| function Component (data, nodeType) { |
| this.data = data; |
| this.node = this.create(nodeType); |
| this.createChildren(); |
| this.updateAttrs(this.data.attr || {}); |
| // issue: when add element to a list in lifetime hook 'ready', the |
| // styles is set to the classStyle, not style. This is a issue |
| // that jsframework should do something about. |
| var classStyle = this.data.classStyle; |
| classStyle && this.updateStyle(this.data.classStyle); |
| this.updateStyle(this.data.style || {}); |
| this.bindEvents(this.data.event || []); |
| } |
| |
| Component.prototype = { |
| |
| getComponentManager: function getComponentManager () { |
| return ComponentManager.getInstance(this.data.instanceId) |
| }, |
| |
| getWeexInstance: function getWeexInstance () { |
| return this.getComponentManager().getWeexInstance() |
| }, |
| |
| getParent: function getParent () { |
| return this.getComponentManager().componentMap[this.parentRef] |
| }, |
| |
| getParentScroller: function getParentScroller () { |
| if (this.isInScrollable()) { |
| return this._parentScroller |
| } |
| return null |
| }, |
| |
| getRootScroller: function getRootScroller () { |
| if (this.isInScrollable()) { |
| var scroller = this._parentScroller; |
| var parent = scroller._parentScroller; |
| while (parent) { |
| scroller = parent; |
| parent = scroller._parentScroller; |
| } |
| return scroller |
| } |
| return null |
| }, |
| |
| getRootContainer: function getRootContainer () { |
| var root = this.getWeexInstance().getRoot() |
| || document.body; |
| return root |
| }, |
| |
| isScrollable: function isScrollable () { |
| var t = this.data.type; |
| return ComponentManager.getScrollableTypes().indexOf(t) !== -1 |
| }, |
| |
| isInScrollable: function isInScrollable () { |
| if (typeof this._isInScrollable === 'boolean') { |
| return this._isInScrollable |
| } |
| var parent = this.getParent(); |
| if (parent |
| && (typeof parent._isInScrollable !== 'boolean') |
| && !parent.isScrollable()) { |
| if (parent.data.ref === '_root') { |
| this._isInScrollable = false; |
| return false |
| } |
| this._isInScrollable = parent.isInScrollable(); |
| this._parentScroller = parent._parentScroller; |
| return this._isInScrollable |
| } |
| if (parent && typeof parent._isInScrollable === 'boolean') { |
| this._isInScrollable = parent._isInScrollable; |
| this._parentScroller = parent._parentScroller; |
| return this._isInScrollable |
| } |
| if (parent && parent.isScrollable()) { |
| this._isInScrollable = true; |
| this._parentScroller = parent; |
| return true |
| } |
| }, |
| |
| // dispatch a specified event on this.node |
| // - type: event type |
| // - data: event data |
| // - config: event config object |
| // - bubbles |
| // - cancelable |
| dispatchEvent: function dispatchEvent (type, data, config) { |
| if (!isEventValid(this, type)) { |
| return |
| } |
| var event = document.createEvent('HTMLEvents'); |
| config = config || {}; |
| event.initEvent(type, config.bubbles || false, config.cancelable || false); |
| !data && (data = {}); |
| event.data = extend({}, data); |
| extend(event, data); |
| this.node.dispatchEvent(event); |
| }, |
| |
| onAppend: function () { |
| var this$1 = this; |
| |
| var evts = this.data.event; |
| if (!evts || !evts.length) { return } |
| var flag = false; |
| for (var i = 0, l = evts.length; i < l; i++) { |
| if (evts[i] === 'appear') { |
| flag = true; |
| break |
| } |
| } |
| if (!flag) { |
| return |
| } |
| // trigger 'appear' event in the next tick. |
| setTimeout(function () { |
| if (isComponentAppear(this$1)) { |
| this$1.dispatchEvent('appear', { direction: '' }); |
| } |
| }, 0); |
| }, |
| |
| addAppendHandler: function addAppendHandler (cb) { |
| var pre; |
| if (this.onAppend) { |
| pre = this.onAppend.bind(this); |
| } |
| this.onAppend = function () { |
| pre && pre.call(this); |
| cb && cb.call(this); |
| }.bind(this); |
| }, |
| |
| // change src to img-src for lib.img to fire lazyload later. |
| enableLazyload: function enableLazyload (src) { |
| if (this.node) { |
| makeImageLazy(this.node, src); |
| } |
| else { |
| console.error('[h5-render] this.node does not exist.'); |
| } |
| }, |
| |
| // target can be both weex component and dom element. |
| fireLazyload: function fireLazyload$1 (target) { |
| !target && (target = this); |
| fireLazyload(target); |
| }, |
| |
| attr: {}, // attr setters |
| |
| style: {}, // style setters |
| |
| // event funcs |
| // - 1. 'updator' for updating attrs or styles with out triggering messages. |
| // - 2. 'extra' for binding extra data. |
| // - 3. 'setter' set a specified event handler. |
| // funcs should be functions like this: (take 'change' event as a example) |
| // { |
| // change: { |
| // updator () { |
| // return { |
| // attrs: { |
| // checked: this.checked |
| // } |
| // } |
| // }, |
| // extra () { |
| // return { |
| // value: this.checked |
| // } |
| // } |
| // } |
| // } |
| event: {}, |
| |
| clearAttr: function clearAttr () { |
| }, |
| |
| clearStyle: function clearStyle () { |
| this.node.cssText = ''; |
| } |
| }; |
| |
| // extend operations. |
| extend(Component.prototype, operate); |
| |
| // extend attr and style setters from 'position' and 'flexbox'. |
| extend(Component.prototype, position$1); |
| extend(Component.prototype.style, flexbox.style); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // Component which can have no subcomponents. |
| // This component should not be instantiated directly, since |
| // it is designed to be used as a base class to extend from. |
| function Atomic (data) { |
| Component.call(this, data); |
| } |
| |
| Atomic.prototype = Object.create(Component.prototype); |
| |
| Atomic.prototype.createChildren = function (data) { |
| // do nonthing |
| return |
| }; |
| |
| Atomic.prototype.appendChild = function (data) { |
| // do nothing |
| return |
| }; |
| |
| Atomic.prototype.insertBefore = function (child, before) { |
| // do nothing |
| return |
| }; |
| |
| Atomic.prototype.removeChild = function (child) { |
| // do nothing |
| return |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** |
| * save the original listener for 'addEventListener'. |
| * this is the dipaching listener which is waiting for feed. |
| * map structure: moduleName -> eventName -> [handlers]. |
| */ |
| var handlerMap$1 = {}; |
| |
| window.addEventListener('moduleevent', function (event) { |
| var dt = event.detail || {}; |
| var module = dt.module; |
| var type = dt.type; |
| try { |
| handlerMap$1[module][type].forEach(function (handler) { return handler(dt); }); |
| } |
| catch (e) { |
| console.warn(("[h5-render] no such event " + type + " for module " + module + ".")); |
| } |
| }); |
| |
| function addEventListener$1 (module, evt, callbackId, options) { |
| var this$1 = this; |
| |
| var once = options && !!options.once; |
| var moduleMap = handlerMap$1[module]; |
| if (!moduleMap) { |
| moduleMap = handlerMap$1[module] = {}; |
| } |
| var handlers = moduleMap[evt]; |
| if (!handlers) { |
| handlers = moduleMap[evt] = []; |
| } |
| handlers.push(function (data) { return this$1.sender.performCallback(callbackId, data, !once); }); |
| } |
| |
| function removeAllEventListeners$1 (module, evt) { |
| try { |
| delete handlerMap$1[module][evt]; |
| } |
| catch (e) { |
| // do nothing. |
| } |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * register module event listener for every api module except 'globalEvent'. |
| */ |
| function registerModuleEventListener (name, module, meta) { |
| if (name !== 'globalEvent') { |
| module['addEventListener'] = function (evt, callbackId, options) { |
| return addEventListener$1.call(this, name, evt, callbackId, options) |
| }; |
| module['removeAllEventListeners'] = function (evt) { |
| return removeAllEventListeners$1.call(this, name, evt) |
| } |
| ; [{ |
| name: 'addEventListener', |
| args: ['string', 'function', 'object'] |
| }, { |
| name: 'removeAllEventListeners', |
| args: ['string'] |
| }].forEach(function (info) { return meta[name].push(info); }); |
| } |
| } |
| |
| var methods$2 = { |
| // Register a new component with the specified name. |
| registerComponent: function registerComponent (name, comp) { |
| ComponentManager.registerComponent(name, comp); |
| }, |
| |
| // Register a new api module. |
| // If the module already exists, just add methods from the |
| // new module to the old one. |
| registerApiModule: function registerApiModule (name, module, meta) { |
| registerModuleEventListener(name, module, meta); |
| if (!protocol.apiModule[name]) { |
| protocol.apiModule[name] = module; |
| } |
| else { |
| for (var key in module) { |
| if (module.hasOwnProperty(key)) { |
| protocol.apiModule[name][key] = module[key]; |
| } |
| } |
| } |
| // register API module's meta info to jsframework |
| if (meta) { |
| protocol.setApiModuleMeta(meta); |
| global.registerModules(protocol.getApiModuleMeta(name), true); |
| } |
| }, |
| |
| // Register a new api method for the specified module. |
| // opts: |
| // - args: type of arguments the API method takes such |
| // as ['string', 'function'] |
| registerApi: function registerApi (moduleName, name, method, args) { |
| if (typeof method !== 'function') { |
| return |
| } |
| if (!protocol.apiModule[moduleName]) { |
| protocol.apiModule[moduleName] = {}; |
| protocol._meta[moduleName] = []; |
| } |
| protocol.apiModule[moduleName][name] = method; |
| if (!args) { |
| return |
| } |
| // register API meta info to jsframework |
| protocol.setApiMeta(moduleName, { |
| name: name, |
| args: args |
| }); |
| global.registerModules(protocol.getApiModuleMeta(moduleName), true); |
| }, |
| |
| // Register a new weex-bundle-loader. |
| registerLoader: function registerLoader$1 (name, loaderFunc) { |
| registerLoader(name, loaderFunc); |
| } |
| |
| }; |
| |
| // To install components and plugins. |
| function install (mod) { |
| mod.init(this); |
| } |
| |
| function bind$1 (Weex) { |
| Weex.install = install.bind(Weex); |
| extend(Weex, methods$2); |
| } |
| |
| (typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a){Object.defineProperty(this,"val",{value:a.toString(),enumerable:!0}),this.gt=function(a){return c.compare(this,a)>0},this.gte=function(a){return c.compare(this,a)>=0},this.lt=function(a){return c.compare(this,a)<0},this.lte=function(a){return c.compare(this,a)<=0},this.eq=function(a){return 0===c.compare(this,a)};}b.env=b.env||{},c.prototype.toString=function(){return this.val},c.prototype.valueOf=function(){for(var a=this.val.split("."),b=[],c=0;c<a.length;c++){var d=parseInt(a[c],10);isNaN(d)&&(d=0);var e=d.toString();e.length<5&&(e=Array(6-e.length).join("0")+e),b.push(e),1===b.length&&b.push(".");}return parseFloat(b.join(""))},c.compare=function(a,b){a=a.toString().split("."),b=b.toString().split(".");for(var c=0;c<a.length||c<b.length;c++){var d=parseInt(a[c],10),e=parseInt(b[c],10);if(window.isNaN(d)&&(d=0),window.isNaN(e)&&(e=0),e>d){ return-1; }if(d>e){ return 1 }}return 0},b.version=function(a){return new c(a)};}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c=a.location.search.replace(/^\?/,"");if(b.env.params={},c){ for(var d=c.split("&"),e=0;e<d.length;e++){d[e]=d[e].split("=");try{b.env.params[d[e][0]]=decodeURIComponent(d[e][1]);}catch(f){b.env.params[d[e][0]]=d[e][1];}} }}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c,d=a.navigator.userAgent;if(c=d.match(/Windows\sPhone\s(?:OS\s)?([\d\.]+)/)){ b.env.os={name:"Windows Phone",isWindowsPhone:!0,version:c[1]}; }else if(d.match(/Safari/)&&(c=d.match(/Android[\s\/]([\d\.]+)/))){ b.env.os={version:c[1]},d.match(/Mobile\s+Safari/)?(b.env.os.name="Android",b.env.os.isAndroid=!0):(b.env.os.name="AndroidPad",b.env.os.isAndroidPad=!0); }else if(c=d.match(/(iPhone|iPad|iPod)/)){var e=c[1];c=d.match(/OS ([\d_\.]+) like Mac OS X/),b.env.os={name:e,isIPhone:"iPhone"===e||"iPod"===e,isIPad:"iPad"===e,isIOS:!0,version:c[1].split("_").join(".")};}else { b.env.os={name:"unknown",version:"0.0.0"}; }b.version&&(b.env.os.version=b.version(b.env.os.version));}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c,d=a.navigator.userAgent;(c=d.match(/(?:UCWEB|UCBrowser\/)([\d\.]+)/))?b.env.browser={name:"UC",isUC:!0,version:c[1]}:(c=d.match(/MQQBrowser\/([\d\.]+)/))?b.env.browser={name:"QQ",isQQ:!0,version:c[1]}:(c=d.match(/Firefox\/([\d\.]+)/))?b.env.browser={name:"Firefox",isFirefox:!0,version:c[1]}:(c=d.match(/MSIE\s([\d\.]+)/))||(c=d.match(/IEMobile\/([\d\.]+)/))?(b.env.browser={version:c[1]},d.match(/IEMobile/)?(b.env.browser.name="IEMobile",b.env.browser.isIEMobile=!0):(b.env.browser.name="IE",b.env.browser.isIE=!0),d.match(/Android|iPhone/)&&(b.env.browser.isIELikeWebkit=!0)):(c=d.match(/(?:Chrome|CriOS)\/([\d\.]+)/))?(b.env.browser={name:"Chrome",isChrome:!0,version:c[1]},d.match(/Version\/[\d+\.]+\s*Chrome/)&&(b.env.browser.name="Chrome Webview",b.env.browser.isWebview=!0)):d.match(/Safari/)&&(c=d.match(/Android[\s\/]([\d\.]+)/))?b.env.browser={name:"Android",isAndroid:!0,version:c[1]}:d.match(/iPhone|iPad|iPod/)?d.match(/Safari/)?(c=d.match(/Version\/([\d\.]+)/),b.env.browser={name:"Safari",isSafari:!0,version:c[1]}):(c=d.match(/OS ([\d_\.]+) like Mac OS X/),b.env.browser={name:"iOS Webview",isWebview:!0,version:c[1].replace(/\_/g,".")}):b.env.browser={name:"unknown",version:"0.0.0"},b.version&&(b.env.browser.version=b.version(b.env.browser.version));}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c=a.navigator.userAgent;c.match(/Weibo/i)?b.env.thirdapp={appname:"Weibo",isWeibo:!0}:c.match(/MicroMessenger/i)?b.env.thirdapp={appname:"Weixin",isWeixin:!0}:b.env.thirdapp=!1;}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c,d,e=a.navigator.userAgent;(d=e.match(/WindVane[\/\s]([\d\.\_]+)/))&&(c=d[1]);var f=!1,g="",h="",i="";(d=e.match(/AliApp\(([A-Z\-]+)\/([\d\.]+)\)/i))&&(f=!0,g=d[1],i=d[2],h=g.indexOf("-PD")>0?b.env.os.isIOS?"iPad":b.env.os.isAndroid?"AndroidPad":b.env.os.name:b.env.os.name),!g&&e.indexOf("TBIOS")>0&&(g="TB"),f?b.env.aliapp={windvane:b.version(c||"0.0.0"),appname:g||"unkown",version:b.version(i||"0.0.0"),platform:h||b.env.os.name}:b.env.aliapp=!1,b.env.taobaoApp=b.env.aliapp;}(window,window.lib||(window.lib={})); |
| |
| (typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a){var b={};Object.defineProperty(this,"params",{set:function(a){if("object"==typeof a){for(var c in b){ delete b[c]; }for(var c in a){ b[c]=a[c]; }}},get:function(){return b},enumerable:!0}),Object.defineProperty(this,"search",{set:function(a){if("string"==typeof a){0===a.indexOf("?")&&(a=a.substr(1));var c=a.split("&");for(var d in b){ delete b[d]; }for(var e=0;e<c.length;e++){var f=c[e].split("=");if(void 0!==f[1]&&(f[1]=f[1].toString()),f[0]){ try{b[decodeURIComponent(f[0])]=decodeURIComponent(f[1]);}catch(g){b[f[0]]=f[1];} }}}},get:function(){var a=[];for(var c in b){ if(void 0!==b[c]){ if(""!==b[c]){ try{a.push(encodeURIComponent(c)+"="+encodeURIComponent(b[c]));}catch(d){a.push(c+"="+b[c]);} }else { try{a.push(encodeURIComponent(c));}catch(d){a.push(c);} } } }return a.length?"?"+a.join("&"):""},enumerable:!0});var c;Object.defineProperty(this,"hash",{set:function(a){"string"==typeof a&&(a&&a.indexOf("#")<0&&(a="#"+a),c=a||"");},get:function(){return c},enumerable:!0}),this.set=function(a){a=a||"";var b;if(!(b=a.match(new RegExp("^([a-z0-9-]+:)?[/]{2}(?:([^@/:?]+)(?::([^@/:]+))?@)?([^:/?#]+)(?:[:]([0-9]+))?([/][^?#;]*)?(?:[?]([^#]*))?([#][^?]*)?$","i")))){ throw new Error("Wrong uri scheme."); }this.protocol=b[1]||("object"==typeof location?location.protocol:""),this.username=b[2]||"",this.password=b[3]||"",this.hostname=this.host=b[4],this.port=b[5]||"",this.pathname=b[6]||"/",this.search=b[7]||"",this.hash=b[8]||"",this.origin=this.protocol+"//"+this.hostname;},this.toString=function(){var a=this.protocol+"//";return this.username&&(a+=this.username,this.password&&(a+=":"+this.password),a+="@"),a+=this.host,this.port&&"80"!==this.port&&(a+=":"+this.port),this.pathname&&(a+=this.pathname),this.search&&(a+=this.search),this.hash&&(a+=this.hash),a},a&&this.set(a.toString());}b.httpurl=function(a){return new c(a)};}(window,window.lib||(window.lib={})); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* eslint-disable */ |
| |
| var isInitialized = false; |
| |
| // major events supported: |
| // panstart |
| // panmove |
| // panend |
| // swipe |
| // longpress |
| // extra events supported: |
| // dualtouchstart |
| // dualtouch |
| // dualtouchend |
| // tap |
| // doubletap |
| // pressend |
| |
| var doc = window.document; |
| var docEl = doc.documentElement; |
| var slice$1 = Array.prototype.slice; |
| var gestures = {}; |
| var lastTap = null; |
| |
| /** |
| * find the closest common ancestor |
| * if there's no one, return null |
| * |
| * @param {Element} el1 first element |
| * @param {Element} el2 second element |
| * @return {Element} common ancestor |
| */ |
| function getCommonAncestor(el1, el2) { |
| var el = el1; |
| while (el) { |
| if (el.contains(el2) || el == el2) { |
| return el |
| } |
| el = el.parentNode; |
| } |
| return null |
| } |
| |
| /** |
| * fire a HTMLEvent |
| * |
| * @param {Element} element which element to fire a event on |
| * @param {string} type type of event |
| * @param {object} extra extra data for the event object |
| */ |
| function fireEvent$2(element, type, extra) { |
| var event = doc.createEvent('HTMLEvents'); |
| event.initEvent(type, true, true); |
| |
| if (typeof extra === 'object') { |
| for (var p in extra) { |
| event[p] = extra[p]; |
| } |
| } |
| |
| element.dispatchEvent(event); |
| } |
| |
| /** |
| * calc the transform |
| * assume 4 points ABCD on the coordinate system |
| * > rotate:angle rotating from AB to CD |
| * > scale:scale ratio from AB to CD |
| * > translate:translate shift from A to C |
| * |
| * @param {number} x1 abscissa of A |
| * @param {number} y1 ordinate of A |
| * @param {number} x2 abscissa of B |
| * @param {number} y2 ordinate of B |
| * @param {number} x3 abscissa of C |
| * @param {number} y3 ordinate of C |
| * @param {number} x4 abscissa of D |
| * @param {number} y4 ordinate of D |
| * @return {object} transform object like |
| * {rotate, scale, translate[2], matrix[3][3]} |
| */ |
| function calc(x1, y1, x2, y2, x3, y3, x4, y4) { |
| var rotate = Math.atan2(y4 - y3, x4 - x3) - Math.atan2(y2 - y1, x2 - x1); |
| var scale = Math.sqrt((Math.pow(y4 - y3, 2) |
| + Math.pow(x4 - x3, 2)) / (Math.pow(y2 - y1, 2) |
| + Math.pow(x2 - x1, 2))); |
| var translate = [ |
| x3 |
| - scale * x1 * Math.cos(rotate) |
| + scale * y1 * Math.sin(rotate), |
| y3 |
| - scale * y1 * Math.cos(rotate) |
| - scale * x1 * Math.sin(rotate)]; |
| |
| return { |
| rotate: rotate, |
| scale: scale, |
| translate: translate, |
| matrix: [ |
| [scale * Math.cos(rotate), -scale * Math.sin(rotate), translate[0]], |
| [scale * Math.sin(rotate), scale * Math.cos(rotate), translate[1]], |
| [0, 0, 1] |
| ] |
| } |
| } |
| |
| /** |
| * take over the touchstart events. Add new touches to the gestures. |
| * If there is no previous records, then bind touchmove, tochend |
| * and touchcancel events. |
| * new touches initialized with state 'tapping', and within 500 milliseconds |
| * if the state is still tapping, then trigger gesture 'press'. |
| * If there are two touche points, then the 'dualtouchstart' is triggerd. The |
| * node of the touch gesture is their cloest common ancestor. |
| * |
| * @event |
| * @param {event} event |
| */ |
| function touchstartHandler(event) { |
| |
| if (Object.keys(gestures).length === 0) { |
| docEl.addEventListener('touchmove', touchmoveHandler, false); |
| docEl.addEventListener('touchend', touchendHandler, false); |
| docEl.addEventListener('touchcancel', touchcancelHandler, false); |
| } |
| |
| // record every touch |
| for (var i = 0; i < event.changedTouches.length; i++) { |
| var touch = event.changedTouches[i]; |
| var touchRecord = {}; |
| |
| for (var p in touch) { |
| touchRecord[p] = touch[p]; |
| } |
| |
| var gesture = { |
| startTouch: touchRecord, |
| startTime: Date.now(), |
| status: 'tapping', |
| element: event.srcElement || event.target, |
| pressingHandler: setTimeout(function (element, touch) { |
| return function () { |
| if (gesture.status === 'tapping') { |
| gesture.status = 'pressing'; |
| |
| fireEvent$2(element, 'longpress', { |
| // add touch data for weex |
| touch: touch, |
| touches: event.touches, |
| changedTouches: event.changedTouches, |
| touchEvent: event |
| }); |
| } |
| |
| clearTimeout(gesture.pressingHandler); |
| gesture.pressingHandler = null; |
| } |
| }(event.srcElement || event.target, event.changedTouches[i]), 500) |
| }; |
| gestures[touch.identifier] = gesture; |
| } |
| |
| if (Object.keys(gestures).length == 2) { |
| var elements = []; |
| |
| for (var p in gestures) { |
| elements.push(gestures[p].element); |
| } |
| |
| fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouchstart', { |
| touches: slice$1.call(event.touches), |
| touchEvent: event |
| }); |
| } |
| } |
| |
| /** |
| * take over touchmove events, and handle pan and dual related gestures. |
| * |
| * 1. traverse every touch point: |
| * > if 'tapping' and the shift is over 10 pixles, then it's a 'panning'. |
| * 2. if there are two touch points, then calc the tranform and trigger |
| * 'dualtouch'. |
| * |
| * @event |
| * @param {event} event |
| */ |
| function touchmoveHandler(event) { |
| for (var i = 0; i < event.changedTouches.length; i++) { |
| var touch = event.changedTouches[i]; |
| var gesture = gestures[touch.identifier]; |
| |
| if (!gesture) { |
| return |
| } |
| |
| if (!gesture.lastTouch) { |
| gesture.lastTouch = gesture.startTouch; |
| } |
| if (!gesture.lastTime) { |
| gesture.lastTime = gesture.startTime; |
| } |
| if (!gesture.velocityX) { |
| gesture.velocityX = 0; |
| } |
| if (!gesture.velocityY) { |
| gesture.velocityY = 0; |
| } |
| if (!gesture.duration) { |
| gesture.duration = 0; |
| } |
| |
| var time = Date.now() - gesture.lastTime; |
| var vx = (touch.clientX - gesture.lastTouch.clientX) / time; |
| var vy = (touch.clientY - gesture.lastTouch.clientY) / time; |
| |
| var RECORD_DURATION = 70; |
| if (time > RECORD_DURATION) { |
| time = RECORD_DURATION; |
| } |
| if (gesture.duration + time > RECORD_DURATION) { |
| gesture.duration = RECORD_DURATION - time; |
| } |
| |
| gesture.velocityX = (gesture.velocityX * gesture.duration + vx * time) |
| / (gesture.duration + time); |
| gesture.velocityY = (gesture.velocityY * gesture.duration + vy * time) |
| / (gesture.duration + time); |
| gesture.duration += time; |
| |
| gesture.lastTouch = {}; |
| |
| for (var p in touch) { |
| gesture.lastTouch[p] = touch[p]; |
| } |
| gesture.lastTime = Date.now(); |
| |
| var displacementX = touch.clientX - gesture.startTouch.clientX; |
| var displacementY = touch.clientY - gesture.startTouch.clientY; |
| var distance = Math.sqrt(Math.pow(displacementX, 2) |
| + Math.pow(displacementY, 2)); |
| var isVertical = !(Math.abs(displacementX) > Math.abs(displacementY)); |
| var direction = isVertical |
| ? displacementY >= 0 ? 'down' : 'up' |
| : displacementX >= 0 ? 'right' : 'left'; |
| |
| // magic number 10: moving 10px means pan, not tap |
| if ((gesture.status === 'tapping' || gesture.status === 'pressing') |
| && distance > 10) { |
| gesture.status = 'panning'; |
| gesture.isVertical = isVertical; |
| gesture.direction = direction; |
| |
| fireEvent$2(gesture.element, 'panstart', { |
| touch: touch, |
| touches: event.touches, |
| changedTouches: event.changedTouches, |
| touchEvent: event, |
| isVertical: gesture.isVertical, |
| direction: direction |
| }); |
| } |
| |
| if (gesture.status === 'panning') { |
| gesture.panTime = Date.now(); |
| |
| fireEvent$2(gesture.element, 'panmove', { |
| displacementX: displacementX, |
| displacementY: displacementY, |
| touch: touch, |
| touches: event.touches, |
| changedTouches: event.changedTouches, |
| touchEvent: event, |
| isVertical: gesture.isVertical, |
| direction: direction |
| }); |
| } |
| } |
| |
| if (Object.keys(gestures).length == 2) { |
| var position = []; |
| var current = []; |
| var elements = []; |
| var transform; |
| |
| for (var i = 0; i < event.touches.length; i++) { |
| var touch = event.touches[i]; |
| var gesture = gestures[touch.identifier]; |
| position.push([gesture.startTouch.clientX, gesture.startTouch.clientY]); |
| current.push([touch.clientX, touch.clientY]); |
| } |
| |
| for (var p in gestures) { |
| elements.push(gestures[p].element); |
| } |
| |
| transform = calc( |
| position[0][0], |
| position[0][1], |
| position[1][0], |
| position[1][1], |
| current[0][0], |
| current[0][1], |
| current[1][0], |
| current[1][1] |
| ); |
| fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouch', { |
| transform: transform, |
| touches: event.touches, |
| touchEvent: event |
| }); |
| } |
| } |
| |
| /** |
| * handle touchend event |
| * |
| * 1. if there are tow touch points, then trigger 'dualtouchend'如 |
| * |
| * 2. traverse every touch piont: |
| * > if tapping, then trigger 'tap'. |
| * If there is a tap 300 milliseconds before, then it's a 'doubletap'. |
| * > if padding, then decide to trigger 'panend' or 'swipe' |
| * > if pressing, then trigger 'pressend'. |
| * |
| * 3. remove listeners. |
| * |
| * @event |
| * @param {event} event |
| */ |
| function touchendHandler(event) { |
| |
| if (Object.keys(gestures).length == 2) { |
| var elements = []; |
| for (var p in gestures) { |
| elements.push(gestures[p].element); |
| } |
| fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', { |
| touches: slice$1.call(event.touches), |
| touchEvent: event |
| }); |
| } |
| |
| for (var i = 0; i < event.changedTouches.length; i++) { |
| var touch = event.changedTouches[i]; |
| var id = touch.identifier; |
| var gesture = gestures[id]; |
| |
| if (!gesture) { |
| continue |
| } |
| |
| if (gesture.pressingHandler) { |
| clearTimeout(gesture.pressingHandler); |
| gesture.pressingHandler = null; |
| } |
| |
| if (gesture.status === 'tapping') { |
| gesture.timestamp = Date.now(); |
| fireEvent$2(gesture.element, 'tap', { |
| touch: touch, |
| touchEvent: event |
| }); |
| |
| if (lastTap && gesture.timestamp - lastTap.timestamp < 300) { |
| fireEvent$2(gesture.element, 'doubletap', { |
| touch: touch, |
| touchEvent: event |
| }); |
| } |
| |
| lastTap = gesture; |
| } |
| |
| if (gesture.status === 'panning') { |
| var now = Date.now(); |
| var duration = now - gesture.startTime; |
| var displacementX = touch.clientX - gesture.startTouch.clientX; |
| var displacementY = touch.clientY - gesture.startTouch.clientY; |
| |
| var velocity = Math.sqrt(gesture.velocityY * gesture.velocityY |
| + gesture.velocityX * gesture.velocityX); |
| var isSwipe = velocity > 0.5 && (now - gesture.lastTime) < 100; |
| var extra = { |
| duration: duration, |
| isSwipe: isSwipe, |
| velocityX: gesture.velocityX, |
| velocityY: gesture.velocityY, |
| displacementX: displacementX, |
| displacementY: displacementY, |
| touch: touch, |
| touches: event.touches, |
| changedTouches: event.changedTouches, |
| touchEvent: event, |
| isVertical: gesture.isVertical, |
| direction: gesture.direction |
| }; |
| |
| fireEvent$2(gesture.element, 'panend', extra); |
| if (isSwipe) { |
| fireEvent$2(gesture.element, 'swipe', extra); |
| } |
| } |
| |
| if (gesture.status === 'pressing') { |
| fireEvent$2(gesture.element, 'pressend', { |
| touch: touch, |
| touchEvent: event |
| }); |
| } |
| |
| delete gestures[id]; |
| } |
| |
| if (Object.keys(gestures).length === 0) { |
| docEl.removeEventListener('touchmove', touchmoveHandler, false); |
| docEl.removeEventListener('touchend', touchendHandler, false); |
| docEl.removeEventListener('touchcancel', touchcancelHandler, false); |
| } |
| } |
| |
| /** |
| * handle touchcancel |
| * |
| * 1. if there are two touch points, then trigger 'dualtouchend' |
| * |
| * 2. traverse everty touch point: |
| * > if pannnig, then trigger 'panend' |
| * > if pressing, then trigger 'pressend' |
| * |
| * 3. remove listeners |
| * |
| * @event |
| * @param {event} event |
| */ |
| function touchcancelHandler(event) { |
| |
| if (Object.keys(gestures).length == 2) { |
| var elements = []; |
| for (var p in gestures) { |
| elements.push(gestures[p].element); |
| } |
| fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', { |
| touches: slice$1.call(event.touches), |
| touchEvent: event |
| }); |
| } |
| |
| for (var i = 0; i < event.changedTouches.length; i++) { |
| var touch = event.changedTouches[i]; |
| var id = touch.identifier; |
| var gesture = gestures[id]; |
| |
| if (!gesture) { |
| continue |
| } |
| |
| if (gesture.pressingHandler) { |
| clearTimeout(gesture.pressingHandler); |
| gesture.pressingHandler = null; |
| } |
| |
| if (gesture.status === 'panning') { |
| fireEvent$2(gesture.element, 'panend', { |
| touch: touch, |
| touches: event.touches, |
| changedTouches: event.changedTouches, |
| touchEvent: event |
| }); |
| } |
| if (gesture.status === 'pressing') { |
| fireEvent$2(gesture.element, 'pressend', { |
| touch: touch, |
| touchEvent: event |
| }); |
| } |
| delete gestures[id]; |
| } |
| |
| if (Object.keys(gestures).length === 0) { |
| docEl.removeEventListener('touchmove', touchmoveHandler, false); |
| docEl.removeEventListener('touchend', touchendHandler, false); |
| docEl.removeEventListener('touchcancel', touchcancelHandler, false); |
| } |
| } |
| |
| if (!isInitialized) { |
| docEl.addEventListener('touchstart', touchstartHandler, false); |
| isInitialized = true; |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /* global lib, WebSocket */ |
| |
| runtime.config.frameworks = frameworks$1; |
| var framework = subversion.framework; |
| var transformer = subversion.transformer; |
| |
| // register framework meta info |
| global.frameworkVersion = framework; |
| global.transformerVersion = transformer; |
| |
| // init bridge. |
| receiver.init(); |
| |
| // init frameworks |
| runtime.config.Document.Listener = ComponentManager; |
| var globalMethods = runtime.init(runtime.config); |
| |
| // set global methods |
| var loop$1 = function ( methodName ) { |
| global[methodName] = function () { |
| var args = [], len = arguments.length; |
| while ( len-- ) args[ len ] = arguments[ len ]; |
| |
| var ret = globalMethods[methodName].apply(globalMethods, args); |
| if (ret instanceof Error) { |
| console.error(ret.toString()); |
| } |
| return ret |
| }; |
| }; |
| |
| for (var methodName in globalMethods) loop$1( methodName ); |
| |
| // gesture |
| var DEFAULT_DESIGN_WIDTH = 750; |
| var DEFAULT_ROOT_ID = 'weex'; |
| var DEFAULT_JSONP_CALLBACK_NAME = 'weexJsonpCallback'; |
| |
| global.WXEnvironment = { |
| weexVersion: config$4.weexVersion, |
| appName: lib.env.aliapp ? lib.env.aliapp.appname : null, |
| appVersion: lib.env.aliapp ? lib.env.aliapp.version.val : null, |
| platform: 'Web', |
| osName: lib.env.browser ? lib.env.browser.name : null, |
| osVersion: lib.env.browser ? lib.env.browser.version.val : null, |
| deviceWidth: window.innerWidth, |
| deviceHeight: window.innerHeight, |
| devicePixelRatio: window.devicePixelRatio ? window.devicePixelRatio : (window.screen.width >= 1440 ? 3.5 : (window.screen.width >= 1080 ? 3 : (window.screen.width >= 800 ? 2.5 : (window.screen.width >= 640 ? 2 : (window.screen.width >= 480 ? 1.5 : 1))))) |
| }; |
| |
| var _weexInstance = {}; |
| |
| function noop () {} |
| |
| function setupViewport (width) { |
| document.querySelector('meta[name=viewport]').setAttribute('content', ("width=" + width + ", user-scalable=no")); |
| } |
| |
| (function initializeWithUrlParams () { |
| // in casperjs the protocol is file. |
| if (location.protocol.match(/file/)) { |
| return |
| } |
| |
| var params = lib.httpurl(location.href).params; |
| |
| // set global 'debug' config to true if there's a debug flag in current url. |
| var debug = params['debug']; |
| config$4.debug = debug === true || debug === 'true'; |
| |
| !config$4.debug && (console.debug = noop); |
| |
| // config for the 'downgrade'. |
| for (var key in params) { |
| if (params.hasOwnProperty(key)) { |
| var match = key.match(/^downgrade_(\w+)$/); |
| if (!match || !match[1]) { |
| continue |
| } |
| var dk = match[1]; |
| // downgrade in the config file has the highest priority. |
| if (typeof config$4.downgrade[dk] === 'boolean') { |
| continue |
| } |
| var dr = params[("downgrade_" + dk)]; |
| config$4.downgrade[dk] = dr === true || dr === 'true'; |
| } |
| } |
| })(); |
| |
| function Weex$1 (options) { |
| if (!(this instanceof Weex$1)) { |
| return new Weex$1(options) |
| } |
| |
| // Width of the root container. Default is window.innerWidth. |
| this.width = options.width || window.innerWidth; |
| this.bundleUrl = options.bundleUrl || location.href; |
| this.instanceId = options.appId; |
| this.rootId = options.rootId || (DEFAULT_ROOT_ID + getRandom(10)); |
| this.jsonpCallback = options.jsonpCallback || DEFAULT_JSONP_CALLBACK_NAME; |
| this.source = options.source; |
| this.loader = options.loader; |
| this.embed = options.embed; |
| |
| // init viewport |
| setupViewport(DEFAULT_DESIGN_WIDTH); |
| |
| // downgrade options. |
| var dg = options.downgrade || []; |
| dg.forEach(function (comp) { |
| config$4.downgrade[comp] = true; |
| }); |
| |
| this.data = options.data; |
| this.sender = new Sender(this); |
| |
| _weexInstance[this.instanceId] = this; |
| |
| // load bundle. |
| load({ |
| jsonpCallback: this.jsonpCallback, |
| source: this.source, |
| loader: this.loader |
| }, function (err, appCode) { |
| if (!err) { |
| this.createApp(config$4, appCode); |
| } |
| else { |
| console.error('load bundle err:', err); |
| } |
| }.bind(this)); |
| } |
| |
| Weex$1.init = function (options) { |
| if (isArray(options)) { |
| options.forEach(function (config) { |
| new Weex$1(config); |
| }); |
| } |
| else if (getType(options) === 'object') { |
| new Weex$1(options); |
| } |
| }; |
| |
| Weex$1.getInstance = function (instanceId) { |
| return _weexInstance[instanceId] |
| }; |
| |
| Weex$1.prototype = { |
| |
| createApp: function (config, appCode) { |
| var root = document.querySelector('#' + this.rootId); |
| if (!root) { |
| root = document.createElement('div'); |
| root.id = this.rootId; |
| document.body.appendChild(root); |
| } |
| |
| var instance = window.createInstance( |
| this.instanceId, |
| appCode, |
| { |
| bundleUrl: this.bundleUrl, |
| debug: config.debug |
| }, |
| this.data |
| ); |
| |
| if (instance instanceof Error) { |
| return console.error('[h5-render]', instance) |
| } |
| |
| // Do not destroy instance before unload, because in most browser |
| // press back button to back to this page will not refresh |
| // the window and the instance will not be recreated then. |
| // window.addEventListener('beforeunload', function (e) { |
| // }) |
| }, |
| |
| getComponentManager: function () { |
| if (!this._componentManager) { |
| this._componentManager = ComponentManager.getInstance(this.instanceId); |
| } |
| return this._componentManager |
| }, |
| |
| getRoot: function () { |
| return document.querySelector('#' + this.rootId) |
| } |
| }; |
| |
| Weex$1.stopTheWorld = function (instanceId) { |
| if (!instanceId) { |
| return Object.keys(_weexInstance).map(function (instanceId) { |
| Weex$1.stopTheWorld(instanceId); |
| }) |
| } |
| window.destroyInstance(instanceId); |
| } |
| |
| // for weex-toolkit. |
| ; (function startRefreshController () { |
| if (location.protocol.match(/file/)) { |
| return |
| } |
| if (location.search.indexOf('hot-reload_controller') === -1) { |
| return |
| } |
| if (typeof WebSocket === 'undefined') { |
| console.info('auto refresh need WebSocket support'); |
| return |
| } |
| var host = location.hostname; |
| var port = 8082; |
| var client = new WebSocket('ws://' + host + ':' + port + '/', |
| 'echo-protocol' |
| ); |
| client.onerror = function () { |
| console.log('refresh controller websocket connection error'); |
| }; |
| client.onmessage = function (e) { |
| console.log('Received: \'' + e.data + '\''); |
| if (e.data === 'refresh') { |
| location.reload(); |
| } |
| }; |
| })(); |
| |
| bind$1(Weex$1); |
| |
| extend(Weex$1, { |
| Component: Component, |
| Atomic: Atomic, |
| ComponentManager: ComponentManager, |
| utils: utils, |
| config: config$4 |
| }); |
| |
| global.weex = Weex$1; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function init$7 (Weex) { |
| var Component = Weex.Component; |
| |
| function RootComponent (data, nodeType) { |
| var id = data.rootId + '-root'; |
| var ct = document.querySelector(("#" + (data.rootId))); |
| var cm = ComponentManager.getInstance(data.instanceId); |
| |
| this.data = data; |
| |
| ct.classList.add('weex-container'); |
| if (!data.style.height && !data.style.flex) { |
| // if no specification on root's height, then |
| // fill root container with the root element by full scale. |
| data.style.flex = 1; |
| } |
| |
| // The root component should be implemented as a div component, as the scrollable |
| // components have performance issue compare to the original body scroll. |
| if (!nodeType) { |
| console.warn("[h5-render] no nodeType is specified, construct Root use 'droot' by default."); |
| nodeType = 'droot'; |
| } |
| else if (config$4.validRoots.indexOf(nodeType) === -1) { |
| console.warn(("[h5-render] the root component type '" + nodeType + "' is not one of\nthe types in [" + (config$4.validRoots) + "] list. It is auto downgraded\nto 'droot'.")); |
| nodeType = 'droot'; |
| } |
| else if (config$4.downgrade.root) { |
| console.warn("[h5-render] the root is downgrade to 'droot' due to the downgrade\nconfiguration of weex."); |
| nodeType = 'droot'; |
| } |
| |
| data.type = nodeType; |
| var cmp = cm.createElement(data); |
| cmp.node.id = id; |
| return cmp |
| } |
| |
| RootComponent.prototype = Object.create(Component.prototype); |
| |
| Weex.registerComponent('root', RootComponent); |
| } |
| |
| var root = { init: init$7 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function init$8 (Weex) { |
| var Component = Weex.Component; |
| |
| function Div (data, nodeType) { |
| Component.call(this, data, nodeType); |
| this.node.classList.add('weex-container'); |
| } |
| Div.prototype = Object.create(Component.prototype); |
| |
| Weex.registerComponent('div', Div); |
| Weex.registerComponent('container', Div); |
| } |
| |
| var div = { init: init$8 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var DEFAULT_LOAD_MORE_OFFSET = 0; |
| var Component$1; |
| |
| var proto$1 = { |
| create: function create (nodeType) { |
| var node = document.createElement(nodeType || 'div'); |
| node.classList.add('weex-droot'); |
| node.classList.add('weex-container'); |
| return node |
| }, |
| |
| bindEvents: function bindEvents (evts) { |
| Component$1.prototype.bindEvents.call(this, evts); |
| window.addEventListener('scroll', function (e) { |
| // fire loadmore event. |
| var body = document.body; |
| var leftDist = body.scrollHeight - window.innerHeight - body.scrollTop; |
| if (leftDist <= this.loadmoreoffset && this.isAvailableToFireloadmore) { |
| this.isAvailableToFireloadmore = false; |
| this.dispatchEvent('loadmore'); |
| } |
| else if (leftDist > this.loadmoreoffset && !this.isAvailableToFireloadmore) { |
| this.isAvailableToFireloadmore = true; |
| } |
| }.bind(this)); |
| } |
| }; |
| |
| var attr = { |
| loadmoreoffset: function loadmoreoffset (val) { |
| var value = parseFloat(val); |
| if (value < 0 || isNaN(value)) { |
| console.warn(("[h5-render] invalid loadmoreoffset: " + val)); |
| return |
| } |
| this.loadmoreoffset = value; |
| } |
| }; |
| |
| function init$9 (Weex) { |
| Component$1 = Weex.Component; |
| var extend = Weex.utils.extend; |
| |
| function Droot (data, nodeType) { |
| if (data.ref !== '_root') { |
| return console.warn('[h5-render] droot can only be used as a downgraded root.') |
| } |
| this.loadmoreoffset = DEFAULT_LOAD_MORE_OFFSET; |
| this.isAvailableToFireloadmore = true; |
| Component$1.call(this, data, nodeType); |
| } |
| Droot.prototype = Object.create(Component$1.prototype); |
| extend(Droot.prototype, proto$1); |
| extend(Droot.prototype, { attr: attr }); |
| |
| Weex.registerComponent('droot', Droot); |
| } |
| |
| var droot = { init: init$9 }; |
| |
| __$styleInject(".weex-img {\n background-repeat: no-repeat;\n background-size: 100% 100%;\n background-position: 50%;\n}",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global lib */ |
| |
| var DEFAULT_SIZE = 200; |
| var RESIZE_MODES = ['stretch', 'cover', 'contain']; |
| var DEFAULT_RESIZE_MODE = 'stretch'; |
| |
| var Atomic$1; |
| |
| /** |
| * resize: 'cover' | 'contain' | 'stretch', default is 'stretch' |
| * src: url |
| * placeholder / place-holder: url |
| */ |
| var proto$2 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('weex-img'); |
| node.classList.add('weex-element'); |
| return node |
| }, |
| |
| clearAttr: function clearAttr () { |
| this.src = ''; |
| this.node.style.backgroundImage = ''; |
| } |
| }; |
| |
| var attr$1 = { |
| src: function (val) { |
| if (!this.src) { |
| this.src = lib.img.defaultSrc; |
| this.node.style.backgroundImage = 'url(' + this.src + ')'; |
| } |
| this.enableLazyload(val); |
| }, |
| |
| placeholder: function (val) { |
| this.node.dataset.placeholder = val; |
| }, |
| |
| // alias for placeholder (place-holder) |
| placeHolder: function (val) { |
| return this.attr.placeholder.call(this, val) |
| }, |
| |
| resize: function (val) { |
| if (RESIZE_MODES.indexOf(val) === -1) { |
| val = 'stretch'; |
| } |
| this.node.style.backgroundSize = val === 'stretch' |
| ? '100% 100%' |
| : val; |
| } |
| }; |
| |
| var style$1 = { |
| width: function (val) { |
| val = parseFloat(val); |
| if (val < 0 || isNaN(val)) { |
| val = DEFAULT_SIZE; |
| } |
| this.node.style.width = val + 'px'; |
| }, |
| |
| height: function (val) { |
| val = parseFloat(val); |
| if (val < 0 || isNaN(val)) { |
| val = DEFAULT_SIZE; |
| } |
| this.node.style.height = val + 'px'; |
| } |
| }; |
| |
| var event = { |
| load: { |
| extra: function () { |
| var ref = this.node; |
| var naturalWidth = ref.naturalWidth; |
| var naturalHeight = ref.naturalHeight; |
| return { |
| naturalWidth: naturalWidth, naturalHeight: naturalHeight |
| } |
| } |
| } |
| }; |
| |
| function init$10 (Weex) { |
| Atomic$1 = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| |
| function Image (data) { |
| this.resize = DEFAULT_RESIZE_MODE; |
| Atomic$1.call(this, data); |
| } |
| Image.prototype = Object.create(Atomic$1.prototype); |
| extend(Image.prototype, proto$2); |
| extend(Image.prototype, { attr: attr$1 }); |
| extend(Image.prototype, { |
| style: extend(Object.create(Atomic$1.prototype.style), style$1) |
| }); |
| extend(Image.prototype, { event: event }); |
| |
| Weex.registerComponent('image', Image); |
| } |
| |
| var Image$1 = { init: init$10 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var DEFAULT_FONT_SIZE = 32; |
| var DEFAULT_TEXT_OVERFLOW = 'ellipsis'; |
| |
| var proto$3 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('weex-container'); |
| node.style.fontSize = DEFAULT_FONT_SIZE + 'px'; |
| this.textNode = document.createElement('span'); |
| // Give the developers the ability to control space |
| // and line-breakers. |
| this.textNode.style.whiteSpace = 'pre-wrap'; |
| this.textNode.style.wordWrap = 'break-word'; |
| this.textNode.style.display = '-webkit-box'; |
| this.textNode.style.webkitBoxOrient = 'vertical'; |
| this.style.lines.call(this, (this.data.style || {}).lines); |
| node.appendChild(this.textNode); |
| return node |
| }, |
| |
| clearAttr: function clearAttr () { |
| this.node.firstChild.textContent = ''; |
| } |
| }; |
| |
| var attr$2 = { |
| value: function (value) { |
| var span = this.node.firstChild; |
| span.innerHTML = ''; |
| if (value == null || value === '') { |
| return |
| } |
| span.textContent = value; |
| /** |
| * Developers are supposed to have the ability to break text |
| * lines manually. Using `` `` to replace text space is |
| * not compatible with the ``-webkit-line-clamp``. Therefor |
| * we use ``white-space: no-wrap`` instead (instead of the |
| * code bellow). |
| |
| const frag = document.createDocumentFragment() |
| text.split(' ').forEach(function(str) { |
| const textNode = document.createTextNode(str) |
| const space = document.createElement('i') |
| space.innerHTML = ' ' |
| frag.appendChild(space) |
| frag.appendChild(textNode) |
| }) |
| frag.removeChild(frag.firstChild) |
| span.appendChild(document.createElement('br')) |
| span.appendChild(frag) |
| }) |
| span.removeChild(span.firstChild) |
| */ |
| } |
| }; |
| |
| var style$2 = { |
| lines: function (val) { |
| val = parseInt(val); |
| if (isNaN(val)) { |
| return |
| } |
| if (val <= 0) { |
| this.textNode.style.textOverflow = ''; |
| this.textNode.style.overflow = 'visible'; |
| this.textNode.style.webkitLineClamp = ''; |
| } |
| else { |
| var style = this.data ? this.data.style : null; |
| this.textNode.style.overflow = 'hidden'; |
| this.textNode.style.textOverflow = style |
| ? style.textOverflow |
| : DEFAULT_TEXT_OVERFLOW; |
| this.textNode.style.webkitLineClamp = val; |
| } |
| }, |
| |
| textOverflow: function (val) { |
| this.textNode.style.textOverflow = val; |
| } |
| }; |
| |
| function init$11 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| |
| // attr |
| // - value: text content. |
| // style |
| // - lines: maximum lines of the text. |
| function Text (data) { |
| Atomic.call(this, data); |
| } |
| Text.prototype = Object.create(Atomic.prototype); |
| extend(Text.prototype, proto$3); |
| extend(Text.prototype, { attr: attr$2 }); |
| extend(Text.prototype, { |
| style: extend(Object.create(Atomic.prototype.style), style$2) |
| }); |
| |
| Weex.registerComponent('text', Text); |
| } |
| |
| var Text = { init: init$11 }; |
| |
| __$styleInject(".scrollable-wrap {\n display: block;\n overflow: hidden;\n}\n\n.scrollable-element.horizontal {\n -webkit-box-orient: horizontal;\n -webkit-flex-direction: row;\n flex-direction: row;\n}\n.scrollable-element.vertical {\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n}\n",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global lib: true */ |
| |
| /** |
| * transfer Quadratic Bezier Curve to Cubic Bezier Curve |
| * |
| * @param {number} a abscissa of p1 |
| * @param {number} b ordinate of p1 |
| * @return {Array} parameter matrix for cubic bezier curve |
| * like [[p1x, p1y], [p2x, p2y]] |
| */ |
| function quadratic2cubicBezier (a, b) { |
| return [ |
| [ |
| (a / 3 + (a + b) / 3 - a) / (b - a), |
| (a * a / 3 + a * b * 2 / 3 - a * a) / (b * b - a * a) |
| ], [ |
| (b / 3 + (a + b) / 3 - a) / (b - a), |
| (b * b / 3 + a * b * 2 / 3 - a * a) / (b * b - a * a) |
| ] |
| ] |
| } |
| |
| /** |
| * derive position data from knowing motion parameters |
| * base on Newton's second law: s = vt + at^2/2 |
| * |
| * @param {object} config object of { v, a, s, t } |
| * - v: initial velocity |
| * - a: accelerate speed |
| * - t: time |
| * - s: shifting |
| */ |
| function Motion (config) { |
| this.v = config.v || 0; |
| this.a = config.a || 0; |
| |
| if (typeof config.t !== 'undefined') { |
| this.t = config.t; |
| } |
| |
| if (typeof config.s !== 'undefined') { |
| this.s = config.s; |
| } |
| |
| // derive time from shifting |
| if (typeof this.t === 'undefined') { |
| if (typeof this.s === 'undefined') { |
| this.t = -this.v / this.a; |
| } |
| else { |
| var t1 = (Math.sqrt(this.v * this.v + 2 * this.a * this.s) - this.v) |
| / this.a; |
| var t2 = (-Math.sqrt(this.v * this.v + 2 * this.a * this.s) - this.v) |
| / this.a; |
| this.t = Math.min(t1, t2); |
| } |
| } |
| |
| // derive shifting from time |
| if (typeof this.s === 'undefined') { |
| this.s = this.a * this.t * this.t / 2 + this.v * this.t; |
| } |
| } |
| |
| /** |
| * derive cubic bezier parameters from motion parameters |
| * @return {Array} parameter matrix for cubic bezier curve |
| * like [[p1x, p1y], [p2x, p2y]] |
| */ |
| Motion.prototype.generateCubicBezier = function () { |
| return quadratic2cubicBezier( |
| this.v / this.a, this.t + this.v / this.a |
| ) |
| }; |
| |
| !lib && (lib = {}); |
| lib.motion = Motion; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* eslint-disable */ |
| |
| |
| var doc$1 = window.document; |
| var ua$1 = window.navigator.userAgent; |
| var scrollObjs = {}; |
| var plugins = {}; |
| var dpr = window.dpr |
| || (!!window.navigator.userAgent.match(/iPhone|iPad|iPod/) |
| ? document.documentElement.clientWidth / window.screen.availWidth |
| : 1); |
| var inertiaCoefficient = { |
| normal: [2 * dpr, 0.0015 * dpr], |
| slow: [1.5 * dpr, 0.003 * dpr], |
| veryslow: [1.5 * dpr, 0.005 * dpr] |
| }; |
| var Firefox = !!ua$1.match(/Firefox/i); |
| var IEMobile = !!ua$1.match(/IEMobile/i); |
| var cssPrefix$1 = Firefox ? '-moz-' : IEMobile ? '-ms-' : '-webkit-'; |
| var stylePrefix$1 = Firefox ? 'Moz' : IEMobile ? 'ms' : 'webkit'; |
| |
| function debugLog() { |
| if (lib.scroll.outputDebugLog) { |
| console.log.apply(console, arguments); |
| } |
| } |
| |
| function getBoundingClientRect(el) { |
| var rect = el.getBoundingClientRect(); |
| if (!rect) { |
| rect = {}; |
| rect.width = el.offsetWidth; |
| rect.height = el.offsetHeight; |
| |
| rect.left = el.offsetLeft; |
| rect.top = el.offsetTop; |
| var parent = el.offsetParent; |
| while (parent) { |
| rect.left += parent.offsetLeft; |
| rect.top += parent.offsetTop; |
| parent = parent.offsetParent; |
| } |
| |
| rect.right = rect.left + rect.width; |
| rect.bottom = rect.top + rect.height; |
| } |
| return rect |
| } |
| |
| function getMinScrollOffset(scrollObj) { |
| return 0 - scrollObj.options[scrollObj.axis + 'PaddingTop'] |
| } |
| |
| function getMaxScrollOffset(scrollObj) { |
| var rect = getBoundingClientRect(scrollObj.element); |
| var pRect = getBoundingClientRect(scrollObj.viewport); |
| var min = getMinScrollOffset(scrollObj); |
| if (scrollObj.axis === 'y') { |
| var max = 0 - rect.height + pRect.height; |
| } else { |
| var max = 0 - rect.width + pRect.width; |
| } |
| return Math.min( |
| max + scrollObj.options[scrollObj.axis + 'PaddingBottom'], |
| min |
| ) |
| } |
| |
| function getBoundaryOffset(scrollObj, offset) { |
| if (offset > scrollObj.minScrollOffset) { |
| return offset - scrollObj.minScrollOffset |
| } |
| if (offset < scrollObj.maxScrollOffset) { |
| return offset - scrollObj.maxScrollOffset |
| } |
| } |
| |
| function touchBoundary(scrollObj, offset) { |
| if (offset > scrollObj.minScrollOffset) { |
| offset = scrollObj.minScrollOffset; |
| } else if (offset < scrollObj.maxScrollOffset) { |
| offset = scrollObj.maxScrollOffset; |
| } |
| return offset |
| } |
| |
| function fireEvent$3(scrollObj, eventName, extra) { |
| debugLog(scrollObj.element.scrollId, eventName, extra); |
| var event = doc$1.createEvent('HTMLEvents'); |
| event.initEvent(eventName, false, true); |
| event.scrollObj = scrollObj; |
| if (extra) { |
| for (var key in extra) { |
| event[key] = extra[key]; |
| } |
| } |
| scrollObj.element.dispatchEvent(event); |
| scrollObj.viewport.dispatchEvent(event); |
| } |
| |
| function getTransformOffset(scrollObj) { |
| var offset = {x: 0, y: 0}; |
| var transform = getComputedStyle(scrollObj.element) |
| [stylePrefix$1 + 'Transform']; |
| var matched; |
| var reg1 = new RegExp('^matrix3d' |
| + '\\((?:[-\\d.]+,\\s*){12}([-\\d.]+),' |
| + '\\s*([-\\d.]+)(?:,\\s*[-\\d.]+){2}\\)'); |
| var reg2 = new RegExp('^matrix' |
| + '\\((?:[-\\d.]+,\\s*){4}([-\\d.]+),\\s*([-\\d.]+)\\)$'); |
| if (transform !== 'none') { |
| if ((matched = transform.match(reg1) || |
| transform.match(reg2))) { |
| offset.x = parseFloat(matched[1]) || 0; |
| offset.y = parseFloat(matched[2]) || 0; |
| } |
| } |
| |
| return offset |
| } |
| |
| var CSSMatrix = IEMobile ? 'MSCSSMatrix' : 'WebKitCSSMatrix'; |
| var has3d = !!Firefox |
| || CSSMatrix in window |
| && 'm11' in new window[CSSMatrix](); |
| function getTranslate(x, y) { |
| x = parseFloat(x); |
| y = parseFloat(y); |
| |
| if (x != 0) { |
| x += 'px'; |
| } |
| |
| if (y != 0) { |
| y += 'px'; |
| } |
| |
| if (has3d) { |
| return 'translate3d(' + x + ', ' + y + ', 0)' |
| } |
| return 'translate(' + x + ', ' + y + ')' |
| } |
| |
| function setTransitionStyle(scrollObj, duration, timingFunction) { |
| if (duration === '' && timingFunction === '') { |
| scrollObj.element.style[stylePrefix$1 + 'Transition'] = ''; |
| } else { |
| scrollObj.element.style[stylePrefix$1 + 'Transition'] |
| = cssPrefix$1 + 'transform ' + duration + ' ' + timingFunction + ' 0s'; |
| } |
| } |
| |
| function setTransformStyle(scrollObj, offset) { |
| var x = 0; |
| var y = 0; |
| if (typeof offset === 'object') { |
| x = offset.x; |
| y = offset.y; |
| } else { |
| if (scrollObj.axis === 'y') { |
| y = offset; |
| } else { |
| x = offset; |
| } |
| } |
| scrollObj.element.style[stylePrefix$1 + 'Transform'] = getTranslate(x, y); |
| } |
| |
| var panning = false; |
| doc$1.addEventListener('touchmove', function (e) { |
| if (panning) { |
| e.preventDefault(); |
| return false |
| } |
| return true |
| }, false); |
| |
| function Scroll(element, options) { |
| var this$1 = this; |
| |
| var that = this; |
| |
| options = options || {}; |
| options.noBounce = !!options.noBounce; |
| options.padding = options.padding || {}; |
| |
| if (options.isPrevent == null) { |
| options.isPrevent = true; |
| } else { |
| options.isPrevent = !!options.isPrevent; |
| } |
| |
| if (options.isFixScrollendClick == null) { |
| options.isFixScrollendClick = true; |
| } else { |
| options.isFixScrollendClick = !!options.isFixScrollendClick; |
| } |
| |
| if (options.padding) { |
| options.yPaddingTop = -options.padding.top || 0; |
| options.yPaddingBottom = -options.padding.bottom || 0; |
| options.xPaddingTop = -options.padding.left || 0; |
| options.xPaddingBottom = -options.padding.right || 0; |
| } else { |
| options.yPaddingTop = 0; |
| options.yPaddingBottom = 0; |
| options.xPaddingTop = 0; |
| options.xPaddingBottom = 0; |
| } |
| |
| options.direction = options.direction || 'y'; |
| options.inertia = options.inertia || 'normal'; |
| |
| this.options = options; |
| that.axis = options.direction; |
| this.element = element; |
| this.viewport = element.parentNode; |
| this.plugins = {}; |
| |
| this.element.scrollId = setTimeout(function () { |
| scrollObjs[that.element.scrollId + ''] = that; |
| }, 1); |
| |
| this.viewport.addEventListener('touchstart', touchstartHandler, false); |
| this.viewport.addEventListener('touchend', touchendHandler, false); |
| this.viewport.addEventListener('touchcancel', touchendHandler, false); |
| this.viewport.addEventListener('panstart', panstartHandler, false); |
| this.viewport.addEventListener('panmove', panHandler, false); |
| this.viewport.addEventListener('panend', panendHandler, false); |
| |
| if (options.isPrevent) { |
| this.viewport.addEventListener('touchstart', function (e) { |
| panning = true; |
| }, false); |
| that.viewport.addEventListener('touchend', function (e) { |
| panning = false; |
| }, false); |
| } |
| |
| // if (options.isPrevent) { |
| // var d = this.axis === 'y'?'vertical':'horizontal' |
| // this.viewport.addEventListener(d + 'panstart', function (e) { |
| // panning = true |
| // }, false) |
| // that.viewport.addEventListener('panend', function (e) { |
| // panning = false |
| // }, false) |
| // } |
| |
| if (options.isFixScrollendClick) { |
| var preventScrollendClick; |
| var fixScrollendClickTimeoutId; |
| |
| this.viewport.addEventListener('scrolling', function () { |
| preventScrollendClick = true; |
| fixScrollendClickTimeoutId && clearTimeout(fixScrollendClickTimeoutId); |
| fixScrollendClickTimeoutId = setTimeout(function (e) { |
| preventScrollendClick = false; |
| }, 400); |
| }, false); |
| |
| function preventScrollendClickHandler(e) { |
| if (preventScrollendClick || isScrolling) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| return false |
| } |
| return true |
| } |
| |
| function fireNiceTapEventHandler(e) { |
| if (!preventScrollendClick && !isScrolling) { |
| setTimeout(function () { |
| var niceTapEvent = document.createEvent('HTMLEvents'); |
| niceTapEvent.initEvent('niceclick', true, true); |
| e.target.dispatchEvent(niceTapEvent); |
| }, 300); |
| } |
| } |
| |
| this.viewport.addEventListener('click', preventScrollendClickHandler); |
| this.viewport.addEventListener('tap', fireNiceTapEventHandler); |
| } |
| |
| function setTransitionEndHandler(h, t) { |
| if (options.useFrameAnimation) { |
| return |
| } |
| transitionEndHandler = null; |
| clearTimeout(transitionEndTimeoutId); |
| |
| transitionEndTimeoutId = setTimeout(function () { |
| if (transitionEndHandler) { |
| transitionEndHandler = null; |
| lib.animation.requestFrame(h); |
| } |
| }, (t || 400)); |
| |
| transitionEndHandler = h; |
| } |
| |
| if (options.useFrameAnimation) { |
| var scrollAnimation; |
| |
| Object.defineProperty(this, 'animation', { |
| get: function () { |
| return scrollAnimation |
| } |
| }); |
| } else { |
| var transitionEndHandler; |
| var transitionEndTimeoutId = 0; |
| |
| element.addEventListener( |
| Firefox |
| ? 'transitionend' |
| : (stylePrefix$1 + 'TransitionEnd'), function (e) { |
| if (transitionEndHandler) { |
| var handler = transitionEndHandler; |
| |
| transitionEndHandler = null; |
| clearTimeout(transitionEndTimeoutId); |
| |
| lib.animation.requestFrame(function () { |
| handler(e); |
| }); |
| } |
| }, false); |
| } |
| |
| var panFixRatio; |
| var isScrolling; |
| var isFlickScrolling; |
| var cancelScrollEnd; |
| |
| Object.defineProperty(this, 'isScrolling', { |
| get: function () { |
| return !!isScrolling |
| } |
| }); |
| |
| function isEnabled(e) { |
| if (!that.enabled) { |
| return false |
| } |
| |
| if (typeof e.isVertical != 'undefined') { |
| if (that.axis === 'y' && e.isVertical |
| || that.axis === 'x' && !e.isVertical) { |
| // gesture in same direction, stop bubbling up |
| e.stopPropagation(); |
| } else { |
| // gesture in different direction, bubbling up |
| // to the top, without any other process |
| return false |
| } |
| } |
| |
| return true |
| } |
| |
| function touchstartHandler(e) { |
| if (!isEnabled(e)) { |
| return |
| } |
| |
| if (isScrolling) { |
| scrollEnd(); |
| } |
| |
| if (options.useFrameAnimation) { |
| scrollAnimation && scrollAnimation.stop(); |
| scrollAnimation = null; |
| } else { |
| var transform = getTransformOffset(that); |
| setTransformStyle(that, transform); |
| setTransitionStyle(that, '', ''); |
| transitionEndHandler = null; |
| clearTimeout(transitionEndTimeoutId); |
| } |
| } |
| |
| function touchendHandler(e) { |
| if (!isEnabled(e)) { |
| return |
| } |
| |
| var s0 = getTransformOffset(that)[that.axis]; |
| var boundaryOffset = getBoundaryOffset(that, s0); |
| |
| if (boundaryOffset) { |
| // dragging out of boundray, bounce is needed |
| var s1 = touchBoundary(that, s0); |
| |
| if (options.useFrameAnimation) { |
| // frame |
| var _s = s1 - s0; |
| scrollAnimation = new lib.animation( |
| 400, |
| lib.cubicbezier.ease, |
| 0, |
| function (i1, i2) { |
| var offset = (s0 + _s * i2).toFixed(2); |
| setTransformStyle(that, offset); |
| fireEvent$3(that, 'scrolling'); |
| }); |
| scrollAnimation.onend(scrollEnd); |
| scrollAnimation.play(); |
| } else { |
| // css |
| var offset = s1.toFixed(0); |
| setTransitionEndHandler(scrollEnd, 400); |
| setTransitionStyle(that, '0.4s', 'ease'); |
| setTransformStyle(that, offset); |
| |
| lib.animation.requestFrame(function doScroll() { |
| if (isScrolling && that.enabled) { |
| fireEvent$3(that, 'scrolling'); |
| lib.animation.requestFrame(doScroll); |
| } |
| }); |
| } |
| |
| if (boundaryOffset > 0) { |
| fireEvent$3(that, that.axis === 'y' ? 'pulldownend' : 'pullrightend'); |
| } else if (boundaryOffset < 0) { |
| fireEvent$3(that, that.axis === 'y' ? 'pullupend' : 'pullleftend'); |
| } |
| } else if (isScrolling) { |
| // without exceeding the boundary, just end it |
| scrollEnd(); |
| } |
| } |
| |
| var lastDisplacement; |
| function panstartHandler(e) { |
| if (!isEnabled(e)) { |
| return |
| } |
| |
| that.transformOffset = getTransformOffset(that); |
| that.minScrollOffset = getMinScrollOffset(that); |
| that.maxScrollOffset = getMaxScrollOffset(that); |
| panFixRatio = 2.5; |
| cancelScrollEnd = true; |
| isScrolling = true; |
| isFlickScrolling = false; |
| fireEvent$3(that, 'scrollstart'); |
| |
| lastDisplacement = e['displacement' + that.axis.toUpperCase()]; |
| } |
| |
| |
| function panHandler(e) { |
| if (!isEnabled(e)) { |
| return |
| } |
| |
| // finger move less than 5 px. just ignore that. |
| var displacement = e['displacement' + that.axis.toUpperCase()]; |
| if (Math.abs(displacement - lastDisplacement) < 5) { |
| e.stopPropagation(); |
| return |
| } |
| lastDisplacement = displacement; |
| |
| var offset = that.transformOffset[that.axis] + displacement; |
| if (offset > that.minScrollOffset) { |
| offset = that.minScrollOffset |
| + (offset - that.minScrollOffset) / panFixRatio; |
| panFixRatio *= 1.003; |
| } else if (offset < that.maxScrollOffset) { |
| offset = that.maxScrollOffset |
| - (that.maxScrollOffset - offset) / panFixRatio; |
| panFixRatio *= 1.003; |
| } |
| if (panFixRatio > 4) { |
| panFixRatio = 4; |
| } |
| |
| // tell whether or not reach the fringe |
| var boundaryOffset = getBoundaryOffset(that, offset); |
| if (boundaryOffset) { |
| fireEvent$3( |
| that, |
| boundaryOffset > 0 |
| ? (that.axis === 'y' ? 'pulldown' : 'pullright') |
| : (that.axis === 'y' ? 'pullup' : 'pullleft'), { |
| boundaryOffset: Math.abs(boundaryOffset) |
| }); |
| if (that.options.noBounce) { |
| offset = touchBoundary(that, offset); |
| } |
| } |
| |
| setTransformStyle(that, offset.toFixed(2)); |
| fireEvent$3(that, 'scrolling'); |
| } |
| |
| function panendHandler(e) { |
| if (!isEnabled(e)) { |
| return |
| } |
| |
| if (e.isSwipe) { |
| flickHandler(e); |
| } |
| } |
| |
| function flickHandler(e) { |
| cancelScrollEnd = true; |
| |
| var v0, a0, t0, s0, s, motion0; |
| var v1, a1, t1, s1, motion1,sign; |
| var v2, a2, t2, s2, motion2, ft; |
| |
| s0 = getTransformOffset(that)[that.axis]; |
| var boundaryOffset0 = getBoundaryOffset(that, s0); |
| if (!boundaryOffset0) { |
| // when fingers left the range of screen, let touch end handler |
| // to deal with it. |
| // when fingers left the screen, but still in the range of |
| // screen, calculate the intertia. |
| v0 = e['velocity' + that.axis.toUpperCase()]; |
| |
| var maxV = 2; |
| var friction = 0.0015; |
| if (options.inertia && inertiaCoefficient[options.inertia]) { |
| maxV = inertiaCoefficient[options.inertia][0]; |
| friction = inertiaCoefficient[options.inertia][1]; |
| } |
| |
| if (v0 > maxV) { |
| v0 = maxV; |
| } |
| if (v0 < -maxV) { |
| v0 = -maxV; |
| } |
| a0 = friction * (v0 / Math.abs(v0)); |
| motion0 = new lib.motion({ |
| v: v0, |
| a: -a0 |
| }); |
| t0 = motion0.t; |
| s = s0 + motion0.s; |
| |
| var boundaryOffset1 = getBoundaryOffset(that, s); |
| if (boundaryOffset1) { |
| debugLog('inertial calculation has exceeded the boundary', |
| boundaryOffset1); |
| |
| v1 = v0; |
| a1 = a0; |
| if (boundaryOffset1 > 0) { |
| s1 = that.minScrollOffset; |
| sign = 1; |
| } else { |
| s1 = that.maxScrollOffset; |
| sign = -1; |
| } |
| motion1 = new lib.motion({ |
| v: sign * v1, |
| a: -sign * a1, |
| s: Math.abs(s1 - s0) |
| }); |
| t1 = motion1.t; |
| var timeFunction1 = motion1.generateCubicBezier(); |
| |
| v2 = v1 - a1 * t1; |
| a2 = 0.03 * (v2 / Math.abs(v2)); |
| motion2 = new lib.motion({ |
| v: v2, |
| a: -a2 |
| }); |
| t2 = motion2.t; |
| s2 = s1 + motion2.s; |
| var timeFunction2 = motion2.generateCubicBezier(); |
| |
| if (options.noBounce) { |
| debugLog('no bounce effect'); |
| |
| if (s0 !== s1) { |
| if (options.useFrameAnimation) { |
| // frame |
| var _s = s1 - s0; |
| var bezier = lib.cubicbezier( |
| timeFunction1[0][0], |
| timeFunction1[0][1], |
| timeFunction1[1][0], |
| timeFunction1[1][1] |
| ); |
| scrollAnimation = new lib.animation( |
| t1.toFixed(0), |
| bezier, |
| 0, |
| function (i1, i2) { |
| var offset = (s0 + _s * i2); |
| getTransformOffset(that, offset.toFixed(2)); |
| fireEvent$3(that, 'scrolling', { |
| afterFlick: true |
| }); |
| }); |
| |
| scrollAnimation.onend(scrollEnd); |
| |
| scrollAnimation.play(); |
| } else { |
| // css |
| var offset = s1.toFixed(0); |
| setTransitionEndHandler( |
| scrollEnd, |
| (t1 / 1000).toFixed(2) * 1000 |
| ); |
| setTransitionStyle( |
| that, |
| (t1 / 1000).toFixed(2) + 's', |
| 'cubic-bezier(' + timeFunction1 + ')' |
| ); |
| setTransformStyle(that, offset); |
| } |
| } else { |
| scrollEnd(); |
| } |
| } else if (s0 !== s2) { |
| debugLog( |
| 'scroll for inertia', |
| 's=' + s2.toFixed(0), |
| 't=' + ((t1 + t2) / 1000).toFixed(2) |
| ); |
| |
| if (options.useFrameAnimation) { |
| var _s = s2 - s0; |
| var bezier = lib.cubicbezier.easeOut; |
| scrollAnimation = new lib.animation( |
| (t1 + t2).toFixed(0), |
| bezier, |
| 0, |
| function (i1, i2) { |
| var offset = s0 + _s * i2; |
| setTransformStyle(that, offset.toFixed(2)); |
| fireEvent$3(that, 'scrolling',{ |
| afterFlick: true |
| }); |
| }); |
| |
| scrollAnimation.onend(function () { |
| if (!that.enabled) { |
| return |
| } |
| |
| var _s = s1 - s2; |
| var bezier = lib.cubicbezier.ease; |
| scrollAnimation = new lib.animation( |
| 400, |
| bezier, |
| 0, |
| function (i1, i2) { |
| var offset = s2 + _s * i2; |
| setTransformStyle(that, offset.toFixed(2)); |
| fireEvent$3(that, 'scrolling',{ |
| afterFlick: true |
| }); |
| }); |
| |
| scrollAnimation.onend(scrollEnd); |
| |
| scrollAnimation.play(); |
| }); |
| |
| scrollAnimation.play(); |
| } else { |
| var offset = s2.toFixed(0); |
| setTransitionEndHandler(function (e) { |
| if (!that.enabled) { |
| return |
| } |
| |
| debugLog('inertial bounce', |
| 's=' + s1.toFixed(0), |
| 't=400' |
| ); |
| |
| if (s2 !== s1) { |
| var offset = s1.toFixed(0); |
| setTransitionStyle(that, '0.4s', 'ease'); |
| setTransformStyle(that, offset); |
| setTransitionEndHandler(scrollEnd, 400); |
| } else { |
| scrollEnd(); |
| } |
| }, ((t1 + t2) / 1000).toFixed(2) * 1000); |
| |
| setTransitionStyle( |
| that, |
| ((t1 + t2) / 1000).toFixed(2) + 's', |
| 'ease-out' |
| ); |
| setTransformStyle(that, offset); |
| } |
| } else { |
| scrollEnd(); |
| } |
| } else { |
| debugLog('inertial calculation hasn\'t exceeded the boundary'); |
| var timeFunction = motion0.generateCubicBezier(); |
| |
| if (options.useFrameAnimation) { |
| // frame |
| var _s = s - s0; |
| var bezier = lib.cubicbezier( |
| timeFunction[0][0], |
| timeFunction[0][1], |
| timeFunction[1][0], |
| timeFunction[1][1] |
| ); |
| scrollAnimation = new lib.animation( |
| t0.toFixed(0), |
| bezier, |
| 0, |
| function (i1, i2) { |
| var offset = (s0 + _s * i2).toFixed(2); |
| setTransformStyle(that, offset); |
| fireEvent$3(that, 'scrolling',{ |
| afterFlick: true |
| }); |
| }); |
| |
| scrollAnimation.onend(scrollEnd); |
| |
| scrollAnimation.play(); |
| } else { |
| // css |
| var offset = s.toFixed(0); |
| setTransitionEndHandler(scrollEnd, (t0 / 1000).toFixed(2) * 1000); |
| setTransitionStyle( |
| that, |
| (t0 / 1000).toFixed(2) + 's', |
| 'cubic-bezier(' + timeFunction + ')' |
| ); |
| setTransformStyle(that, offset); |
| } |
| } |
| |
| |
| isFlickScrolling = true; |
| if (!options.useFrameAnimation) { |
| lib.animation.requestFrame(function doScroll() { |
| if (isScrolling && isFlickScrolling && that.enabled) { |
| fireEvent$3(that, 'scrolling', { |
| afterFlick: true |
| }); |
| lib.animation.requestFrame(doScroll); |
| } |
| }); |
| } |
| } |
| } |
| |
| function scrollEnd() { |
| if (!that.enabled) { |
| return |
| } |
| |
| cancelScrollEnd = false; |
| |
| setTimeout(function () { |
| if (!cancelScrollEnd && isScrolling) { |
| isScrolling = false; |
| isFlickScrolling = false; |
| |
| if (options.useFrameAnimation) { |
| scrollAnimation && scrollAnimation.stop(); |
| scrollAnimation = null; |
| } else { |
| setTransitionStyle(that, '', ''); |
| } |
| fireEvent$3(that, 'scrollend'); |
| } |
| }, 50); |
| } |
| |
| var proto = { |
| init: function () { |
| this.enable(); |
| this.refresh(); |
| this.scrollTo(0); |
| return this |
| }, |
| |
| enable: function () { |
| this.enabled = true; |
| return this |
| }, |
| |
| disable: function () { |
| var el = this.element; |
| this.enabled = false; |
| |
| if (this.options.useFrameAnimation) { |
| scrollAnimation && scrollAnimation.stop(); |
| } else { |
| lib.animation.requestFrame(function () { |
| el.style[stylePrefix$1 + 'Transform'] |
| = getComputedStyle(el)[stylePrefix$1 + 'Transform']; |
| }); |
| } |
| |
| return this |
| }, |
| |
| getScrollWidth: function () { |
| return getBoundingClientRect(this.element).width |
| }, |
| |
| getScrollHeight: function () { |
| return getBoundingClientRect(this.element).height |
| }, |
| |
| getScrollLeft: function () { |
| return -getTransformOffset(this).x - this.options.xPaddingTop |
| }, |
| |
| getScrollTop: function () { |
| return -getTransformOffset(this).y - this.options.yPaddingTop |
| }, |
| |
| getMaxScrollLeft: function () { |
| return -that.maxScrollOffset - this.options.xPaddingTop |
| }, |
| |
| getMaxScrollTop: function () { |
| return -that.maxScrollOffset - this.options.yPaddingTop |
| }, |
| |
| getBoundaryOffset: function () { |
| return Math.abs( |
| getBoundaryOffset(this, getTransformOffset(this)[this.axis]) || 0 |
| ) |
| }, |
| |
| refresh: function () { |
| var el = this.element; |
| var isVertical = (this.axis === 'y'); |
| var type = isVertical ? 'height' : 'width'; |
| var size, rect, extraSize; |
| |
| function getExtraSize(el, isVertical) { |
| var extraType = isVertical ? ['top', 'bottom'] : ['left', 'right']; |
| return parseFloat( |
| getComputedStyle(el.firstElementChild)['margin-' + extraType[0]] |
| ) + parseFloat( |
| getComputedStyle(el.lastElementChild)['margin-' + extraType[1]] |
| ) |
| } |
| |
| if (this.options[type] != null) { |
| // use options |
| size = this.options[type]; |
| } else if (el.childElementCount <= 0) { |
| el.style[type] = 'auto'; |
| size = null; |
| } else if (!!this.options.useElementRect) { |
| el.style[type] = 'auto'; |
| rect = getBoundingClientRect(el); |
| size = rect[type]; |
| size += getExtraSize(el, isVertical); |
| } else { |
| var range, rect; |
| var firstEl = el.firstElementChild; |
| var lastEl = el.lastElementChild; |
| |
| if (document.createRange && !this.options.ignoreOverflow) { |
| // use range |
| range = document.createRange(); |
| range.selectNodeContents(el); |
| rect = getBoundingClientRect(range); |
| } |
| |
| if (rect) { |
| size = rect[type]; |
| } else { |
| // use child offsets |
| while (firstEl) { |
| if (getBoundingClientRect(firstEl)[type] === 0 |
| && firstEl.nextElementSibling) { |
| firstEl = firstEl.nextElementSibling; |
| } else { |
| break |
| } |
| } |
| |
| while (lastEl && lastEl !== firstEl) { |
| if (getBoundingClientRect(lastEl)[type] === 0 |
| && lastEl.previousElementSibling) { |
| lastEl = lastEl.previousElementSibling; |
| } else { |
| break |
| } |
| } |
| |
| size = getBoundingClientRect(lastEl)[ |
| isVertical ? 'bottom' : 'right'] |
| - getBoundingClientRect(firstEl)[ |
| isVertical ? 'top' : 'left']; |
| } |
| |
| size += getExtraSize(el, isVertical); |
| |
| } |
| |
| el.style[type] = size ? size + 'px' : 'auto'; |
| |
| this.transformOffset = getTransformOffset(this); |
| this.minScrollOffset = getMinScrollOffset(this); |
| this.maxScrollOffset = getMaxScrollOffset(this); |
| |
| this.scrollTo( |
| -this.transformOffset[this.axis] |
| - this.options[this.axis + 'PaddingTop'] |
| ); |
| fireEvent$3(this, 'contentrefresh'); |
| |
| return this |
| }, |
| |
| offset: function (childEl) { |
| var elRect = getBoundingClientRect(this.element); |
| var childRect = getBoundingClientRect(childEl); |
| if (this.axis === 'y') { |
| var offsetRect = { |
| top: childRect.top - elRect.top - this.options.yPaddingTop, |
| left: childRect.left - elRect.left, |
| right: elRect.right - childRect.right, |
| width: childRect.width, |
| height: childRect.height |
| }; |
| |
| offsetRect.bottom = offsetRect.top + offsetRect.height; |
| } else { |
| var offsetRect = { |
| top: childRect.top - elRect.top, |
| bottom: elRect.bottom - childRect.bottom, |
| left: childRect.left - elRect.left - this.options.xPaddingTop, |
| width: childRect.width, |
| height: childRect.height |
| }; |
| |
| offsetRect.right = offsetRect.left + offsetRect.width; |
| } |
| return offsetRect |
| }, |
| |
| getRect: function (childEl) { |
| var viewRect = getBoundingClientRect(this.viewport); |
| var childRect = getBoundingClientRect(childEl); |
| if (this.axis === 'y') { |
| var offsetRect = { |
| top: childRect.top - viewRect.top, |
| left: childRect.left - viewRect.left, |
| right: viewRect.right - childRect.right, |
| width: childRect.width, |
| height: childRect.height |
| }; |
| |
| offsetRect.bottom = offsetRect.top + offsetRect.height; |
| } else { |
| var offsetRect = { |
| top: childRect.top - viewRect.top, |
| bottom: viewRect.bottom - childRect.bottom, |
| left: childRect.left - viewRect.left, |
| width: childRect.width, |
| height: childRect.height |
| }; |
| |
| offsetRect.right = offsetRect.left + offsetRect.width; |
| } |
| return offsetRect |
| }, |
| |
| isInView: function (childEl) { |
| var viewRect = this.getRect(this.viewport); |
| var childRect = this.getRect(childEl); |
| if (this.axis === 'y') { |
| return viewRect.top < childRect.bottom |
| && viewRect.bottom > childRect.top |
| } |
| return viewRect.left < childRect.right |
| && viewRect.right > childRect.left |
| }, |
| |
| scrollTo: function (offset, isSmooth) { |
| var that = this; |
| var element = this.element; |
| |
| offset = -offset - this.options[this.axis + 'PaddingTop']; |
| offset = touchBoundary(this, offset); |
| |
| isScrolling = true; |
| if (isSmooth === true) { |
| if (this.options.useFrameAnimation) { |
| var s0 = getTransformOffset(that)[this.axis]; |
| var _s = offset - s0; |
| scrollAnimation = new lib.animation( |
| 400, |
| lib.cubicbezier.easeInOut, |
| 0, |
| function (i1, i2) { |
| var offset = (s0 + _s * i2).toFixed(2); |
| setTransformStyle(that, offset); |
| fireEvent$3(that, 'scrolling'); |
| }); |
| |
| scrollAnimation.onend(scrollEnd); |
| |
| scrollAnimation.play(); |
| } else { |
| setTransitionEndHandler(scrollEnd, 400); |
| setTransitionStyle(that, '0.4s', 'ease-in-out'); |
| setTransformStyle(that, offset); |
| |
| function _cancelScroll() { |
| if (isScrolling && that.enabled) { |
| fireEvent$3(that, 'scrolling'); |
| lib.animation.requestFrame(_cancelScroll); |
| } |
| } |
| |
| lib.animation.requestFrame(_cancelScroll); |
| } |
| } else { |
| if (!this.options.useFrameAnimation) { |
| setTransitionStyle(that, '', ''); |
| } |
| setTransformStyle(that, offset); |
| scrollEnd(); |
| } |
| |
| return this |
| }, |
| |
| scrollToElement: function (childEl, isSmooth, topOffset) { |
| var offset = this.offset(childEl); |
| offset = offset[this.axis === 'y'?'top':'left']; |
| topOffset && (offset += topOffset); |
| return this.scrollTo(offset, isSmooth) |
| }, |
| |
| getViewWidth: function () { |
| return getBoundingClientRect(this.viewport).width |
| }, |
| |
| getViewHeight: function () { |
| return getBoundingClientRect(this.viewport).height |
| }, |
| |
| addPulldownHandler: function (handler) { |
| var that = this; |
| this.element.addEventListener('pulldownend', function (e) { |
| that.disable(); |
| handler.call(that, e, function () { |
| that.scrollTo(0, true); |
| that.refresh(); |
| that.enable(); |
| }); |
| }, false); |
| |
| return this |
| }, |
| |
| addPullupHandler: function (handler) { |
| var that = this; |
| |
| this.element.addEventListener('pullupend', function (e) { |
| that.disable(); |
| handler.call(that, e, function () { |
| that.scrollTo(that.getScrollHeight(), true); |
| that.refresh(); |
| that.enable(); |
| }); |
| }, false); |
| |
| return this |
| }, |
| |
| addScrollstartHandler: function (handler) { |
| var that = this; |
| this.element.addEventListener('scrollstart', function (e) { |
| handler.call(that, e); |
| }, false); |
| |
| return this |
| }, |
| |
| addScrollingHandler: function (handler) { |
| var that = this; |
| this.element.addEventListener('scrolling', function (e) { |
| handler.call(that, e); |
| }, false); |
| |
| return this |
| }, |
| |
| addScrollendHandler: function (handler) { |
| var that = this; |
| this.element.addEventListener('scrollend', function (e) { |
| handler.call(that, e); |
| }, false); |
| |
| return this |
| }, |
| |
| addContentrenfreshHandler: function (handler) { |
| var that = this; |
| this.element.addEventListener('contentrefresh', function (e) { |
| handler.call(that, e); |
| }, false); |
| }, |
| |
| addEventListener: function (name, handler, useCapture) { |
| var that = this; |
| this.element.addEventListener(name, function (e) { |
| handler.call(that, e); |
| }, !!useCapture); |
| }, |
| |
| removeEventListener: function (name, handler) { |
| var that = this; |
| this.element.removeEventListener(name, function (e) { |
| handler.call(that, e); |
| }); |
| }, |
| |
| enablePlugin: function (name, options) { |
| var plugin = plugins[name]; |
| if (plugin && !this.plugins[name]) { |
| this.plugins[name] = true; |
| options = options || {}; |
| plugin.call(this, name, options); |
| } |
| return this |
| } |
| }; |
| |
| for (var k in proto) { |
| this$1[k] = proto[k]; |
| } |
| // delete proto |
| } |
| |
| lib.scroll = function (el, options) { |
| if (arguments.length === 1 && !(arguments[0] instanceof HTMLElement)) { |
| options = arguments[0]; |
| if (options.scrollElement) { |
| el = options.scrollElement; |
| } else if (options.scrollWrap) { |
| el = options.scrollWrap.firstElementChild; |
| } else { |
| throw new Error('no scroll element') |
| } |
| } |
| |
| if (!el.parentNode) { |
| throw new Error('wrong dom tree') |
| } |
| if (options |
| && options.direction |
| && ['x', 'y'].indexOf(options.direction) < 0) { |
| throw new Error('wrong direction') |
| } |
| |
| var scroll; |
| if (options.downgrade === true |
| && lib.scroll.downgrade) { |
| scroll = lib.scroll.downgrade(el, options); |
| } else { |
| if (el.scrollId) { |
| scroll = scrollObjs[el.scrollId]; |
| } else { |
| scroll = new Scroll(el, options); |
| } |
| } |
| return scroll |
| }; |
| |
| lib.scroll.plugin = function (name, constructor) { |
| if (constructor) { |
| name = name.split(','); |
| name.forEach(function (n) { |
| plugins[n] = constructor; |
| }); |
| } else { |
| return plugins[name] |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global lib */ |
| |
| // lib.scroll events: |
| // - scrollstart |
| // - scrolling |
| // - pulldownend |
| // - pullupend |
| // - pullleftend |
| // - pullrightend |
| // - pulldown |
| // - pullup |
| // - pullleft |
| // - pullright |
| // - contentrefresh |
| |
| var directionMap = { |
| h: ['row', 'horizontal', 'h', 'x'], |
| v: ['column', 'vertical', 'v', 'y'] |
| }; |
| |
| var DEFAULT_DIRECTION = 'column'; |
| var DEFAULT_LOAD_MORE_OFFSET$1 = 0; |
| |
| function refreshWhenDomRenderend (comp) { |
| if (!comp.renderendHandler) { |
| comp.renderendHandler = function () { |
| comp.scroller.refresh(); |
| }; |
| } |
| window.addEventListener('renderend', comp.renderendHandler); |
| } |
| |
| function removeEvents (comp) { |
| if (comp.renderendHandler) { |
| window.removeEventListener('renderend', comp.renderendHandler); |
| } |
| } |
| |
| function getProto$1 (Weex) { |
| var Component = Weex.Component; |
| |
| function create (nodeType) { |
| var Scroll = lib.scroll; |
| var node = Component.prototype.create.call(this, nodeType); |
| node.classList.add('weex-container'); |
| node.classList.add('scrollable-wrap'); |
| this.scrollElement = document.createElement('div'); |
| this.scrollElement.classList.add('weex-container'); |
| this.scrollElement.classList.add('scrollable-element'); |
| this.scrollElement.classList.add('dir-' + this.direction); |
| |
| this.scrollElement.style.webkitBoxOrient = directionMap[this.direction][1]; |
| this.scrollElement.style.webkitFlexDirection = directionMap[this.direction][0]; |
| this.scrollElement.style.flexDirection = directionMap[this.direction][0]; |
| |
| node.appendChild(this.scrollElement); |
| this.scroller = new Scroll({ |
| // if the direction is x, then the bounding rect of the scroll element |
| // should be got by the 'Range' API other than the 'getBoundingClientRect' |
| // API, because the width outside the viewport won't be count in by |
| // 'getBoundingClientRect'. |
| // Otherwise should use the element rect in case there is a child scroller |
| // or list in this scroller. If using 'Range', the whole scroll element |
| // including the hiding part will be count in the rect. |
| useElementRect: this.direction === 'v', |
| scrollElement: this.scrollElement, |
| direction: this.direction === 'h' ? 'x' : 'y' |
| }); |
| this.scroller.init(); |
| this.offset = 0; |
| return node |
| } |
| |
| function createChildren () { |
| var this$1 = this; |
| |
| var children = this.data.children; |
| var parentRef = this.data.ref; |
| var componentManager = this.getComponentManager(); |
| if (children && children.length) { |
| var fragment = document.createDocumentFragment(); |
| var isFlex = false; |
| for (var i = 0; i < children.length; i++) { |
| children[i].instanceId = this$1.data.instanceId; |
| var child = componentManager.createElement(children[i]); |
| fragment.appendChild(child.node); |
| child.parentRef = parentRef; |
| if (!isFlex |
| && child.data.style |
| && child.data.style.hasOwnProperty('flex') |
| ) { |
| isFlex = true; |
| } |
| } |
| this.scrollElement.appendChild(fragment); |
| } |
| // wait for fragment to appended on scrollElement on UI thread. |
| setTimeout(function () { |
| this.scroller.refresh(); |
| }.bind(this), 0); |
| } |
| |
| function appendChild (data) { |
| var children = this.data.children; |
| var componentManager = this.getComponentManager(); |
| var child = componentManager.createElement(data); |
| this.scrollElement.appendChild(child.node); |
| |
| // wait for UI thread to update. |
| setTimeout(function () { |
| this.scroller.refresh(); |
| }.bind(this), 0); |
| |
| // update this.data.children |
| if (!children || !children.length) { |
| this.data.children = [data]; |
| } |
| else { |
| children.push(data); |
| } |
| |
| return child |
| } |
| |
| function insertBefore (child, before) { |
| var children = this.data.children; |
| var i = 0; |
| var isAppend = false; |
| |
| // update this.data.children |
| if (!children || !children.length || !before) { |
| isAppend = true; |
| } |
| else { |
| var l; |
| for (l = children.length; i < l; i++) { |
| if (children[i].ref === before.data.ref) { |
| break |
| } |
| } |
| if (i === l) { |
| isAppend = true; |
| } |
| } |
| |
| if (isAppend) { |
| this.scrollElement.appendChild(child.node); |
| children.push(child.data); |
| } |
| else { |
| var refreshLoadingPlaceholder = before.refreshPlaceholder |
| || before.loadingPlaceholder; |
| if (refreshLoadingPlaceholder) { |
| this.scrollElement.insertBefore(child.node, refreshLoadingPlaceholder); |
| } |
| else if (before.fixedPlaceholder) { |
| this.scrollElement.insertBefore(child.node, before.fixedPlaceholder); |
| } |
| else if (before.stickyPlaceholder) { |
| this.scrollElement.insertBefore(child.node, before.stickyPlaceholder); |
| } |
| else { |
| this.scrollElement.insertBefore(child.node, before.node); |
| } |
| children.splice(i, 0, child.data); |
| } |
| |
| // wait for UI thread to update. |
| setTimeout(function () { |
| this.scroller.refresh(); |
| }.bind(this), 0); |
| } |
| |
| function removeChild (child) { |
| var children = this.data.children; |
| // remove from this.data.children |
| var i = 0; |
| var componentManager = this.getComponentManager(); |
| if (children && children.length) { |
| var l; |
| for (l = children.length; i < l; i++) { |
| if (children[i].ref === child.data.ref) { |
| break |
| } |
| } |
| if (i < l) { |
| children.splice(i, 1); |
| } |
| } |
| // remove from componentMap recursively |
| componentManager.removeComponent(child.data.ref); |
| var refreshLoadingPlaceholder = child.refreshPlaceholder |
| || child.loadingPlaceholder; |
| child.unsetPosition(); |
| if (refreshLoadingPlaceholder) { |
| this.scrollElement.removeChild(refreshLoadingPlaceholder); |
| } |
| child.node.parentNode.removeChild(child.node); |
| |
| // wait for UI thread to update. |
| setTimeout(function () { |
| this.scroller.refresh(); |
| }.bind(this), 0); |
| } |
| |
| function bindEvents (evts) { |
| Component.prototype.bindEvents.call(this, evts); |
| // to enable lazyload for Images |
| this.scroller.addEventListener('scrolling', function (e) { |
| var so = e.scrollObj; |
| var scrollTop = so.getScrollTop(); |
| var scrollLeft = so.getScrollLeft(); |
| var offset = this.direction === 'v' ? scrollTop : scrollLeft; |
| var diff = offset - this.offset; |
| var dir; |
| if (diff >= 0) { |
| dir = this.direction === 'v' ? 'up' : 'left'; |
| } |
| else { |
| dir = this.direction === 'v' ? 'down' : 'right'; |
| } |
| this.dispatchEvent('scroll', { |
| originalType: 'scrolling', |
| scrollTop: so.getScrollTop(), |
| scrollLeft: so.getScrollLeft(), |
| offset: offset, |
| direction: dir |
| }, { |
| bubbles: true |
| }); |
| this.offset = offset; |
| |
| // fire loadmore event. |
| var leftDist = Math.abs(so.maxScrollOffset) - this.offset; |
| if (leftDist <= this.loadmoreoffset && this.isAvailableToFireloadmore) { |
| this.isAvailableToFireloadmore = false; |
| this.dispatchEvent('loadmore'); |
| } |
| else if (leftDist > this.loadmoreoffset && !this.isAvailableToFireloadmore) { |
| this.isAvailableToFireloadmore = true; |
| } |
| }.bind(this)); |
| } |
| |
| function onAppend () { |
| refreshWhenDomRenderend(this); |
| } |
| |
| function onRemove () { |
| removeEvents(this); |
| } |
| |
| return { |
| create: create, |
| createChildren: createChildren, |
| appendChild: appendChild, |
| insertBefore: insertBefore, |
| removeChild: removeChild, |
| bindEvents: bindEvents, |
| onAppend: onAppend, |
| onRemove: onRemove |
| } |
| } |
| |
| var attr$3 = { |
| loadmoreoffset: function (val) { |
| val = parseFloat(val); |
| if (val < 0 || isNaN(val)) { |
| console.warn('[h5-render] invalida'); |
| return |
| } |
| this.loadmoreoffset = val; |
| } |
| }; |
| |
| function init$15 (Weex) { |
| var Component = Weex.Component; |
| var extend = Weex.utils.extend; |
| |
| // attrs: |
| // - loadmoreoffset: updatable |
| // - scroll-direciton: none|vertical|horizontal (default is vertical) |
| // - show-scrollbar: true|false (default is true) |
| function Scrollable (data, nodeType) { |
| this.loadmoreoffset = DEFAULT_LOAD_MORE_OFFSET$1; |
| this.isAvailableToFireloadmore = true; |
| var attrs = data.attr || {}; |
| var direction = attrs.scrollDirection |
| || attrs.direction |
| || DEFAULT_DIRECTION; |
| this.direction = directionMap.h.indexOf(direction) === -1 |
| ? 'v' |
| : 'h'; |
| this.showScrollbar = attrs.showScrollbar || true; |
| Component.call(this, data, nodeType); |
| } |
| Scrollable.prototype = Object.create(Component.prototype); |
| extend(Scrollable.prototype, getProto$1(Weex)); |
| extend(Scrollable.prototype, { attr: attr$3 }); |
| return Scrollable |
| } |
| |
| var scrollableModule = { init: init$15 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var availableChildrenTypes = ['cell', 'loading', 'refresh']; |
| |
| function getProto (Scrollable) { |
| return { |
| create: function create () { |
| var node = Scrollable.prototype.create.call(this); |
| node.classList.add('list-wrap'); |
| this.scrollElement.classList.add('list-element'); |
| return node |
| }, |
| |
| createChildren: function createChildren () { |
| var children = this.data.children || []; |
| children.forEach(function (data) { |
| var type = data.type; |
| if (availableChildrenTypes.indexOf(type) === -1) { |
| // throw new Error('[h5-render] invalid child type "' |
| // + type + '" for list.') |
| console.warn('[h5-render] invalid child type "' |
| + type + '" for list.'); |
| } |
| }); |
| return Scrollable.prototype.createChildren.call(this) |
| }, |
| |
| appendChild: function appendChild (data) { |
| var type = data.type; |
| if (availableChildrenTypes.indexOf(type) === -1) { |
| // throw new Error('[h5-render] invalid child type "' |
| // + type + '" for list.') |
| console.warn('[h5-render] invalid child type "' |
| + type + '" for list.'); |
| } |
| return Scrollable.prototype.appendChild.call(this, data) |
| }, |
| |
| insertBefore: function insertBefore (child, before) { |
| var type = child.data.type; |
| if (availableChildrenTypes.indexOf(type) === -1) { |
| // throw new Error('[h5-render] invalid child type "' |
| // + type + '" for list.') |
| console.warn('[h5-render] invalid child type "' |
| + type + '" for list.'); |
| } |
| return Scrollable.prototype.insertBefore.call(this, child, before) |
| } |
| } |
| } |
| |
| function init$14 (Weex) { |
| var Scrollable = scrollableModule.init(Weex); |
| function List (data, nodeType) { |
| Scrollable.call(this, data, nodeType); |
| } |
| var extend = Weex.utils.extend; |
| |
| List.prototype = Object.create(Scrollable.prototype); |
| extend(List.prototype, getProto(Scrollable)); |
| |
| return List |
| } |
| |
| var listModule = { init: init$14 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function init$13 (Weex) { |
| var List = listModule.init(Weex); |
| |
| function Vlist (data, nodeType) { |
| data.attr.direction = 'v'; |
| List.call(this, data, nodeType); |
| } |
| Vlist.prototype = Object.create(List.prototype); |
| |
| Weex.registerComponent('list', Vlist); |
| Weex.registerComponent('vlist', Vlist); |
| } |
| |
| var Vlist = { init: init$13 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function init$16 (Weex) { |
| var List = listModule.init(Weex); |
| |
| function Hlist (data, nodeType) { |
| data.attr.direction = 'h'; |
| List.call(this, data, nodeType); |
| } |
| |
| Hlist.prototype = Object.create(List.prototype); |
| |
| Weex.registerComponent('hlist', Hlist); |
| } |
| |
| var Hlist = { init: init$16 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function init$12 (Weex) { |
| Weex.install(Vlist); |
| Weex.install(Hlist); |
| } |
| |
| var list = { init: init$12 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function init$17 (Weex) { |
| var Scrollable = scrollableModule.init(Weex); |
| function Scroller (data, nodeType) { |
| Scrollable.call(this, data, nodeType); |
| } |
| var extend = Weex.utils.extend; |
| |
| Scroller.prototype = Object.create(Scrollable.prototype); |
| extend(Scroller.prototype, { |
| create: function create () { |
| var node = Scrollable.prototype.create.call(this); |
| node.classList.add('scroller-wrap'); |
| this.scrollElement.classList.add('scroller-element'); |
| return node |
| } |
| }); |
| |
| Weex.registerComponent('scroller', Scroller); |
| } |
| |
| var scroller = { init: init$17 }; |
| |
| __$styleInject(".weex-refresh {\n // -webkit-box-align: center;\n // -webkit-align-items: center;\n // align-items: center;\n // -webkit-box-pack: center;\n // -webkit-justify-content: center;\n // justify-content: center;\n overflow: hidden;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 0;\n z-index: 999999;\n background-color: #666;\n}",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var parents = ['scroller', 'list', 'vlist']; |
| |
| // Only if pulldown offset is larger than this value can this |
| // component trigger the 'refresh' event, otherwise just recover |
| // to the start point. |
| var DEFAULT_CLAMP = 130; |
| var DEFAULT_ALIGN_ITEMS = 'center'; |
| var DEFAULT_JUSTIFY_CONTENT = 'center'; |
| |
| function adjustHeight (refresh, val) { |
| refresh.node.style.height = val + 'px'; |
| } |
| |
| // function adJustPosition (refresh, val) { |
| // refresh.node.style.top = -val + 'px' |
| // } |
| |
| function handleRefresh (refresh, e) { |
| refresh.node.style.height = refresh.clamp + 'px'; |
| refresh.dispatchEvent('refresh'); |
| refresh.isRefreshing = true; |
| } |
| |
| function show (refresh) { |
| refresh.display = true; |
| refresh.node.style.display = '-webkit-box'; |
| refresh.node.style.display = '-webkit-flex'; |
| refresh.node.style.display = 'flex'; |
| } |
| |
| function hide$3 (refresh) { |
| refresh.display = false; |
| refresh.node.style.display = 'none'; |
| refresh.isRefreshing = false; |
| } |
| |
| var proto$4 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('weex-container'); |
| node.classList.add('weex-refresh'); |
| return node |
| }, |
| |
| onAppend: function onAppend () { |
| var parent = this.getParent(); |
| var self = this; |
| if (parents.indexOf(parent.data.type) === -1) { |
| // not in a scroller or a list |
| return |
| } |
| this.refreshPlaceholder = document.createElement('div'); |
| this.refreshPlaceholder.classList.add('weex-refresh-placeholder'); |
| this.refreshPlaceholder.style.display = 'none'; |
| this.refreshPlaceholder.style.width = '0px'; |
| this.refreshPlaceholder.style.height = '0px'; |
| var scrollElement = parent.scrollElement || parent.listElement; |
| scrollElement.insertBefore(this.refreshPlaceholder, this.node); |
| parent.node.appendChild(this.node); |
| parent.scroller.addEventListener('pulldown', function (e) { |
| if (self.isRefreshing) { |
| return |
| } |
| adjustHeight(self, Math.abs(e.scrollObj.getScrollTop())); |
| if (!self.display) { |
| show(self); |
| } |
| }); |
| parent.scroller.addEventListener('pulldownend', function (e) { |
| if (self.isRefreshing) { |
| return |
| } |
| var top = Math.abs(e.scrollObj.getScrollTop()); |
| if (top > self.clamp) { |
| handleRefresh(self, e); |
| } |
| else { |
| hide$3(self); |
| } |
| }); |
| } |
| }; |
| |
| var attr$4 = { |
| display: function (val) { |
| if (val === 'show') { |
| setTimeout(function () { |
| show(this); |
| }.bind(this), 0); |
| } |
| else if (val === 'hide') { |
| setTimeout(function () { |
| hide$3(this); |
| }.bind(this), 0); |
| } |
| else { |
| console.error('[h5-render] attr \'display\' of <refresh>\': value ' |
| + val |
| + ' is invalid. Should be \'show\' or \'hide\''); |
| } |
| } |
| }; |
| |
| var style$3 = { |
| height: function (val) { |
| val = parseFloat(val); |
| if (isNaN(val) || val < 0) { |
| return console.warn('[h5-render] <refresh>\'s height (' + val + ') is invalid.') |
| } |
| this.clamp = val; |
| } |
| }; |
| |
| function init$18 (Weex) { |
| var Component = Weex.Component; |
| var extend = Weex.utils.extend; |
| |
| function Refresh (data) { |
| this.isRefreshing = false; |
| this.clamp = data.style.height || DEFAULT_CLAMP; |
| !data.style.alignItems && (data.style.alignItems = DEFAULT_ALIGN_ITEMS); |
| !data.style.justifyContent |
| && (data.style.justifyContent = DEFAULT_JUSTIFY_CONTENT); |
| Component.call(this, data); |
| } |
| Refresh.prototype = Object.create(Component.prototype); |
| extend(Refresh.prototype, proto$4); |
| extend(Refresh.prototype, { attr: attr$4 }); |
| extend(Refresh.prototype, { |
| style: extend(Object.create(Component.prototype.style), style$3) |
| }); |
| |
| Weex.registerComponent('refresh', Refresh); |
| } |
| |
| var refresh$2 = { init: init$18 }; |
| |
| __$styleInject(".weex-loading {\n // -webkit-box-align: center;\n // -webkit-align-items: center;\n // align-items: center;\n // -webkit-box-pack: center;\n // -webkit-justify-content: center;\n // justify-content: center;\n overflow: hidden;\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 0;\n background-color: #666;\n}",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var parents$1 = ['scroller', 'list', 'vlist']; |
| |
| var DEFAULT_CLAMP$1 = 130; |
| var DEFAULT_ALIGN_ITEMS$1 = 'center'; |
| var DEFAULT_JUSTIFY_CONTENT$1 = 'center'; |
| |
| function adjustHeight$1 (loading, val) { |
| loading.node.style.height = val + 'px'; |
| } |
| |
| function handleLoading (loading, e) { |
| loading.node.style.height = loading.clamp + 'px'; |
| loading.dispatchEvent('loading'); |
| loading.isLoading = true; |
| } |
| |
| function show$1 (loading) { |
| loading.display = true; |
| loading.node.style.display = '-webkit-box'; |
| loading.node.style.display = '-webkit-flex'; |
| loading.node.style.display = 'flex'; |
| } |
| |
| function hide$4 (loading) { |
| loading.display = false; |
| loading.node.style.display = 'none'; |
| loading.isLoading = false; |
| } |
| |
| var proto$5 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('weex-container'); |
| node.classList.add('weex-loading'); |
| return node |
| }, |
| |
| onAppend: function onAppend () { |
| var parent = this.getParent(); |
| var self = this; |
| var scrollWrapHeight = parent.node.getBoundingClientRect().height; |
| if (parents$1.indexOf(parent.data.type) === -1) { |
| // not in a scroller or a list |
| return |
| } |
| this.loadingPlaceholder = document.createElement('div'); |
| this.loadingPlaceholder.classList.add('weex-loading-placeholder'); |
| this.loadingPlaceholder.style.display = 'none'; |
| this.loadingPlaceholder.style.width = '0px'; |
| this.loadingPlaceholder.style.height = '0px'; |
| var scrollElement = parent.scrollElement || parent.listElement; |
| scrollElement.insertBefore(this.loadingPlaceholder, this.node); |
| parent.node.appendChild(this.node); |
| parent.scroller.addEventListener('pullup', function (e) { |
| if (self.isLoading) { |
| return |
| } |
| var obj = e.scrollObj; |
| adjustHeight$1(self, Math.abs( |
| obj.getScrollHeight() - obj.getScrollTop() - scrollWrapHeight)); |
| if (!self.display) { |
| show$1(self); |
| } |
| }); |
| parent.scroller.addEventListener('pullupend', function (e) { |
| if (self.isLoading) { |
| return |
| } |
| handleLoading(self, e); |
| }); |
| } |
| }; |
| |
| var attr$5 = { |
| display: function (val) { |
| if (val === 'show') { |
| setTimeout(function () { |
| show$1(this); |
| }.bind(this), 0); |
| } |
| else if (val === 'hide') { |
| setTimeout(function () { |
| hide$4(this); |
| }.bind(this), 0); |
| } |
| else { |
| console.error('[h5-render] attr \'display\' of <refresh>\': value ' |
| + val |
| + ' is invalid. Should be \'show\' or \'hide\''); |
| } |
| } |
| }; |
| |
| var style$4 = { |
| height: function (val) { |
| val = parseFloat(val); |
| if (Number.isNaN(val) || val < 0) { |
| return console.warn('[h5-render] <loading>\'s height (' + val + ') is invalid.') |
| } |
| this.clamp = val; |
| } |
| }; |
| |
| function init$19 (Weex) { |
| var Component = Weex.Component; |
| var extend = Weex.utils.extend; |
| |
| function Loading (data) { |
| this.clamp = (data.style.height || DEFAULT_CLAMP$1); |
| !data.style.alignItems && (data.style.alignItems = DEFAULT_ALIGN_ITEMS$1); |
| !data.style.justifyContent |
| && (data.style.justifyContent = DEFAULT_JUSTIFY_CONTENT$1); |
| Component.call(this, data); |
| } |
| Loading.prototype = Object.create(Component.prototype); |
| extend(Loading.prototype, proto$5); |
| extend(Loading.prototype, { attr: attr$5 }); |
| extend(Loading.prototype, { |
| style: extend(Object.create(Component.prototype.style), style$4) |
| }); |
| |
| Weex.registerComponent('loading', Loading); |
| } |
| |
| var loading = { init: init$19 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var Scrollable = { |
| init: function (Weex) { |
| Weex.install(list); |
| Weex.install(scroller); |
| Weex.install(refresh$2); |
| Weex.install(loading); |
| } |
| } |
| |
| /* eslint-disable */ |
| ; |
| /* eslint-enable */ |
| |
| (typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a,b,c,d){function e(a){return(3*k*a+2*l)*a+m}function f(a){return((k*a+l)*a+m)*a}function g(a){return((n*a+o)*a+p)*a}function h(a){for(var b,c,d=a,g=0;8>g;g++){if(c=f(d)-a,Math.abs(c)<j){ return d; }if(b=e(d),Math.abs(b)<j){ break; }d-=c/b;}var h=1,i=0;for(d=a;h>i;){if(c=f(d)-a,Math.abs(c)<j){ return d; }c>0?h=d:i=d,d=(h+i)/2;}return d}function i(a){return g(h(a))}var j=1e-6,k=3*a-3*c+1,l=3*c-6*a,m=3*a,n=3*b-3*d+1,o=3*d-6*b,p=3*b;return i}b.cubicbezier=c,b.cubicbezier.linear=c(0,0,1,1),b.cubicbezier.ease=c(.25,.1,.25,1),b.cubicbezier.easeIn=c(.42,0,1,1),b.cubicbezier.easeOut=c(0,0,.58,1),b.cubicbezier.easeInOut=c(.42,0,.58,1);}(window,window.lib||(window.lib={})); |
| |
| (typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a){return setTimeout(a,l)}function d(a){clearTimeout(a);}function e(){var a={},b=new m(function(b,c){a.resolve=b,a.reject=c;});return a.promise=b,a}function f(a,b){return["then","catch"].forEach(function(c){b[c]=function(){return a[c].apply(a,arguments)};}),b}function g(b){var c,d,h=!1;this.request=function(){h=!1;var g=arguments;return c=e(),f(c.promise,this),d=n(function(){h||c&&c.resolve(b.apply(a,g));}),this},this.cancel=function(){return d&&(h=!0,o(d),c&&c.reject("CANCEL")),this},this.clone=function(){return new g(b)};}function h(a,b){"function"==typeof b&&(b={0:b});for(var c=a/l,d=1/c,e=[],f=Object.keys(b).map(function(a){return parseInt(a)}),h=0;c>h;h++){var i=f[0],j=d*h;if(null!=i&&100*j>=i){var k=b[""+i];k instanceof g||(k=new g(k)),e.push(k),f.shift();}else { e.length&&e.push(e[e.length-1].clone()); }}return e}function i(a){var c;return"string"==typeof a||a instanceof Array?b.cubicbezier?"string"==typeof a?b.cubicbezier[a]&&(c=b.cubicbezier[a]):a instanceof Array&&4===a.length&&(c=b.cubicbezier.apply(b.cubicbezier,a)):console.error("require lib.cubicbezier"):"function"==typeof a&&(c=a),c}function j(a,b,c){var d,g=h(a,c),j=1/(a/l),k=0,m=i(b);if(!m){ throw new Error("unexcept timing function"); }var n=!1;this.play=function(){function a(){var c=j*(k+1).toFixed(10),e=g[k];e.request(c.toFixed(10),b(c).toFixed(10)).then(function(){n&&(k===g.length-1?(n=!1,d&&d.resolve("FINISH"),d=null):(k++,a()));},function(){});}if(!n){ return n=!0,d||(d=e(),f(d.promise,this)),a(),this }},this.stop=function(){return n?(n=!1,g[k]&&g[k].cancel(),this):void 0};}var k=60,l=1e3/k,m=a.Promise||b.promise&&b.promise.ES6Promise,n=window.requestAnimationFrame||window.msRequestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||c,o=window.cancelAnimationFrame||window.msCancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||d;(n===c||o===d)&&(n=c,o=d),b.animation=function(a,b,c){return new j(a,b,c)},b.animation.frame=function(a){return new g(a)},b.animation.requestFrame=function(a){var b=new g(a);return b.request()};}(window,window.lib||(window.lib={})); |
| |
| __$styleInject("[data-ctrl-name=\"carrousel\"] {\n position: relative;\n -webkit-transform: translateZ(1px);\n -ms-transform: translateZ(1px);\n transform: translateZ(1px);\n}",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* eslint-disable */ |
| |
| |
| var _fallback = false; |
| |
| var raf = window.requestAnimationFrame |
| || window.webkitRequestAnimationFrame; |
| if (!raf) { |
| _fallback = true; |
| raf = function (callback) { |
| return setTimeout$2(callback, 16) |
| }; |
| } |
| var caf = window.cancelAnimationFrame |
| || window.webkitCancelAnimationFrame; |
| if (!caf && _fallback) { |
| caf = function (id) { |
| return clearTimeout$2(id) |
| }; |
| } else if (!caf) { |
| caf = function() {}; |
| } |
| |
| var MAX = (Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1) - 1; |
| |
| var _idMap = {}; |
| var _globalId = 0; |
| |
| function _getGlobalId() { |
| _globalId = (_globalId + 1) % MAX; |
| if (_idMap[_globalId]) { |
| return _getGlobalId() |
| } |
| return _globalId |
| } |
| |
| function setTimeout$2 (cb, ms) { |
| var id = _getGlobalId(); |
| var start = Date.now(); |
| _idMap[id] = raf(function loop() { |
| if (!_idMap[id] && _idMap[id] !== 0) { |
| return |
| } |
| var ind = Date.now() - start; |
| if (ind < ms) { |
| _idMap[id] = raf(loop); |
| } else { |
| delete _idMap[id]; |
| cb(); |
| } |
| }); |
| return id |
| } |
| |
| function clearTimeout$2 (id) { |
| var tid = _idMap[id]; |
| tid && caf(tid); |
| delete _idMap[id]; |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* eslint-disable */ |
| |
| |
| // require('./gesture') |
| var doc$2 = window.document; |
| var ua$2 = window.navigator.userAgent; |
| var Firefox$1 = !!ua$2.match(/Firefox/i); |
| var IEMobile$1 = !!ua$2.match(/IEMobile/i); |
| var stylePrefix$2 = Firefox$1 ? 'Moz' : IEMobile$1 ? 'ms' : 'webkit'; |
| |
| var setTimeout$1 = setTimeout$2; |
| var clearTimeout$1 = clearTimeout$2; |
| |
| function getTransformOffset$1(element) { |
| var offset = { x: 0, y: 0 }; |
| var transform = getComputedStyle(element)[stylePrefix$2 + 'Transform']; |
| var regMatrix3d = new RegExp('^matrix3d\\((?:[-\\d.]+,\\s*){12}([-\\d.]+),' |
| + '\\s*([-\\d.]+)(?:,\\s*[-\\d.]+){2}\\)'); |
| var regMatrix = /^matrix\((?:[-\d.]+,\s*){4}([-\d.]+),\s*([-\d.]+)\)$/; |
| var matched; |
| |
| if (transform !== 'none') { |
| if ((matched = transform.match(regMatrix3d) |
| || transform.match(regMatrix))) { |
| offset.x = parseFloat(matched[1]) || 0; |
| offset.y = parseFloat(matched[2]) || 0; |
| } |
| } |
| |
| return offset |
| } |
| |
| var CSSMatrix$1 = IEMobile$1 ? 'MSCSSMatrix' : 'WebKitCSSMatrix'; |
| var has3d$1 = !!Firefox$1 || CSSMatrix$1 in window && 'm11' in new window[CSSMatrix$1](); |
| function getTranslate$1(x, y) { |
| x = parseFloat(x); |
| y = parseFloat(y); |
| |
| if (x != 0) { |
| x += 'px'; |
| } |
| |
| if (y != 0) { |
| y += 'px'; |
| } |
| |
| if (has3d$1) { |
| return 'translate3d(' + x + ', ' + y + ', 0)' |
| } |
| |
| return 'translate(' + x + ', ' + y + ')' |
| } |
| |
| var slice$2 = Array.prototype.slice; |
| function ArrayFrom(a) { |
| return slice$2.call(a) |
| } |
| |
| var incId = 0; |
| function Carrousel(element, options) { |
| var that = this; |
| var views = []; |
| var pages = {}; |
| var id = Date.now() + '-' + (++incId); |
| var root = document.createDocumentFragment(); |
| |
| if (arguments.length === 1 && !(arguments[0] instanceof HTMLElement)) { |
| options = arguments[0]; |
| element = null; |
| } |
| |
| if (!element) { |
| element = document.createElement('ul'); |
| root.appendChild(element); |
| } |
| options = options || {}; |
| |
| element.setAttribute('data-ctrl-name', 'carrousel'); |
| element.setAttribute('data-ctrl-id', id); |
| |
| function fireEvent(name, extra) { |
| var ev = doc$2.createEvent('HTMLEvents'); |
| ev.initEvent(name, false, false); |
| if (extra) { |
| for (var key in extra) { |
| ev[key] = extra[key]; |
| } |
| } |
| root.dispatchEvent(ev); |
| } |
| |
| element.style.position = 'relative'; |
| element.style[stylePrefix$2 + 'Transform'] = getTranslate$1(0, 0); |
| |
| var transformOffset = 0; |
| var items = {}; |
| var itemLength = 0; |
| var itemStep = options.step || element.getBoundingClientRect().width; |
| var itemIndex = 0; |
| |
| items.add = function (html) { |
| var li = document.createElement('li'); |
| li.style.display = 'none'; |
| li.style.float = 'left'; |
| li.index = itemLength; |
| if (typeof html === 'string') { |
| li.innerHTML = html; |
| } else if (html instanceof HTMLElement) { |
| li.appendChild(html); |
| } |
| element.appendChild(li); |
| |
| Object.defineProperty(items, itemLength + '', { |
| get: function () { |
| return li |
| } |
| }); |
| |
| itemLength++; |
| return li |
| }; |
| |
| function normalizeIndex(index) { |
| while (index < 0) { |
| index += itemLength; |
| } |
| |
| while (index >= itemLength) { |
| index -= itemLength; |
| } |
| |
| return index |
| } |
| |
| items.get = function (index) { |
| return items[normalizeIndex(index)] |
| }; |
| |
| items.getCloned = function (index) { |
| var index = normalizeIndex(index); |
| var item = element.querySelector('[cloned="cloned-' + index + '"]'); |
| var originalItem = items[index]; |
| |
| // If there a _listeners attribute on the dom element |
| // then clone the _listeners as well for the events' binding |
| function cloneEvents(origin, clone, deep) { |
| var listeners = origin._listeners; |
| if (listeners) { |
| clone._listeners = listeners; |
| for (var type in listeners) { |
| clone.addEventListener(type, listeners[type]); |
| } |
| } |
| if (deep && origin.children && origin.children.length) { |
| for (var i = 0, l = origin.children.length; i < l; i++) { |
| cloneEvents(origin.children[i], clone.children[i], deep); |
| } |
| } |
| } |
| |
| if (!item) { |
| item = originalItem.cloneNode(true); |
| cloneEvents(originalItem, item, true); |
| |
| element.appendChild(item); |
| item.setAttribute('cloned', 'cloned-' + index); |
| item.index = index; |
| } |
| |
| return item |
| }; |
| |
| function activate(index) { |
| if (itemLength === 0) { |
| return |
| } |
| |
| var curItem = items.get(index); |
| var prevItem; |
| var nextItem; |
| |
| if (itemLength > 1) { |
| prevItem = items.get(index - 1); |
| |
| if (itemLength === 2) { |
| nextItem = items.getCloned(index + 1); |
| } else { |
| nextItem = items.get(index + 1); |
| } |
| |
| curItem.style.left = -transformOffset + 'px'; |
| prevItem.style.left = (-transformOffset - itemStep) + 'px'; |
| nextItem.style.left = (-transformOffset + itemStep) + 'px'; |
| } |
| |
| itemIndex = curItem.index; |
| |
| fireEvent('change', { |
| prevItem: prevItem, |
| curItem: curItem, |
| nextItem: nextItem |
| }); |
| } |
| |
| items.slide = function (index) { |
| if (itemLength === 0) { |
| return |
| } |
| |
| if (itemLength === 1) { |
| index = 0; |
| } |
| |
| var startOffset = getTransformOffset$1(element).x; |
| var endOffset = transformOffset + itemStep * (-index); |
| var interOffset = endOffset - startOffset; |
| |
| if (interOffset === 0) { |
| return |
| } |
| |
| var anim = new lib.animation( |
| 400, |
| lib.cubicbezier.ease, |
| function (i1, i2) { |
| element.style[stylePrefix$2 + 'Transform'] |
| = getTranslate$1(startOffset + interOffset * i2, 0); |
| }).play().then(function () { |
| transformOffset = endOffset; |
| element.style[stylePrefix$2 + 'Transform'] = getTranslate$1(endOffset, 0); |
| index && activate(itemIndex + index); |
| }); |
| }; |
| |
| items.next = function () { |
| items.slide(1); |
| }; |
| |
| items.prev = function () { |
| items.slide(-1); |
| }; |
| |
| ArrayFrom(element.children).forEach(function (el) { |
| el.style.position = 'absolute'; |
| el.style.top = '0'; |
| el.style.left = itemLength * itemStep + 'px'; |
| el.style.float = 'left'; |
| el.index = itemLength; |
| Object.defineProperty(items, itemLength + '', { |
| get: function () { |
| return el |
| } |
| }); |
| |
| itemLength++; |
| }); |
| |
| Object.defineProperty(this, 'items', { |
| get: function () { |
| return items |
| } |
| }); |
| |
| Object.defineProperty(items, 'length', { |
| get: function () { |
| return itemLength |
| } |
| }); |
| |
| Object.defineProperty(items, 'index', { |
| get: function () { |
| return itemIndex |
| } |
| }); |
| |
| Object.defineProperty(items, 'step', { |
| get: function () { |
| return itemStep |
| }, |
| |
| set: function (v) { |
| itemStep = v; |
| } |
| }); |
| |
| var starting = false; |
| var playing = false; |
| var isSliding = false; |
| this.play = function () { |
| if (!starting) { |
| starting = true; |
| return activate(0) |
| } |
| |
| if (!!playing) { |
| return |
| } |
| |
| playing = setTimeout$1(function play() { |
| isSliding = true; |
| items.next(); |
| setTimeout$1(function () { |
| isSliding = false; |
| }, 500); |
| playing = setTimeout$1(play, 400 + playInterval); |
| }, 400 + playInterval); |
| }; |
| |
| this.stop = function () { |
| if (!playing) { |
| return |
| } |
| clearTimeout$1(playing); |
| setTimeout$1(function () { |
| playing = false; |
| }, 500); |
| }; |
| |
| var autoplay = false; |
| var readyToPlay = false; |
| Object.defineProperty(this, 'autoplay', { |
| get: function () { |
| return autoplay |
| }, |
| set: function (v) { |
| autoplay = !!v; |
| if (readyToPlay) { |
| clearTimeout$1(readyToPlay); |
| readyToPlay = false; |
| } |
| if (autoplay) { |
| readyToPlay = setTimeout$1(function () { |
| that.play(); |
| }, 2000); |
| } else { |
| that.stop(); |
| } |
| } |
| }); |
| this.autoplay = !!options.autoplay; |
| |
| var playInterval = 1500; |
| Object.defineProperty(this, 'playInterval', { |
| get: function () { |
| return playInterval |
| }, |
| set: function (n) { |
| playInterval = n; |
| } |
| }); |
| this.playInterval = !!options.playInterval || 1500; |
| |
| if (options.useGesture) { |
| var panning = false; |
| var displacement; |
| element.addEventListener('panstart', function (e) { |
| if (!e.isVertical && !(panning && isSliding)) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| |
| if (autoplay) { |
| that.stop(); |
| } |
| |
| displacement = 0; |
| panning = true; |
| } |
| }); |
| |
| element.addEventListener('panmove', function (e) { |
| if (!e.isVertical && panning) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| displacement = e.displacementX; |
| element.style[stylePrefix$2 + 'Transform'] |
| = getTranslate$1(transformOffset + displacement, 0); |
| } |
| }); |
| |
| element.addEventListener('panend', function (e) { |
| if (!e.isVertical && panning) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| panning = false; |
| if (e.isSwipe) { |
| if (displacement < 0) { |
| items.next(); |
| } else { |
| items.prev(); |
| } |
| } else { |
| if (Math.abs(displacement) < itemStep / 2) { |
| items.slide(0); |
| } else { |
| items.slide(displacement < 0?1:-1); |
| } |
| } |
| |
| if (autoplay) { |
| setTimeout$1(function () { |
| that.play(); |
| }, 2000); |
| } |
| } |
| }, false); |
| |
| element.addEventListener('swipe', function (e) { |
| if (!e.isVertical) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| } |
| }); |
| } |
| |
| this.addEventListener = function (name, handler) { |
| this.root.addEventListener(name, handler, false); |
| }; |
| |
| this.removeEventListener = function (name, handler) { |
| this.root.removeEventListener(name, handler, false); |
| }; |
| |
| this.root = root; |
| this.element = element; |
| } |
| |
| !lib && (lib = {}); |
| lib.carrousel = Carrousel; |
| |
| __$styleInject(".slider {\n position: relative;\n}\n\n.slider .indicator-container {\n position: absolute;\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-align: center;\n box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n font-size: 0;\n}\n.slider .indicator-container .indicator {\n border-radius: 50%;\n}\n.slider .indicator-container.row {\n -webkit-box-orient: horizontal;\n box-orient: horizontal;\n -webkit-flex-direction: row;\n flex-direction: row;\n}\n.slider .indicator-container.column {\n -webkit-box-orient: vertical;\n box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n}\n",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global lib */ |
| |
| var DEFAULT_INTERVAL = 3000; |
| |
| var extend$1; |
| var Component$2; |
| |
| function idleWhenPageDisappear (slider) { |
| function handlePageShow () { |
| slider.isPageShow = true; |
| slider.autoPlay && !slider.isDomRendering && slider.play(); |
| } |
| function handlePageHide () { |
| slider.isPageShow = false; |
| slider.stop(); |
| } |
| global.addEventListener('pageshow', handlePageShow); |
| global.addEventListener('pagehide', handlePageHide); |
| document.addEventListener('visibilitychange', function () { |
| if (document.visibilityState === 'visible') { |
| handlePageShow(); |
| } |
| else if (document.visibilityState === 'hidden') { |
| handlePageHide(); |
| } |
| }); |
| } |
| |
| function idleWhenDomRendering (slider) { |
| global.addEventListener('renderend', function () { |
| slider.isDomRendering = false; |
| slider.autoPlay && slider.isPageShow && slider.play(); |
| }); |
| global.addEventListener('renderbegin', function () { |
| slider.isDomRendering = true; |
| slider.stop(); |
| }); |
| } |
| |
| function updateIndicators (slider) { |
| slider.indicator && slider.indicator.setIndex(slider.currentIndex); |
| } |
| |
| function getSliderChangeHandler (slider) { |
| if (!slider._sliderChangeHandler) { |
| slider._sliderChangeHandler = function (e) { |
| var index = this.carrousel.items.index; |
| this.currentIndex = index; |
| updateIndicators(this); |
| this.dispatchEvent('change', { index: index }); |
| }.bind(slider); |
| } |
| return slider._sliderChangeHandler |
| } |
| |
| function doRender (slider) { |
| slider.createChildren(); |
| slider.onAppend(); |
| } |
| |
| var proto$6 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('slider'); |
| node.classList.add('weex-container'); |
| node.style.position = 'relative'; |
| node.style.overflow = 'hidden'; |
| return node |
| }, |
| |
| createChildren: function createChildren () { |
| var this$1 = this; |
| |
| var componentManager = this.getComponentManager(); |
| |
| // recreate slider container. |
| if (this.sliderContainer) { |
| this.node.removeChild(this.sliderContainer); |
| } |
| if (this.indicator) { |
| this.indicator.node.parentNode.removeChild(this.indicator.node); |
| } |
| this.children = []; |
| |
| var sliderContainer = document.createElement('ul'); |
| sliderContainer.style.listStyle = 'none'; |
| this.node.appendChild(sliderContainer); |
| this.sliderContainer = sliderContainer; |
| |
| var children = this.data.children; |
| var fragment = document.createDocumentFragment(); |
| var indicatorData, width, height; |
| var childWidth = 0; |
| var childHeight = 0; |
| |
| if (children && children.length) { |
| for (var i = 0; i < children.length; i++) { |
| var child = (void 0); |
| children[i].instanceId = this$1.data.instanceId; |
| if (children[i].type === 'indicator') { |
| indicatorData = extend$1(children[i], { |
| extra: { |
| amount: children.length - 1, |
| index: 0 |
| } |
| }); |
| } |
| else { |
| child = componentManager.createElement(children[i], 'li'); |
| this$1.children.push(child); |
| fragment.appendChild(child.node); |
| width = child.data.style.width || 0; |
| height = child.data.style.height || 0; |
| width > childWidth && (childWidth = width); |
| height > childHeight && (childHeight = height); |
| child.parentRef = this$1.data.ref; |
| } |
| } |
| // append indicator |
| if (indicatorData) { |
| indicatorData.extra.width = this.data.style.width || childWidth; |
| indicatorData.extra.height = this.data.style.height || childHeight; |
| this.indicator = componentManager.createElement(indicatorData); |
| this.indicator.parentRef = this.data.ref; |
| this.indicator.slider = this; |
| this.node.appendChild(this.indicator.node); |
| } |
| |
| sliderContainer.style.height = this.data.style.height + 'px'; |
| sliderContainer.appendChild(fragment); |
| } |
| }, |
| |
| appendChild: function appendChild (data) { |
| var children = this.data.children || (this.data.children = []); |
| children.push(data); |
| doRender(this); |
| if (this.children.length > 0) { |
| return this.children[this.children.length - 1] |
| } |
| }, |
| |
| insertBefore: function insertBefore (child, before) { |
| var children = this.data.children; |
| var childIndex = -1; |
| for (var i = 0, l = children.length; i < l; i++) { |
| if (children[i].ref === before.data.ref) { |
| childIndex = i; |
| break |
| } |
| } |
| children.splice(childIndex, 0, child.data); |
| doRender(this); |
| if (this.children.length > 0) { |
| return this.children[this.children.length - 1] |
| } |
| }, |
| |
| removeChild: function removeChild (child) { |
| var children = this.data.children; |
| if (children) { |
| for (var i = 0; i < children.length; i++) { |
| if (child.data.ref === children[i].ref) { |
| children.splice(i, 1); |
| break |
| } |
| } |
| } |
| doRender(this); |
| }, |
| |
| onAppend: function onAppend () { |
| if (this.carrousel) { |
| this.carrousel.removeEventListener('change', getSliderChangeHandler(this)); |
| this.carrousel.stop(); |
| this.carrousel = null; |
| } |
| var Carrousel = lib.carrousel; |
| this.carrousel = new Carrousel(this.sliderContainer, { |
| autoplay: this.autoPlay, |
| useGesture: true |
| }); |
| |
| this.carrousel.playInterval = this.interval; |
| this.carrousel.addEventListener('change', getSliderChangeHandler(this)); |
| this.currentIndex = 0; |
| |
| // preload all images for slider |
| // because: |
| // 1. lib-img doesn't listen to event transitionend |
| // 2. even if we fire lazy load in slider's change event handler, |
| // the next image still won't be preloaded utill the moment it |
| // slides into the view, which is too late. |
| if (this.preloadImgsTimer) { |
| clearTimeout(this.preloadImgsTimer); |
| } |
| // The time just before the second slide appear and enough |
| // for all child elements to append is ok. |
| var preloadTime = 0.8; |
| this.preloadImgsTimer = setTimeout(function () { |
| var imgs = this.carrousel.element.querySelectorAll('.weex-img'); |
| for (var i = 0, l = imgs.length; i < l; i++) { |
| var img = imgs[i]; |
| var iLazySrc = img.getAttribute('i-lazy-src'); |
| var imgSrc = img.getAttribute('img-src'); |
| if (iLazySrc) { |
| img.style.backgroundImage = 'url(' + iLazySrc + ')'; |
| } |
| else if (imgSrc) { |
| img.style.backgroundImage = 'url(' + imgSrc + ')'; |
| } |
| img.removeAttribute('i-lazy-src'); |
| img.removeAttribute('img-src'); |
| } |
| }.bind(this), preloadTime * 1000); |
| |
| // avoid page scroll when panning |
| var panning = false; |
| this.carrousel.element.addEventListener('panstart', function (e) { |
| if (!e.isVertical) { |
| panning = true; |
| } |
| }); |
| this.carrousel.element.addEventListener('panend', function (e) { |
| if (!e.isVertical) { |
| panning = false; |
| } |
| }); |
| |
| document.addEventListener('touchmove', function (e) { |
| if (panning) { |
| e.preventDefault(); |
| return false |
| } |
| return true |
| }); |
| |
| Component$2.prototype.onAppend.call(this); |
| }, |
| |
| play: function play () { |
| this.carrousel.play(); |
| }, |
| |
| stop: function stop () { |
| this.carrousel.stop(); |
| }, |
| |
| slideTo: function slideTo (index) { |
| var offset = index - this.currentIndex; |
| this.carrousel.items.slide(offset); |
| } |
| }; |
| |
| var attr$6 = { |
| interval: function (val) { |
| this.interval = parseInt(val) || DEFAULT_INTERVAL; |
| if (this.carrousel) { |
| this.carrousel.playInterval = this.interval; |
| } |
| }, |
| |
| index: function (val) { |
| var _this = this; |
| function doSlide (index) { |
| index = parseInt(index); |
| if (index < 0 || isNaN(index)) { |
| return console.error('[h5-render] invalid index ', index) |
| } |
| _this.slideTo(index); |
| if (_this._updateIndex) { |
| window.removeEventListener('renderend', _this._updateIndex); |
| } |
| } |
| if (this.isDomRendering) { |
| var pre = !!this._updateIndex; |
| this._updateIndex = function () { |
| _this.autoPlay && _this.isPageShow && _this.play(); |
| doSlide(val); |
| }; |
| !pre && window.addEventListener('renderend', this._updateIndex); |
| } |
| else { |
| doSlide(val); |
| } |
| }, |
| |
| playstatus: function (val) { |
| this.playstatus = val && val !== 'false'; |
| this.autoPlay = this.playstatus; |
| if (this.carrousel) { |
| if (this.playstatus) { |
| this.play(); |
| } |
| else { |
| this.stop(); |
| } |
| } |
| }, |
| |
| // support playstatus' alias auto-play for compatibility |
| autoPlay: function (val) { |
| this.attr.playstatus.call(this, val); |
| } |
| }; |
| |
| var event$1 = { |
| change: { |
| updator: function () { |
| return { |
| attrs: { |
| index: this.currentIndex |
| } |
| } |
| } |
| } |
| }; |
| |
| function init$20 (Weex) { |
| Component$2 = Weex.Component; |
| extend$1 = Weex.utils.extend; |
| |
| function Slider (data) { |
| this.autoPlay = false; // default value is false. |
| this.interval = DEFAULT_INTERVAL; |
| this.direction = 'row'; // 'column' is not temporarily supported. |
| this.children = []; |
| this.isPageShow = true; |
| this.isDomRendering = true; |
| |
| // bind event 'pageshow', 'pagehide' and 'visibilitychange' on window. |
| idleWhenPageDisappear(this); |
| // bind event 'renderBegin' and 'renderEnd' on window. |
| idleWhenDomRendering(this); |
| |
| Component$2.call(this, data); |
| } |
| Slider.prototype = Object.create(Component$2.prototype); |
| extend$1(Slider.prototype, proto$6); |
| extend$1(Slider.prototype, { attr: attr$6 }); |
| extend$1(Slider.prototype, { event: event$1 }); |
| |
| Weex.registerComponent('slider', Slider); |
| } |
| |
| var Slider = { init: init$20 }; |
| |
| __$styleInject(".weex-indicators {\n position: absolute;\n white-space: nowrap;\n}\n.weex-indicators .weex-indicator {\n float: left;\n border-radius: 50%;\n}\n",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var DEFAULT_ITEM_COLOR = '#999'; |
| var DEFAULT_ITEM_SELECTED_COLOR = '#0000ff'; |
| var DEFAULT_ITEM_SIZE = 20; |
| var DEFAULT_MARGIN_SIZE = 10; |
| |
| function resetColor (indicator) { |
| var len = indicator.items.length; |
| if (typeof indicator.index !== 'undefined' && len > indicator.index) { |
| for (var i = 0; i < len; i++) { |
| var item = indicator.items[i]; |
| if (indicator.index === i) { |
| item.classList.add('active'); |
| item.style.backgroundColor = indicator.itemSelectedColor; |
| } |
| else { |
| item.style.backgroundColor = indicator.itemColor; |
| } |
| } |
| } |
| } |
| |
| function handleClick (indicator, idx, e) { |
| indicator.slider.slideTo(idx); |
| } |
| |
| var proto$7 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('weex-indicators'); |
| node.classList.add('weex-element'); |
| node.style.position = 'absolute'; |
| this.node = node; |
| this.style.itemSize.call(this, 0); |
| this.updateStyle({ |
| left: 0, |
| top: 0, |
| itemSize: 0 |
| }); |
| return node |
| }, |
| |
| createChildren: function createChildren () { |
| var this$1 = this; |
| |
| var root = document.createDocumentFragment(); |
| for (var i = 0; i < this.amount; i++) { |
| var indicator = document.createElement('div'); |
| indicator.classList.add('weex-indicator'); |
| indicator.style.boxSizing = 'border-box'; |
| indicator.style.margin = '0 ' |
| + DEFAULT_MARGIN_SIZE |
| + 'px'; |
| indicator.style.width = this$1.itemSize + 'px'; |
| indicator.style.height = this$1.itemSize + 'px'; |
| indicator.setAttribute('index', i); |
| if (this$1.index === i) { |
| indicator.classList.add('active'); |
| indicator.style.backgroundColor = this$1.itemSelectedColor; |
| } |
| else { |
| indicator.style.backgroundColor = this$1.itemColor; |
| } |
| indicator.addEventListener('click', handleClick.bind(null, this$1, i)); |
| this$1.items[i] = indicator; |
| root.appendChild(indicator); |
| } |
| this.node.appendChild(root); |
| }, |
| |
| setIndex: function setIndex (idx) { |
| if (idx >= this.amount) { |
| return |
| } |
| var prev = this.items[this.index]; |
| var cur = this.items[idx]; |
| prev.classList.remove('active'); |
| prev.style.backgroundColor = this.itemColor; |
| cur.classList.add('active'); |
| cur.style.backgroundColor = this.itemSelectedColor; |
| this.index = idx; |
| } |
| }; |
| |
| var style$5 = { |
| itemColor: function itemColor (val) { |
| this.itemColor = val || DEFAULT_ITEM_COLOR; |
| resetColor(this); |
| }, |
| |
| itemSelectedColor: function itemSelectedColor (val) { |
| this.itemSelectedColor = val || DEFAULT_ITEM_SELECTED_COLOR; |
| resetColor(this); |
| }, |
| |
| itemSize: function itemSize (val) { |
| var this$1 = this; |
| |
| val = parseInt(val) || DEFAULT_ITEM_SIZE; |
| this.itemSize = val; |
| this.node.style.height = val + 'px'; |
| for (var i = 0, l = this.items.length; i < l; i++) { |
| this$1.items[i].style.width = val + 'px'; |
| this$1.items[i].style.height = val + 'px'; |
| } |
| }, |
| |
| width: function width (val) { |
| val = parseInt(val) || parseInt(this.sliderWidth); |
| this.virtualWrapperWidth = val; |
| }, |
| |
| height: function height (val) { |
| val = parseInt(val) || parseInt(this.sliderHeight); |
| this.virtualWrapperHeight = val; |
| }, |
| |
| top: function top (val) { |
| val = this.virtualWrapperHeight / 2 - this.itemSize / 2 + val; |
| this.node.style.bottom = ''; |
| this.node.style.top = val + 'px'; |
| }, |
| |
| bottom: function bottom (val) { |
| val = this.virtualWrapperHeight / 2 - this.itemSize / 2 + val; |
| this.node.style.top = ''; |
| this.node.style.bottom = val + 'px'; |
| }, |
| |
| left: function left (val) { |
| val = this.virtualWrapperWidth / 2 |
| - (this.itemSize + 2 * DEFAULT_MARGIN_SIZE) * this.amount / 2 + val; |
| this.node.style.right = ''; |
| this.node.style.left = val + 'px'; |
| }, |
| |
| right: function right (val) { |
| val = this.virtualWrapperWidth / 2 |
| - (this.itemSize + 2 * DEFAULT_MARGIN_SIZE) * this.amount / 2 + val; |
| this.node.style.left = ''; |
| this.node.style.right = val + 'px'; |
| } |
| }; |
| |
| function init$21 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| |
| // Style supported: |
| // position: (default - absolute) |
| // itemColor: color of indicator dots |
| // itemSelectedColor: color of the selected indicator dot |
| // itemSize: size of indicators |
| // other layout styles |
| function Indicator (data) { |
| this.direction = 'row'; // 'column' is not temporarily supported. |
| this.amount = data.extra.amount; |
| this.index = data.extra.index; |
| this.sliderWidth = data.extra.width; |
| this.sliderHeight = data.extra.height; |
| var styles = data.style || {}; |
| this.data = data; |
| this.style.width.call(this, styles.width); |
| this.style.height.call(this, styles.height); |
| this.itemColor = styles.itemColor || DEFAULT_ITEM_COLOR; |
| this.itemSelectedColor = styles.itemSelectedColor |
| || DEFAULT_ITEM_SELECTED_COLOR; |
| this.items = []; |
| Atomic.call(this, data); |
| } |
| Indicator.prototype = Object.create(Atomic.prototype); |
| extend(Indicator.prototype, proto$7); |
| extend(Indicator.prototype, { |
| style: extend(Object.create(Atomic.prototype.style), style$5) |
| }); |
| |
| Weex.registerComponent('indicator', Indicator); |
| } |
| |
| var Indicator = { init: init$21 }; |
| |
| __$styleInject(".tab-header {\n position: relative;\n width: 10rem;\n font-size: 14px;\n color: #333;\n}\n.tab-header .header-bar {\n height: 1.17rem;\n line-height: 1.17rem;\n display: none;\n color: #999;\n padding-left: 0.4rem;\n}\n.tab-header .header-body {\n margin-right: 1.07rem;\n overflow-x: auto;\n overflow-y: hidden;\n}\n.tab-header .header-body::-webkit-scrollbar {\n width: 0;\n height: 0;\n overflow: hidden;\n}\n.tab-header .fold-toggle {\n position: absolute;\n top: 0.59rem;\n -webkit-transform: translateY(-50%);\n right: 0.29rem;\n width: 0.48rem;\n height: 0.48rem;\n line-height: 0.48rem;\n text-align: center;\n z-index: 99;\n font-size: 14px;\n}\n.tab-header.unfold-header {\n position: fixed !important;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.tabheader {\n list-style: none;\n white-space: nowrap;\n height: 1.17rem;\n line-height: 1.17rem;\n}\n.tabheader .th-item {\n padding-left: 0.72rem;\n position: relative;\n display: inline-block;\n}\n.tabheader .hl-icon {\n width: 0.4rem;\n height: 0.4rem;\n line-height: 0.4rem;\n text-align: center;\n position: absolute;\n top: 50%;\n -webkit-transform: translateY(-50%);\n left: 0.24rem;\n font-size: 14px;\n}\n\n.unfold-header .header-bar {\n display: block;\n}\n.unfold-header .fold-toggle {\n -webkit-transform: translateY(-50%) rotate(180deg);\n}\n.unfold-header .header-body {\n margin-right: 0;\n padding: 0.24rem;\n}\n.unfold-header .tabheader {\n display: block;\n height: auto;\n}\n.unfold-header .th-item {\n box-sizing: border-box;\n float: left;\n width: 33.3333%;\n height: 1.01rem;\n line-height: 1.01rem;\n}\n.unfold-header .hl-icon {\n margin-right: 0;\n position: absolute;\n}\n.unfold-header.tabheader-mask {\n display: block;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.6);\n}\n\n.tabheader-mask {\n display: none;\n position: fixed;\n left: 0;\n top: 0;\n}\n\n@font-face {\n font-family: \"iconfont\";\n src: url(\"data:application/x-font-ttf;charset=utf-8;base64,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R7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEkARQrLbA7LLAuKy6xJAEUKy2wPCywLyshIyAgPLAEI0IjOLEkARQrsARDLrAkKy2wPSywABUgR7AAI0KyAAEBFRQTLrAqKi2wPiywABUgR7AAI0KyAAEBFRQTLrAqKi2wPyyxAAEUE7ArKi2wQCywLSotsEEssAAWRSMgLiBGiiNhOLEkARQrLbBCLLAJI0KwQSstsEMssgAAOistsEQssgABOistsEUssgEAOistsEYssgEBOistsEcssgAAOystsEgssgABOystsEkssgEAOystsEossgEBOystsEsssgAANystsEwssgABNystsE0ssgEANystsE4ssgEBNystsE8ssgAAOSstsFAssgABOSstsFEssgEAOSstsFIssgEBOSstsFMssgAAPCstsFQssgABPCstsFUssgEAPCstsFYssgEBPCstsFcssgAAOCstsFgssgABOCstsFkssgEAOCstsFossgEBOCstsFsssDArLrEkARQrLbBcLLAwK7A0Ky2wXSywMCuwNSstsF4ssAAWsDArsDYrLbBfLLAxKy6xJAEUKy2wYCywMSuwNCstsGEssDErsDUrLbBiLLAxK7A2Ky2wYyywMisusSQBFCstsGQssDIrsDQrLbBlLLAyK7A1Ky2wZiywMiuwNistsGcssDMrLrEkARQrLbBoLLAzK7A0Ky2waSywMyuwNSstsGossDMrsDYrLbBrLCuwCGWwAyRQeLABFTAtAABLuADIUlixAQGOWbkIAAgAYyCwASNEILADI3CwDkUgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsAIlYbABRWMjYrACI0SzCgkFBCuzCgsFBCuzDg8FBCtZsgQoCUVSRLMKDQYEK7EGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAAAA==\") format(\"truetype\");\n}\n.iconfont {\n font-family: iconfont !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -webkit-text-stroke-width: 0.2px;\n -moz-osx-font-smoothing: grayscale;\n}\n\n[data-dpr=\"2\"] .tab-header {\n font-size: 28px;\n}\n\n[data-dpr=\"3\"] .tab-header {\n font-size: 42px;\n}\n\n[data-dpr=\"2\"] .tabheader .hl-icon {\n font-size: 28px;\n}\n\n[data-dpr=\"3\"] .tabheader .hl-icon {\n font-size: 42px;\n}\n\n[data-dpr=\"2\"] .tab-header .fold-toggle {\n font-size: 28px;\n}\n\n[data-dpr=\"3\"] .tab-header .fold-toggle {\n font-size: 42px;\n}\n",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // TODO: refactor this scss code since this is strongly |
| // dependent on lib.flexible other than the value of |
| // scale. |
| function initFoldBtn (tabheader) { |
| var node = tabheader.node; |
| var btn = document.createElement('span'); |
| btn.className = 'fold-toggle iconfont'; |
| btn.innerHTML = ''; |
| node.appendChild(btn); |
| |
| btn.addEventListener('click', function () { |
| if (tabheader.unfolding) { |
| folding(tabheader); |
| } |
| else { |
| unfolding(tabheader); |
| } |
| }); |
| } |
| |
| function initMask (tabheader) { |
| var mask = document.createElement('div'); |
| mask.className = 'tabheader-mask'; |
| tabheader.mask = mask; |
| // stop default behavior: page moving. |
| mask.addEventListener('touchmove', function (evt) { |
| evt.preventDefault(); |
| }); |
| // click to unfold. |
| mask.addEventListener('click', function () { |
| folding(tabheader); |
| }); |
| |
| document.body.appendChild(mask); |
| } |
| |
| function unfolding (tabheader) { |
| // mark the initial posiiton of tabheader |
| if (!tabheader.flag) { |
| var flag = document.createComment('tabheader'); |
| tabheader.flag = flag; |
| tabheader.node.parentNode.insertBefore(flag, tabheader.node); |
| } |
| if (!tabheader.mask) { |
| initMask(tabheader); |
| } |
| |
| // record the scroll position. |
| tabheader._scrollVal = tabheader._body.scrollLeft; |
| // record the position in document. |
| tabheader._topVal = tabheader.node.getBoundingClientRect().top; |
| tabheader._styleTop = tabheader.node.style.top; |
| |
| document.body.appendChild(tabheader.node); |
| tabheader.node.classList.add('unfold-header'); |
| tabheader.node.style.height = 'auto'; |
| // recalc the position when it is unfolded. |
| var thHeight = tabheader.node.getBoundingClientRect().height; |
| if (thHeight + tabheader._topVal > window.innerHeight) { |
| tabheader._topVal = tabheader._topVal |
| + (window.innerHeight - thHeight - tabheader._topVal); |
| } |
| |
| tabheader.node.style.top = tabheader._topVal + 'px'; |
| // process mask style |
| tabheader.mask.classList.add('unfold-header'); |
| tabheader.mask.style.height = window.innerHeight + 'px'; |
| tabheader.unfolding = true; |
| } |
| |
| function folding (tabheader) { |
| if (tabheader.unfolding !== true) { |
| return |
| } |
| |
| tabheader.mask.classList.remove('unfold-header'); |
| tabheader.node.classList.remove('unfold-header'); |
| |
| tabheader.node.style.height = ''; |
| tabheader.node.style.top = tabheader._styleTop; |
| |
| // recover the position of tabheader. |
| tabheader.flag.parentNode.insertBefore(tabheader.node, tabheader.flag); |
| // recover the position of scoller. |
| tabheader._body.scrollLeft = tabheader._scrollVal; |
| |
| scrollToView(tabheader); |
| tabheader.unfolding = false; |
| } |
| |
| function initEvent (tabheader) { |
| initClickEvent(tabheader); |
| initSelectEvent(tabheader); |
| } |
| |
| // init events. |
| function initClickEvent (tabheader) { |
| var box = tabheader.box; |
| |
| box.addEventListener('click', function (evt) { |
| var target = evt.target; |
| if (target.nodeName === 'UL') { |
| return |
| } |
| |
| if (target.parentNode.nodeName === 'LI') { |
| target = target.parentNode; |
| } |
| |
| var floor = target.getAttribute('data-floor'); |
| /* eslint-disable eqeqeq */ |
| if (tabheader.data.attr.selectedIndex == floor) { |
| // Duplicated clicking, not to trigger select event. |
| return |
| } |
| /* eslint-enable eqeqeq */ |
| |
| fireEvent$4(target, 'select', { index: floor }); |
| }); |
| } |
| |
| function initSelectEvent (tabheader) { |
| var node = tabheader.node; |
| node.addEventListener('select', function (evt) { |
| var index; |
| if (evt.index !== undefined) { |
| index = evt.index; |
| } |
| else if (evt.data && evt.data.index !== undefined) { |
| index = evt.data.index; |
| } |
| |
| if (index === undefined) { |
| return |
| } |
| |
| tabheader.attr.selectedIndex.call(tabheader, index); |
| }); |
| } |
| |
| function scrollToView (tabheader, node) { |
| if (!node) { |
| var attr = tabheader.data.attr; |
| node = tabheader.node.querySelector('[data-floor="' + attr.selectedIndex + '"]'); |
| } |
| if (!node) { |
| return |
| } |
| |
| // const defaultVal = tabheader._body.scrollLeft |
| // const leftVal = defaultVal - node.offsetLeft + 300 |
| |
| var scrollVal = getScrollVal(tabheader._body.getBoundingClientRect(), node); |
| doScroll$1(tabheader._body, scrollVal); |
| } |
| |
| // scroll the tabheader. |
| // positive val means to scroll right. |
| // negative val means to scroll left. |
| function doScroll$1 (node, val, finish) { |
| if (!val) { |
| return |
| } |
| if (finish === undefined) { |
| finish = Math.abs(val); |
| } |
| |
| if (finish <= 0) { |
| return |
| } |
| |
| setTimeout(function () { |
| if (val > 0) { |
| node.scrollLeft += 2; |
| } |
| else { |
| node.scrollLeft -= 2; |
| } |
| finish -= 2; |
| |
| doScroll$1(node, val, finish); |
| }); |
| } |
| |
| // get scroll distance. |
| function getScrollVal (rect, node) { |
| var left = node.previousSibling; |
| var right = node.nextSibling; |
| var scrollVal; |
| |
| // process left-side element first. |
| if (left) { |
| var leftRect = left.getBoundingClientRect(); |
| // only need to compare the value of left. |
| if (leftRect.left < rect.left) { |
| scrollVal = leftRect.left; |
| return scrollVal |
| } |
| } |
| |
| if (right) { |
| var rightRect = right.getBoundingClientRect(); |
| // compare the value of right. |
| if (rightRect.right > rect.right) { |
| scrollVal = rightRect.right - rect.right; |
| return scrollVal |
| } |
| } |
| |
| // process current node, from left to right. |
| var nodeRect = node.getBoundingClientRect(); |
| if (nodeRect.left < rect.left) { |
| scrollVal = nodeRect.left; |
| } |
| else if (nodeRect.right > rect.right) { |
| scrollVal = nodeRect.right - rect.right; |
| } |
| |
| return scrollVal |
| } |
| |
| // trigger and broadcast events. |
| function fireEvent$4 (element, type, data) { |
| var evt = document.createEvent('Event'); |
| evt.data = data; |
| for (var k in data) { |
| if (data.hasOwnProperty(k)) { |
| evt[k] = data[k]; |
| } |
| } |
| // need bubble. |
| evt.initEvent(type, true, true); |
| |
| element.dispatchEvent(evt); |
| } |
| |
| function createHighlightIcon (code) { |
| var html = '<i class="hl-icon iconfont">' + '' + '</i>'; |
| return html |
| } |
| |
| function isValidColor (color) { |
| if (!color) { |
| return false |
| } |
| |
| if (color.charAt(0) !== '#') { |
| return false |
| } |
| |
| if (color.length !== 7) { |
| return false |
| } |
| |
| return true |
| } |
| |
| var proto$8 = { |
| create: function create () { |
| // outside container. |
| var node = document.createElement('div'); |
| node.className = 'tab-header'; |
| // tip on the top. |
| var bar = document.createElement('div'); |
| bar.className = 'header-bar'; |
| bar.textContent = 'CHANGE FLOOR'; |
| // middle layer. |
| var body = document.createElement('div'); |
| body.className = 'header-body'; |
| var box = document.createElement('ul'); |
| box.className = 'tabheader'; |
| |
| body.appendChild(box); |
| node.appendChild(bar); |
| node.appendChild(body); |
| this._bar = bar; |
| this._body = body; |
| this.box = box; |
| this.node = node; |
| // init events. |
| initFoldBtn(this); |
| initEvent(this); |
| return node |
| } |
| }; |
| |
| var attr$7 = { |
| highlightIcon: function highlightIcon () { |
| return createHighlightIcon() |
| }, |
| |
| data: function data () { |
| var attr = this.data.attr; |
| // Ensure there is a default selected value. |
| if (attr.selectedIndex === undefined) { |
| attr.selectedIndex = 0; |
| } |
| |
| var list = attr.data || []; |
| var curItem = attr.selectedIndex; |
| |
| var ret = []; |
| var itemTmpl = '<li class="th-item" data-floor="{{floor}}">' |
| + '{{hlIcon}}{{floorName}}</li>'; |
| |
| list.forEach(function (item, idx) { |
| var html = itemTmpl.replace('{{floor}}', idx); |
| /* eslint-disable eqeqeq */ |
| if (curItem == idx) { |
| html = html.replace('{{hlIcon}}', createHighlightIcon()); |
| } |
| else { |
| html = html.replace('{{hlIcon}}', ''); |
| } |
| /* eslint-enable eqeqeq */ |
| |
| html = html.replace('{{floorName}}', item); |
| |
| ret.push(html); |
| }, this); |
| |
| this.box.innerHTML = ret.join(''); |
| }, |
| |
| selectedIndex: function selectedIndex (val) { |
| var attr = this.data.attr; |
| |
| if (val === undefined) { |
| val = 0; |
| } |
| |
| // if (val == attr.selectedIndex) { |
| // return |
| // } |
| |
| attr.selectedIndex = val; |
| |
| this.attr.data.call(this); |
| |
| folding(this); |
| this.style.textHighlightColor.call(this, this.textHighlightColor); |
| } |
| }; |
| |
| var style$6 = { |
| opacity: function opacity (val) { |
| if (val === undefined || val < 0 || val > 1) { |
| val = 1; |
| } |
| |
| this.node.style.opacity = val; |
| }, |
| |
| textColor: function textColor (val) { |
| if (!isValidColor(val)) { |
| return |
| } |
| |
| this.node.style.color = val; |
| }, |
| |
| textHighlightColor: function textHighlightColor (val) { |
| if (!isValidColor(val)) { |
| return |
| } |
| this.textHighlightColor = val; |
| var attr = this.data.attr; |
| |
| var node = this.node.querySelector('[data-floor="' |
| + attr.selectedIndex + '"]'); |
| if (node) { |
| node.style.color = val; |
| scrollToView(this, node); |
| } |
| } |
| }; |
| |
| function init$22 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| |
| function TabHeader (data) { |
| Atomic.call(this, data); |
| } |
| TabHeader.prototype = Object.create(Atomic.prototype); |
| extend(TabHeader.prototype, proto$8); |
| extend(TabHeader.prototype, { attr: attr$7 }); |
| extend(TabHeader.prototype, { |
| style: extend(Object.create(Atomic.prototype.style), style$6) |
| }); |
| |
| Weex.registerComponent('tabheader', TabHeader); |
| } |
| |
| var Tabheader = { init: init$22 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var appendStyle$1; |
| |
| var availableTypes = ['text', 'password', 'tel', 'email', 'url', 'date', 'time']; |
| var DEFAULT_TYPE = 'text'; |
| |
| function setPlaceholderColor (input, placeholderColor) { |
| if (!placeholderColor) { |
| return |
| } |
| var vendors$$1 = [ |
| '::-webkit-input-placeholder', |
| ':-moz-placeholder', |
| '::-moz-placeholder', |
| ':-ms-input-placeholder', |
| ':placeholder-shown' |
| ]; |
| var css = ''; |
| var cssRule = 'color: ' + placeholderColor + ';'; |
| for (var i = 0, l = vendors$$1.length; i < l; i++) { |
| css += '.' + input.className + vendors$$1[i] + '{' |
| + cssRule + '}'; |
| } |
| appendStyle$1(css, input.styleId, true); |
| } |
| |
| var proto$9 = { |
| create: function create () { |
| var node = document.createElement('input'); |
| var uuid = Math.floor(10000000000000 * Math.random()) + Date.now(); |
| this.className = 'weex-ipt-' + uuid; |
| this.styleId = 'weex-style-' + uuid; |
| node.classList.add(this.className); |
| node.classList.add('weex-element'); |
| this.placeholder && (node.placeholder = this.placeholder); |
| this.createKeybordEvent(node); |
| return node |
| }, |
| |
| // support enter key envent |
| createKeybordEvent: function createKeybordEvent (node) { |
| var this$1 = this; |
| |
| if (Array.isArray(this.data.event) && this.data.event.indexOf('return') > -1) { |
| node.addEventListener('keyup', function (ev) { |
| var code = ev.keyCode; |
| var key = ev.key; |
| if (code === 13) { |
| if (key.toLowerCase() === 'tab') { |
| key = 'next'; |
| } |
| var rightKeyType = findEnterKeyType(this$1.data.attr['returnKeyType']); |
| this$1.dispatchEvent('return', { returnKeyType: rightKeyType }); |
| } |
| }, false); |
| } |
| }, |
| |
| focus: function focus () { |
| this.node.focus(); |
| }, |
| |
| blur: function blur () { |
| this.node.blur(); |
| } |
| }; |
| |
| // updatable attributes |
| var attr$8 = { |
| disabled: function disabled (val) { |
| this.node.disabled = !!val; |
| }, |
| |
| placeholder: function placeholder (val) { |
| this.node.placeholder = val || ''; |
| }, |
| |
| value: function value (val) { |
| this.node.value = val || ''; |
| }, |
| |
| autofocus: function autofocus (val) { |
| this.node.autofocus = !!val; |
| }, |
| |
| type: function type (val) { |
| this.node.type = availableTypes.indexOf(val) !== -1 |
| ? val |
| : DEFAULT_TYPE; |
| }, |
| |
| returnKeyType: function returnKeyType (val) { |
| this.node.returnKeyType = val || ''; |
| } |
| }; |
| |
| // updatable styles |
| var style$7 = { |
| placeholderColor: function (val) { |
| setPlaceholderColor(this, val); |
| } |
| }; |
| |
| // events configurations |
| var event$2 = { |
| input: { |
| updator: function updator () { |
| return { |
| attrs: { |
| value: this.node.value |
| } |
| } |
| }, |
| extra: function extra () { |
| return { |
| value: this.node.value, |
| timestamp: Date.now() |
| } |
| } |
| }, |
| |
| change: { |
| updator: function () { |
| return { |
| attrs: { |
| value: this.node.value |
| } |
| } |
| }, |
| extra: function () { |
| return { |
| value: this.node.value, |
| timestamp: Date.now() |
| } |
| } |
| }, |
| |
| return: { |
| updator: function (obj) { |
| return { |
| attrs: { |
| value: this.node.value |
| } |
| } |
| } |
| } |
| }; |
| |
| function init$23 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend$$1 = Weex.utils.extend; |
| appendStyle$1 = Weex.utils.appendStyle; |
| |
| // attrs: |
| // - type: text|password|tel|email|url |
| // - value |
| // - placeholder |
| // - disabled |
| // - autofocus |
| function Input (data) { |
| Atomic.call(this, data); |
| } |
| Input.prototype = Object.create(Atomic.prototype); |
| extend$$1(Input.prototype, proto$9); |
| extend$$1(Input.prototype, { attr: attr$8 }); |
| extend$$1(Input.prototype, { |
| style: extend$$1(Object.create(Atomic.prototype.style), style$7) |
| }); |
| extend$$1(Input.prototype, { event: event$2 }); |
| |
| Weex.registerComponent('input', Input); |
| } |
| |
| var Input = { init: init$23 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var DEFAULT_ROWS = 2; |
| |
| /** |
| * attr: |
| * rows: default is 2. |
| * disabled |
| * placeholder |
| */ |
| |
| var proto$10 = { |
| create: function create () { |
| var node = document.createElement('textarea'); |
| node.classList.add('weex-element'); |
| node.classList.add('weex-textarea'); |
| this.createKeyboardEvent(node); |
| return node |
| }, |
| |
| // support enter key envent |
| createKeyboardEvent: function createKeyboardEvent (node) { |
| var this$1 = this; |
| |
| if (Array.isArray(this.data.event) && this.data.event.indexOf('return') > -1) { |
| node.addEventListener('keyup', function (ev) { |
| var code = ev.keyCode; |
| var key = ev.key; |
| if (code === 13) { |
| if (key.toLowerCase() === 'tab') { |
| key = 'next'; |
| } |
| var rightKeyType = findEnterKeyType(this$1.data.attr['returnKeyType']); |
| this$1.dispatchEvent('return', { returnKeyType: rightKeyType }); |
| } |
| }, false); |
| } |
| } |
| }; |
| |
| // updatable attributes |
| var attr$9 = { |
| rows: function rows (val) { |
| this.node.rows = val || DEFAULT_ROWS; |
| }, |
| disabled: function disabled (val) { |
| this.node.disabled = !!val; |
| }, |
| placeholder: function placeholder (val) { |
| this.node.placeholder = val || ''; |
| }, |
| value: function value (val) { |
| this.node.value = val || ''; |
| }, |
| autofocus: function autofocus (val) { |
| this.node.autofocus = !!val; |
| }, |
| returnKeyType: function returnKeyType (val) { |
| this.node.returnKeyType = val || ''; |
| } |
| }; |
| |
| // events configurations |
| var event$3 = { |
| input: { |
| updator: function updator () { |
| return { |
| attrs: { |
| value: this.node.value |
| } |
| } |
| }, |
| extra: function extra () { |
| return { |
| value: this.node.value, |
| timestamp: Date.now() |
| } |
| } |
| }, |
| |
| change: { |
| updator: function () { |
| return { |
| attrs: { |
| value: this.node.value |
| } |
| } |
| }, |
| extra: function () { |
| return { |
| value: this.node.value, |
| timestamp: Date.now() |
| } |
| } |
| }, |
| |
| return: { |
| updator: function (obj) { |
| return { |
| attrs: { |
| value: this.node.value |
| } |
| } |
| } |
| } |
| }; |
| |
| function init$24 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend$$1 = Weex.utils.extend; |
| |
| // attrs: |
| // - rows |
| // - disabled |
| // - placeholder |
| function Textarea (data) { |
| Atomic.call(this, data); |
| } |
| Textarea.prototype = Object.create(Atomic.prototype); |
| extend$$1(Textarea.prototype, proto$10); |
| extend$$1(Textarea.prototype, { attr: attr$9 }); |
| extend$$1(Textarea.prototype, { event: event$3 }); |
| |
| Weex.registerComponent('textarea', Textarea); |
| } |
| |
| var Textarea = { init: init$24 }; |
| |
| __$styleInject(".weex-video {\n\tbackground-color: #000;\n}",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function getProto$2 (Weex) { |
| var Atomic = Weex.Atomic; |
| return { |
| create: function create () { |
| var this$1 = this; |
| |
| var node = document.createElement('video'); |
| node.classList.add('weex-video'); |
| node.classList.add('weex-element'); |
| node.controls = true; |
| node.autoplay = this.autoPlay; |
| node.setAttribute('playsinline', ''); |
| node.setAttribute('webkit-playsinline', ''); |
| node.setAttribute('play-status', this.playStatus); |
| this.node = node; |
| if (this.autoPlay && this.playStatus === 'play') { |
| // set timer to avoid error: uncaught DOM exception: the play() request |
| // was interrupted by a new load request. |
| setTimeout(function () { |
| this$1.play(); |
| }, 0); |
| } |
| return node |
| }, |
| |
| bindEvents: function bindEvents (evts) { |
| var this$1 = this; |
| |
| Atomic.prototype.bindEvents.call(this, evts); |
| |
| // convert w3c-video events to weex-video events. |
| var evtsMap = { |
| start: 'play', |
| finish: 'ended', |
| fail: 'error' |
| }; |
| for (var evtName in evtsMap) { |
| this$1.node.addEventListener(evtsMap[evtName], function (type, e) { |
| this.dispatchEvent(type, e.data); |
| }.bind(this$1, evtName)); |
| } |
| }, |
| |
| play: function play () { |
| var src = this.node.getAttribute('src'); |
| if (!src) { |
| src = this.node.getAttribute('data-src'); |
| src && this.node.setAttribute('src', src); |
| } |
| try { |
| this.node.play(); |
| } |
| catch (err) { |
| // DO NOTHING. |
| } |
| }, |
| |
| pause: function pause () { |
| this.node.pause(); |
| }, |
| |
| stop: function stop () { |
| this.node.pause(); |
| this.node.autoplay = false; |
| this.node.setAttribute('data-src', this.node.src); |
| this.node.src = ''; |
| } |
| } |
| } |
| |
| var attr$10 = { |
| playStatus: function playStatus (val) { |
| if (val !== 'play' && val !== 'stop' && val !== 'pause') { |
| val = 'pause'; |
| } |
| if (this.playStatus === val) { |
| return |
| } |
| this.playStatus = val; |
| this.node.setAttribute('play-status', val); |
| this[this.playStatus](); |
| }, |
| |
| autoPlay: function autoPlay (val) { |
| // DO NOTHING |
| } |
| }; |
| |
| function init$25 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| |
| // attrs: |
| // - autoPlay: true | false (default: false) |
| // - playStatus: play | pause | stop |
| // - src: {string} |
| // - poster: {string} |
| // - loop: true | false (default: false) |
| // - muted: true | false (default: false) |
| // events: |
| // - start |
| // - pause |
| // - finish |
| // - fail |
| function Video (data) { |
| var autoPlay = data.attr.autoPlay; |
| var playStatus = data.attr.playStatus; |
| this.autoPlay = autoPlay === true || autoPlay === 'true'; |
| if (playStatus !== 'play' |
| && playStatus !== 'stop' |
| && playStatus !== 'pause') { |
| this.playStatus = 'pause'; |
| } |
| else { |
| this.playStatus = playStatus; |
| } |
| Atomic.call(this, data); |
| } |
| Video.prototype = Object.create(Atomic.prototype); |
| extend(Video.prototype, getProto$2(Weex)); |
| extend(Video.prototype, { attr: attr$10 }); |
| |
| Weex.registerComponent('video', Video); |
| } |
| |
| var Video = { init: init$25 }; |
| |
| __$styleInject("/* switch defaults. */\n.weex-switch {\n background-color: #fff;\n border: 1px solid #dfdfdf;\n cursor: pointer;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n -moz-user-select: none;\n -khtml-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n box-sizing: content-box;\n background-clip: content-box;\n}\n\n.weex-switch > small {\n background: #fff;\n border-radius: 100%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n position: absolute;\n top: 0;\n}\n",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var defaults = { |
| color: '#64bd63', |
| secondaryColor: '#dfdfdf', |
| jackColor: '#fff', |
| jackSecondaryColor: null, |
| className: 'weex-switch', |
| disabledOpacity: 0.5, |
| speed: '0.4s', |
| width: 100, |
| height: 60, |
| // is width and height scalable ? |
| scalable: false |
| }; |
| |
| function transitionize (element, props) { |
| var transitions = []; |
| for (var key in props) { |
| transitions.push(key + ' ' + props[key]); |
| } |
| element.style.transition = transitions.join(', '); |
| element.style.webkitTransition = transitions.join(', '); |
| } |
| |
| function setSize (comp) { |
| var min = Math.min(comp.width, comp.height); |
| var max = Math.max(comp.width, comp.height); |
| comp.node.style.width = max + 'px'; |
| comp.node.style.height = min + 'px'; |
| comp.node.style.borderRadius = min / 2 + 'px'; |
| comp.jack.style.width |
| = comp.jack.style.height |
| = min + 'px'; |
| } |
| |
| function setPosition (comp, clicked) { |
| var checked = comp.checked; |
| var node = comp.node; |
| var jack = comp.jack; |
| |
| if (clicked && checked) { |
| checked = false; |
| } |
| else if (clicked && !checked) { |
| checked = true; |
| } |
| |
| if (checked === true) { |
| comp.checked = true; |
| |
| if (window.getComputedStyle) { |
| jack.style.left = parseInt(window.getComputedStyle(node).width) |
| - parseInt(window.getComputedStyle(jack).width) + 'px'; |
| } |
| else { |
| jack.style.left = parseInt(node.currentStyle['width']) |
| - parseInt(jack.currentStyle['width']) + 'px'; |
| } |
| |
| comp.options.color && colorize(comp); |
| setSpeed(comp); |
| } |
| else { |
| comp.checked = false; |
| jack.style.left = 0; |
| node.style.boxShadow = 'inset 0 0 0 0 ' + comp.options.secondaryColor; |
| node.style.borderColor = comp.options.secondaryColor; |
| node.style.backgroundColor |
| = (comp.options.secondaryColor !== defaults.secondaryColor) |
| ? comp.options.secondaryColor |
| : '#fff'; |
| jack.style.backgroundColor |
| = (comp.options.jackSecondaryColor !== comp.options.jackColor) |
| ? comp.options.jackSecondaryColor |
| : comp.options.jackColor; |
| setSpeed(comp); |
| } |
| } |
| |
| function setSpeed (comp) { |
| var switcherProp = {}; |
| var jackProp = { |
| 'background-color': comp.options.speed, |
| left: comp.options.speed.replace(/[a-z]/, '') / 2 + 's' |
| }; |
| |
| if (comp.checked) { |
| switcherProp = { |
| border: comp.options.speed, |
| 'box-shadow': comp.options.speed, |
| 'background-color': comp.options.speed.replace(/[a-z]/, '') * 3 + 's' |
| }; |
| } |
| else { |
| switcherProp = { |
| border: comp.options.speed, |
| 'box-shadow': comp.options.speed |
| }; |
| } |
| |
| transitionize(comp.node, switcherProp); |
| transitionize(comp.jack, jackProp); |
| } |
| |
| function colorize (comp) { |
| var nodeHeight = comp.node.offsetHeight / 2; |
| |
| comp.node.style.backgroundColor = comp.options.color; |
| comp.node.style.borderColor = comp.options.color; |
| comp.node.style.boxShadow = 'inset 0 0 0 ' |
| + nodeHeight |
| + 'px ' |
| + comp.options.color; |
| comp.jack.style.backgroundColor = comp.options.jackColor; |
| } |
| |
| function getClickHandler (comp) { |
| if (!comp._clickHandler) { |
| comp._clickHandler = function () { |
| setPosition(comp, true); |
| comp.dispatchEvent('change', { |
| value: comp.checked |
| }); |
| }; |
| } |
| return comp._clickHandler |
| } |
| |
| var proto$11 = { |
| create: function create () { |
| var node = document.createElement('span'); |
| this.jack = document.createElement('small'); |
| node.appendChild(this.jack); |
| node.className = this.options.className; |
| this.node = node; |
| this.attr.disabled.call(this, this.data.attr.disabled); |
| return node |
| }, |
| |
| onAppend: function onAppend () { |
| setSize(this); |
| setPosition(this); |
| }, |
| |
| enable: function enable () { |
| this.disabled && (this.disabled = false); |
| this.node.style.opacity = 1; |
| this.node.addEventListener('click', getClickHandler(this)); |
| }, |
| |
| disable: function disable () { |
| !this.disabled && (this.disabled = true); |
| this.node.style.opacity = defaults.disabledOpacity; |
| this.node.removeEventListener('click', getClickHandler(this)); |
| } |
| }; |
| |
| var attr$11 = { |
| disabled: function (val) { |
| this.disabled = val && val !== 'false'; |
| this.disabled ? this.disable() : this.enable(); |
| } |
| }; |
| |
| var style$8 = { |
| width: function (val) { |
| if (!this.options.scalable) { |
| return |
| } |
| val = parseFloat(val); |
| if (isNaN(val) || val < 0) { |
| val = this.options.width; |
| } |
| this.width = val; |
| this.setSize(); |
| }, |
| |
| height: function (val) { |
| if (!this.options.scalable) { |
| return |
| } |
| val = parseFloat(val); |
| if (isNaN(val) || val < 0) { |
| val = this.options.height; |
| } |
| this.height = val; |
| this.setSize(); |
| } |
| }; |
| |
| var event$4 = { |
| change: { |
| updator: function updator () { |
| return { |
| attrs: { |
| checked: this.checked |
| } |
| } |
| }, |
| extra: function extra () { |
| return { |
| value: this.checked |
| } |
| } |
| } |
| }; |
| |
| function init$26 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| |
| // attrs: |
| // - checked: if is checked. |
| // - disabled: if true, this component is not available for interaction. |
| function Switch (data) { |
| this.options = extend({}, defaults); |
| this.checked = data.attr.checked |
| && data.attr.checked !== 'false'; |
| this.data = data; |
| this.width = this.options.width; |
| this.height = this.options.height; |
| Atomic.call(this, data); |
| } |
| Switch.prototype = Object.create(Atomic.prototype); |
| extend(Switch.prototype, proto$11); |
| extend(Switch.prototype, { attr: attr$11 }); |
| extend(Switch.prototype, { |
| style: extend(Object.create(Atomic.prototype.style), style$8) |
| }); |
| extend(Switch.prototype, { event: event$4 }); |
| |
| Weex.registerComponent('switch', Switch); |
| } |
| |
| var Switch = { init: init$26 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| function getProto$3 (Weex) { |
| var Component = Weex.Component; |
| return { |
| create: function create () { |
| var node = document.createElement('a'); |
| node.classList.add('weex-container'); |
| node.style.textDecoration = 'none'; |
| return node |
| }, |
| |
| bindEvents: function bindEvents (evts) { |
| // event handler for click event will be processed |
| // before the url redirection. |
| Component.prototype.bindEvents.call(this, evts); |
| this.node.addEventListener('click', function (evt) { |
| if (evt._alreadyFired && evt.target !== this.node) { |
| // if the event target is this.node, then this is |
| // just another click event handler for the same |
| // target, not a handler for a bubbling up event, |
| // otherwise it is a bubbling up event, and it |
| // should be disregarded. |
| return |
| } |
| evt._alreadyFired = true; |
| location.href = this.href; |
| }.bind(this)); |
| } |
| } |
| } |
| |
| var attr$12 = { |
| href: function (val) { |
| if (!val) { |
| return console.warn('[web-render] href of <a> should not be a null value.') |
| } |
| this.href = val; |
| this.node.setAttribute('data-href', val); |
| } |
| }; |
| |
| function init$27 (Weex) { |
| var Component = Weex.Component; |
| var extend = Weex.utils.extend; |
| |
| // attrs: |
| // - href |
| function A (data) { |
| Component.call(this, data); |
| } |
| |
| A.prototype = Object.create(Component.prototype); |
| extend(A.prototype, getProto$3(Weex)); |
| extend(A.prototype, { attr: attr$12 }); |
| |
| Weex.registerComponent('a', A); |
| } |
| |
| var A = { init: init$27 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var ID_PREFIX = 'weex_embed_'; |
| |
| var getRandom$1; |
| |
| function _generateId () { |
| return ID_PREFIX + getRandom$1(10) |
| } |
| |
| var proto$12 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.id = this.id; |
| node.style.overflow = 'scroll'; |
| return node |
| }, |
| |
| initWeex: function initWeex () { |
| this.id = _generateId(); |
| this.node.id = this.id; |
| var config = { |
| appId: this.id, |
| source: this.source, |
| bundleUrl: this.source, |
| loader: this.loader, |
| jsonpCallback: this.jsonpCallback, |
| width: this.node.getBoundingClientRect().width, |
| rootId: this.id, |
| embed: true |
| }; |
| window.weex.init(config); |
| }, |
| |
| destroyWeex: function destroyWeex () { |
| this.id && window.destroyInstance(this.id); |
| // TODO: unbind events and clear doms. |
| this.node.innerHTML = ''; |
| }, |
| |
| reloadWeex: function reloadWeex () { |
| if (this.id) { |
| this.destroyWeex(); |
| this.id = null; |
| this.node.id = null; |
| this.node.innerHTML = ''; |
| } |
| this.initWeex(); |
| } |
| }; |
| |
| // not recommended, because of the leak of memory. |
| var attr$13 = { |
| src: function (value) { |
| this.source = value; |
| this.reloadWeex(); |
| } |
| }; |
| |
| function init$28 (Weex) { |
| var Component = Weex.Component; |
| var extend = Weex.utils.extend; |
| getRandom$1 = Weex.utils.getRandom; |
| |
| function Embed (data, nodeType) { |
| var attr = data.attr; |
| if (attr) { |
| this.source = attr.src; |
| this.loader = attr.loader || 'xhr'; |
| this.jsonpCallback = attr.jsonpCallback; |
| } |
| Component.call(this, data, nodeType); |
| } |
| |
| Embed.prototype = Object.create(Component.prototype); |
| extend(Embed.prototype, proto$12); |
| extend(Embed.prototype, { attr: attr$13 }); |
| |
| Weex.registerComponent('embed', Embed); |
| } |
| |
| var Embed = { init: init$28 }; |
| |
| __$styleInject(".weex-spinner-wrap {\n width: 1.013333rem; /* 76px */\n height: 1.013333rem;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n overflow: visible;\n}\n\n.weex-spinner {\n font-size: 0.16rem; /* 12px */\n width: 1em;\n height: 1em;\n border-radius: 50%;\n position: relative;\n text-indent: -9999em;\n -webkit-animation: weex-spinner 1.1s infinite ease;\n animation: weex-spinner 1.1s infinite ease;\n -webkit-transform: translateZ(0);\n -ms-transform: translateZ(0);\n transform: translateZ(0);\n}\n@-webkit-keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);\n }\n 12.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 62.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;\n }\n}\n@keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);\n }\n 12.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 62.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;\n }\n}\n",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global CSSRule */ |
| |
| var loopArray$1; |
| var getRgb$1; |
| |
| function getStyleSheet (spinner) { |
| if (spinner.styleSheet) { |
| return |
| } |
| var styles = document.styleSheets; |
| var i, l, j, m; |
| /* eslint-disable no-labels */ |
| outer: for (i = 0, l = styles.length; i < l; i++) { |
| var rules = styles[i].rules; |
| if (!rules) { |
| continue |
| } |
| for (j = 0, m = rules.length; j < m; j++) { |
| var item = rules.item(j); |
| if ( |
| (item.type === CSSRule.KEYFRAMES_RULE |
| || item.type === CSSRule.WEBKIT_KEYFRAMES_RULE) |
| && item.name === 'weex-spinner') { |
| break outer |
| } |
| } |
| } |
| /* eslint-enable no-labels */ |
| spinner.styleSheet = styles[i]; |
| } |
| |
| function setKeyframeColor (spinner, val) { |
| getStyleSheet(spinner); |
| var keyframeRules = computeKeyFrameRules(val); |
| var rules = spinner.styleSheet.rules; |
| for (var i = 0, l = rules.length; i < l; i++) { |
| var item = rules.item(i); |
| if ((item.type === CSSRule.KEYFRAMES_RULE |
| || item.type === CSSRule.WEBKIT_KEYFRAMES_RULE) |
| && item.name === 'weex-spinner') { |
| var cssRules = item.cssRules; |
| for (var j = 0, m = cssRules.length; j < m; j++) { |
| var keyframe = cssRules[j]; |
| if (keyframe.type === CSSRule.KEYFRAME_RULE |
| || keyframe.type === CSSRule.WEBKIT_KEYFRAME_RULE) { |
| keyframe.style.boxShadow = keyframeRules[j]; |
| } |
| } |
| } |
| } |
| } |
| |
| function computeKeyFrameRules (rgb) { |
| if (!rgb) { |
| return |
| } |
| var scaleArr = [ |
| '0em -2.6em 0em 0em', |
| '1.8em -1.8em 0 0em', |
| '2.5em 0em 0 0em', |
| '1.75em 1.75em 0 0em', |
| '0em 2.5em 0 0em', |
| '-1.8em 1.8em 0 0em', |
| '-2.6em 0em 0 0em', |
| '-1.8em -1.8em 0 0em']; |
| var colorArr = [ |
| '1', |
| '0.2', |
| '0.2', |
| '0.2', |
| '0.2', |
| '0.2', |
| '0.5', |
| '0.7'].map(function (e) { |
| return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + e + ')' |
| }); |
| var rules = []; |
| var loop = function ( i ) { |
| var tmpColorArr = loopArray$1(colorArr, i, 'r'); |
| rules.push(scaleArr.map(function (scaleStr, i) { |
| return scaleStr + ' ' + tmpColorArr[i] |
| }).join(', ')); |
| }; |
| |
| for (var i = 0; i < scaleArr.length; i++) loop( i ); |
| return rules |
| } |
| |
| var proto$13 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('weex-container'); |
| node.classList.add('weex-spinner-wrap'); |
| this.spinner = document.createElement('div'); |
| this.spinner.classList.add('weex-element'); |
| this.spinner.classList.add('weex-spinner'); |
| node.appendChild(this.spinner); |
| return node |
| } |
| }; |
| |
| var style$9 = { |
| color: function (val) { |
| var rgb = getRgb$1(val); |
| if (!rgb) { |
| return console.error('[web-render] invalid color value:', val) |
| } |
| setKeyframeColor(this, rgb); |
| } |
| }; |
| |
| // Spinner.prototype.updateStyle = function (style) { |
| // Atomic.prototype.updateStyle.call(this, style) |
| // if (style && style.color) { |
| // this.setKeyframeColor(global.weex.utils.getRgb(this.node.style.color)) |
| // } |
| // } |
| |
| function init$29 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| getRgb$1 = Weex.utils.getRgb; |
| loopArray$1 = Weex.utils.loopArray; |
| |
| function Spinner (data) { |
| Atomic.call(this, data); |
| } |
| Spinner.prototype = Object.create(Atomic.prototype); |
| extend(Spinner.prototype, proto$13); |
| extend(Spinner.prototype, { |
| style: extend(Object.create(Atomic.prototype.style), style$9) |
| }); |
| |
| Weex.registerComponent('spinner', Spinner); |
| Weex.registerComponent('loading-indicator', Spinner); |
| } |
| |
| var Spinner = { init: init$29 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var isArray$1; |
| |
| function handleMsg (web, evt) { |
| var msg = evt.data; |
| if (typeof msg === 'string') { |
| try { |
| msg = JSON.parse(msg); |
| } |
| catch (e) {} |
| } |
| if (!msg) { |
| return |
| } |
| if (msg.type === 'weex') { |
| if (!isArray$1(msg.content)) { |
| return console.error('[h5-render] weex msg received by web component.' |
| + ' msg.content should be a array:', msg.content) |
| } |
| callNative(web.getComponentManager().instanceId, msg.content); |
| } |
| } |
| |
| function getProto$4 (Weex) { |
| var Atomic = Weex.Atomic; |
| return { |
| create: function create () { |
| // Iframe's defect: can't use position:absolute and top, left, right, |
| // bottom all setting to zero and use margin to leave specified |
| // height for a blank area, and have to use 100% to fill the parent |
| // container, otherwise it will use a unwanted default size instead. |
| // Therefore a div as a iframe wrapper is needed here. |
| var node = document.createElement('div'); |
| node.classList.add('weex-container'); |
| this.web = document.createElement('iframe'); |
| node.appendChild(this.web); |
| this.web.classList.add('weex-element'); |
| this.web.style.width = '100%'; |
| this.web.style.height = '100%'; |
| this.web.style.border = 'none'; |
| return node |
| }, |
| |
| bindEvents: function bindEvents (evts) { |
| Atomic.prototype.bindEvents.call(this, evts); |
| var that = this; |
| this.web.addEventListener('load', function (e) { |
| that.dispatchEvent('pagefinish', { |
| url: that.web.src |
| }); |
| }); |
| window.addEventListener('message', handleMsg.bind(null, this)); |
| }, |
| |
| goBack: function goBack () { |
| this.web.contentWindow.history.back(); |
| }, |
| |
| goForward: function goForward () { |
| this.web.contentWindow.history.forward(); |
| }, |
| |
| reload: function reload () { |
| this.web.contentWindow.location.reload(); |
| } |
| } |
| } |
| |
| var attr$14 = { |
| src: function (val) { |
| this.web.src = val; |
| setTimeout(function () { |
| this.dispatchEvent('pagestart', { url: val }); |
| }.bind(this), 0); |
| } |
| }; |
| |
| function init$30 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| isArray$1 = Weex.utils.isArray; |
| |
| // A component to import web pages, which works like |
| // a iframe element or a webview. |
| // attrs: |
| // - src |
| // events: |
| // - pagestart |
| // - pagefinish |
| // - error |
| function Web (data) { |
| Atomic.call(this, data); |
| } |
| Web.prototype = Object.create(Atomic.prototype); |
| extend(Web.prototype, getProto$4(Weex)); |
| extend(Web.prototype, { attr: attr$14 }); |
| |
| Weex.registerComponent('web', Web); |
| } |
| |
| var Web = { init: init$30 }; |
| |
| __$styleInject(".weex-neighbor-item {\n position: absolute !important;\n top: 50% !important;\n left: 50% !important;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n}\n",undefined); |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global lib */ |
| |
| var DEFAULT_INTERVAL$1 = 3000; |
| var DEFAULT_NEIGHBOR_SPACE = 20; |
| var DEFAULT_NEIGHBOR_ALPHA = 0.6; |
| var DEFAULT_NEIGHBOR_SCALE = 0.8; |
| |
| var TRANSITION_DURATION = 400; |
| |
| var MAIN_SLIDE_SCALE = 0.9; |
| var MAIN_SLIDE_OPACITY = 1; |
| |
| var extend$2; |
| var Component$3; |
| |
| function idleWhenPageDisappear$1 (slider) { |
| function handlePageShow () { |
| slider.isPageShow = true; |
| slider.autoPlay && !slider.isDomRendering && slider.play(); |
| } |
| function handlePageHide () { |
| slider.isPageShow = false; |
| slider.stop(); |
| } |
| global.addEventListener('pageshow', handlePageShow); |
| global.addEventListener('pagehide', handlePageHide); |
| document.addEventListener('visibilitychange', function () { |
| if (document.visibilityState === 'visible') { |
| handlePageShow(); |
| } |
| else if (document.visibilityState === 'hidden') { |
| handlePageHide(); |
| } |
| }); |
| } |
| |
| function idleWhenDomRendering$1 (slider) { |
| global.addEventListener('renderend', function () { |
| slider.isDomRendering = false; |
| slider.autoPlay && slider.isPageShow && slider.play(); |
| }); |
| global.addEventListener('renderbegin', function () { |
| slider.isDomRendering = true; |
| slider.stop(); |
| }); |
| } |
| |
| function _renderIndicators (slider, ct, data) { |
| data.extra.width = data.style.width || slider.width; |
| data.extra.height = data.style.height || slider.height; |
| var indicator = slider.getComponentManager().createElement(data); |
| indicator.parentRef = slider.data.ref; |
| indicator.slider = slider; |
| slider.indicator = indicator; |
| ct.appendChild(indicator.node); |
| } |
| |
| function renderIndicators (slider, ct, data) { |
| setTimeout(function () { return _renderIndicators(slider, ct, data); }, 0); |
| } |
| |
| function updateIndicators$1 (slider) { |
| slider.indicator && slider.indicator.setIndex(slider.currentIndex); |
| } |
| |
| function transitionOnce (node, duration, timingFunc) { |
| var transitionStr = "all " + duration + "ms " + timingFunc; |
| node.style.webkitTransition = transitionStr; |
| node.style.transition = transitionStr; |
| setTimeout(function () { |
| node.style.webkitTransition = ''; |
| node.style.transition = ''; |
| }, duration); |
| } |
| |
| function animateTransform (node, style, duration, timeFunction) { |
| transitionOnce(node, duration || TRANSITION_DURATION, timeFunction || 'ease'); |
| for (var k in style) { |
| node.style[k] = style[k]; |
| } |
| } |
| |
| function transformSlide (slider, index) { |
| var node = slider.slides[index].node; |
| node.style.opacity = slider.neighborAlpha; |
| var transformStr = "scale(" + (slider.neighborScale) + ")"; |
| node.style.webkitTransform = transformStr; |
| node.style.transform = transformStr; |
| node.style.width = slider.width + 'px'; |
| node.style.height = slider.height + 'px'; |
| node.style.position = 'absolute'; |
| node.style.top = '0px'; |
| node.style.left = '0px'; |
| } |
| |
| function loadImg (slider) { |
| var imgs1 = slider.node.querySelectorAll('[img-src]') || []; |
| var imgs2 = slider.node.querySelectorAll('[i-lazy-src]') || []; |
| function load (node) { |
| var src = node.getAttribute('img-src') || node.getAttribute('i-lazy-src'); |
| lib.img.applySrc(node, src, node.dataset.placeholder); |
| } |
| for (var i = 0; i < imgs1.length; i++) { |
| load(imgs1[i]); |
| } |
| for (var i$1 = 0; i$1 < imgs2.length; i$1++) { |
| load(imgs2[i$1]); |
| } |
| } |
| |
| function _doRender (slider) { |
| loadImg(slider); |
| slider.total = slider.slides.length; |
| slider.currentIndex = 0; |
| var width = slider.data.style.width || 0; |
| var height = slider.data.style.height || 0; |
| slider.width = parseFloat(width) || slider.node.getBoundingClientRect().width; |
| slider.height = parseFloat(height) || slider.node.getBoundingClientRect().height; |
| |
| var l = slider.slides.length; |
| for (var i = 0; i < l; i++) { |
| transformSlide(slider, i); |
| } |
| |
| setTimeout(function () { return slider.slideTo(0); }, 0); |
| } |
| |
| function doRender$1 (slider) { |
| setTimeout(_doRender.bind(null, slider), 0); |
| } |
| |
| function loopIndex (idx, total) { |
| if (total === 0) { |
| return 0 |
| } |
| return (total + idx) % total |
| } |
| |
| function autoPlay$1 (slider) { |
| var next = slider.currentIndex + 1; |
| setTimeout(function () { return slider.slideTo(next); }, 0); |
| slider.playTimer = setTimeout(function () { return autoPlay$1(slider); }, slider.interval + TRANSITION_DURATION); |
| } |
| |
| function useGesture (slider) { |
| var node = slider.node; |
| var displacement, panning; |
| |
| node.addEventListener('panstart', function (e) { |
| if (!e.isVertical) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| slider.stop(); |
| panning = true; |
| displacement = 0; |
| } |
| }); |
| |
| node.addEventListener('panmove', function (e) { |
| if (!e.isVertical && panning) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| var displacement = e.displacementX; |
| moveSlides(slider, displacement); |
| } |
| }); |
| |
| node.addEventListener('panend', function (e) { |
| if (!e.isVertical && panning) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| displacement = e.displacementX; |
| if (e.isSwipe) { |
| if (displacement < 0) { |
| slider.slideToNext(); |
| } |
| else { |
| slider.slideToPrev(); |
| } |
| } |
| else { |
| if (Math.abs(displacement) < slider.width / 2) { |
| slider.slideTo(slider.currentIndex); |
| } |
| else if (displacement < 0) { |
| slider.slideToNext(); |
| } |
| else { |
| slider.slideToPrev(); |
| } |
| } |
| panning = false; |
| slider.play(); |
| } |
| }); |
| |
| node.addEventListener('swipe', function (e) { |
| if (!e.isVertical) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| } |
| }); |
| } |
| |
| function moveSlides (slider, offset) { |
| var mainTransformStr = "translate(" + offset + "px, 0px) scale(" + MAIN_SLIDE_SCALE + ")"; |
| var mainNode = slider.mainSlide.node; |
| mainNode.style.webkitTransform = mainTransformStr; |
| mainNode.style.transform = mainTransformStr; |
| |
| var leftTransformStr = "translate(" + (slider.leftTranslate + offset) + "px, 0px) scale(" + (slider.neighborScale) + ")"; |
| var leftNode = slider.leftSlide.node; |
| leftNode.style.webkitTransform = leftTransformStr; |
| leftNode.style.transform = leftTransformStr; |
| |
| var rightTransformStr = "translate(" + (slider.rightTranslate + offset) + "px, 0px) scale(" + (slider.neighborScale) + ")"; |
| var rightNode = slider.rightSlide.node; |
| rightNode.style.webkitTransform = rightTransformStr; |
| rightNode.style.transform = rightTransformStr; |
| } |
| |
| function resetSideSlidePos (slider, side) { |
| var signMap = { left: '-', right: '' }; |
| var transformStr = "translate(" + (signMap[side] + slider.width) + "px, 0px)"; |
| var node = slider[side + 'Slide'].node; |
| node.style.webkitTransform = transformStr; |
| node.style.transform = transformStr; |
| } |
| |
| function resetOutsideSlides (slider, indexArr) { |
| indexArr = indexArr || []; |
| var l = slider.slides.length; |
| for (var i = 0; i < l; i++) { |
| if (indexArr.indexOf(i) <= -1) { |
| slider.slides[i].node.style.opacity = 0; |
| } |
| } |
| } |
| |
| var proto$14 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| this.node = node; |
| node.classList.add('slider-neighbor'); |
| node.classList.add('weex-container'); |
| this.style.flexDirection.call(this, 'row'); |
| node.style.position = 'relative'; |
| node.style.overflow = 'hidden'; |
| return node |
| }, |
| |
| createChildren: function createChildren () { |
| var this$1 = this; |
| |
| var componentManager = this.getComponentManager(); |
| |
| var children = this.data.children; |
| var fragment = document.createDocumentFragment(); |
| |
| if (children && children.length) { |
| for (var i = 0; i < children.length; i++) { |
| var child = (void 0); |
| var data = children[i]; |
| data.instanceId = this$1.data.instanceId; |
| // 'indicator' maybe the last child of this component. |
| if (data.type !== 'indicator') { |
| child = componentManager.createElement(data); |
| child.node.classList.add('weex-neighbor-item'); |
| var width = (data.style || {}).width || this$1.data.style.width; |
| var height = (data.style || {}).height || this$1.data.style.height; |
| child.node.style.marginTop = -(height / 2) + 'px'; |
| child.node.style.marginLeft = -(width / 2) + 'px'; |
| this$1.slides.push(child); |
| fragment.appendChild(child.node); |
| child.parentRef = this$1.data.ref; |
| } |
| else { |
| renderIndicators(this$1, fragment, extend$2(data, { |
| extra: { |
| amount: children.length - 1, |
| index: 0 |
| } |
| })); |
| } |
| } |
| resetOutsideSlides(this, []); |
| this.node.appendChild(fragment); |
| doRender$1(this); |
| } |
| }, |
| |
| appendChild: function appendChild (data) { |
| var children = this.data.children; |
| var componentManager = this.getComponentManager(); |
| var child; |
| |
| if (data.type === 'indicator') { |
| renderIndicators(this, this.node, extend$2(data, { |
| extra: { |
| amount: children.length, |
| index: this.currentIndex |
| } |
| })); |
| } |
| else { |
| child = componentManager.createElement(data); |
| child.node.classList.add('weex-neighbor-item'); |
| var width = (data.style || {}).width || this.data.style.width; |
| var height = (data.style || {}).height || this.data.style.height; |
| child.node.style.marginTop = -(height / 2) + 'px'; |
| child.node.style.marginLeft = -(width / 2) + 'px'; |
| this.slides.push(child); |
| resetOutsideSlides(this, []); |
| this.node.appendChild(child.node); |
| } |
| |
| doRender$1(this); |
| |
| if (!children || !children.length) { |
| this.data.children = [data]; |
| } |
| else { |
| children.push(data); |
| } |
| |
| return child || this.indicator |
| }, |
| |
| insertBefore: function insertBefore (child, before) { |
| var children = this.data.children; |
| var i = 0; |
| var slidesIdx = 0; |
| var isAppend = false; |
| if (!children || !children.length || !before) { |
| isAppend = true; |
| } |
| else { |
| var l; |
| for (l = children.length; i < l; i++) { |
| if (children[i].ref === before.data.ref) { |
| break |
| } |
| if (children[i].type !== 'indicator') { |
| slidesIdx++; |
| } |
| } |
| if (i === l) { |
| isAppend = true; |
| } |
| } |
| |
| child.node.classList.add('weex-neighbor-item'); |
| var data = child.data; |
| var width = (data.style || {}).width || this.data.style.width; |
| var height = (data.style || {}).height || this.data.style.height; |
| child.node.style.marginTop = -(height / 2) + 'px'; |
| child.node.style.marginLeft = -(width / 2) + 'px'; |
| if (isAppend) { |
| this.node.appendChild(child.node); |
| this.slides.push(child); |
| resetOutsideSlides(this, []); |
| children.push(child.data); |
| } |
| else { |
| this.node.insertBefore(child.node, before.node); |
| this.slides.splice(slidesIdx, 0, child); |
| children.splice(i, 0, child.data); |
| } |
| |
| doRender$1(this); |
| }, |
| |
| removeChild: function removeChild (child) { |
| var children = this.data.children; |
| var i = 0; |
| var slidesIdx = 0; |
| if (children && children.length) { |
| var l; |
| for (l = children.length; i < l; i++) { |
| if (children[i].ref === child.data.ref) { |
| break |
| } |
| if (children[i].type !== 'indicator') { |
| slidesIdx++; |
| } |
| } |
| if (i < l) { |
| children.splice(i, 1); |
| this.slides.splice(slidesIdx, 1); |
| resetOutsideSlides(this, []); |
| } |
| } |
| |
| this.getComponentManager().removeComponent(child.data.ref); |
| child.node.parentNode.removeChild(child.node); |
| |
| doRender$1(this); |
| }, |
| |
| onAppend: function onAppend () { |
| this.slideTo(0); |
| useGesture(this); |
| Component$3.prototype.onAppend.call(this); |
| }, |
| |
| play: function play () { |
| // start playing |
| this.playTimer && clearTimeout(this.playTimer); |
| if (this.playstatus/* && !this.toggleOff*/) { |
| this.playTimer = setTimeout(autoPlay$1.bind(null, this), this.interval); |
| } |
| }, |
| |
| stop: function stop () { |
| // stop playing |
| this.playTimer && clearTimeout(this.playTimer); |
| }, |
| |
| slideTo: function slideTo (index, restartAutoplay) { |
| var this$1 = this; |
| |
| var total = this.slides.length; |
| if (total === 0) { |
| return |
| } |
| if (restartAutoplay) { |
| this.stop(); |
| setTimeout(function () { return this$1.play(); }, 100); |
| } |
| var origIdx = index; |
| index = loopIndex(origIdx, total); |
| var leftIndex = loopIndex(index - 1, total); |
| var rightIndex = loopIndex(index + 1, total); |
| |
| this.mainSlide = this.slides[index]; |
| this.leftSlide = this.slides[loopIndex(index - 1, total)]; |
| this.rightSlide = this.slides[loopIndex(index + 1, total)]; |
| |
| var mainTransformStr = "translate(0px, 0px) scale(" + MAIN_SLIDE_SCALE + ")"; |
| setTimeout(function () { return animateTransform(this$1.mainSlide.node, { |
| webkitTransform: mainTransformStr, |
| transform: mainTransformStr, |
| opacity: MAIN_SLIDE_OPACITY, |
| zIndex: 99 |
| }); }, 100); |
| |
| var translateX = this.width |
| - this.width * (1 - this.neighborScale) / 2 |
| - this.neighborSpace; |
| this.leftTranslate = -translateX; |
| this.rightTranslate = translateX; |
| |
| if (origIdx > this.currentIndex) { |
| resetSideSlidePos(this, 'right'); |
| } |
| else if (origIdx < this.currentIndex) { |
| resetSideSlidePos(this, 'left'); |
| } |
| |
| var leftTransformStr = "translate(" + (-translateX + 'px') + ", 0px) scale(" + (this.neighborScale) + ")"; |
| setTimeout(function () { return animateTransform(this$1.leftSlide.node, { |
| webkitTransform: leftTransformStr, |
| transform: leftTransformStr, |
| opacity: this$1.neighborAlpha, |
| zIndex: 1 |
| }); }, 100); |
| |
| var rightTransformStr = "translate(" + (translateX + 'px') + ", 0px) scale(" + (this.neighborScale) + ")"; |
| setTimeout(function () { return animateTransform(this$1.rightSlide.node, { |
| webkitTransform: rightTransformStr, |
| transform: rightTransformStr, |
| opacity: this$1.neighborAlpha, |
| zIndex: 1 |
| }); }, 100); |
| |
| resetOutsideSlides(this, [index, leftIndex, rightIndex]); |
| |
| this.currentIndex = index; |
| updateIndicators$1(this); |
| this.dispatchEvent('change', { index: this.currentIndex }); |
| }, |
| |
| slideToPrev: function slideToPrev () { |
| this.slideTo(this.currentIndex - 1); |
| }, |
| |
| slideToNext: function slideToNext () { |
| this.slideTo(this.currentIndex + 1); |
| } |
| }; |
| |
| var attr$15 = { |
| interval: function (val) { |
| this.interval = parseInt(val) || DEFAULT_INTERVAL$1; |
| }, |
| |
| index: function (val) { |
| var _this = this; |
| function doSlide (index) { |
| index = parseInt(index); |
| if (index < 0 || isNaN(index)) { |
| return console.error('[h5-render] invalid index ', index) |
| } |
| _this.stop(); |
| _this.slideTo(index); |
| _this.autoPlay && _this.isPageShow && _this.play(); |
| if (_this._updateIndex) { |
| window.removeEventListener('renderend', _this._updateIndex); |
| } |
| } |
| if (this.isDomRendering) { |
| var pre = !!this._updateIndex; |
| this._updateIndex = function () { |
| doSlide(val); |
| }; |
| !pre && window.addEventListener('renderend', this._updateIndex); |
| } |
| else { |
| doSlide(val); |
| } |
| }, |
| |
| playstatus: function (val) { |
| var _this = this; |
| this.playstatus = val && val !== 'false'; |
| this.autoPlay = this.playstatus; |
| |
| function doPlay () { |
| _this.isPageShow && _this.play(); |
| if (_this._updatePlaystatus) { |
| window.removeEventListener('renderend', _this._updatePlaystatus); |
| } |
| } |
| |
| if (this.playstatus) { |
| if (this.isDomRendering) { |
| var pre = !!this._updatePlaystatus; |
| this._updatePlaystatus = function () { |
| doPlay(); |
| }; |
| !pre && window.addEventListener('renderend', this._updatePlaystatus); |
| } |
| else { |
| doPlay(); |
| } |
| } |
| else { |
| this.stop(); |
| } |
| }, |
| |
| // support playstatus' alias auto-play for compatibility |
| autoPlay: function (val) { |
| this.attr.playstatus.call(this, val); |
| }, |
| |
| neighborSpace: function neighborSpace (val) { |
| var ns = parseFloat(val); |
| if (!isNaN(ns) && ns >= 0) { |
| this.neighborSpace = ns; |
| } |
| else { |
| console.warn(("[h5-render] invalid value for 'neighbor-space' of slider-neighbor: " + val + ".")); |
| } |
| }, |
| |
| neighborAlpha: function neighborAlpha (val) { |
| var na = parseFloat(val); |
| if (!isNaN(na) && na >= 0 && na <= 1) { |
| this.neighborAlpha = na; |
| } |
| else { |
| console.warn(("[h5-render] invalid value for 'neighbor-alpha' of slider-neighbor: " + val + ".")); |
| } |
| }, |
| |
| neighborScale: function neighborScale (val) { |
| var ns = parseFloat(val); |
| if (!isNaN(ns) && ns >= 0 && ns <= 1) { |
| this.neighborScale = ns; |
| } |
| else { |
| console.warn(("[h5-render] invalid value for 'neighbor-scale' of slider-neighbor: " + val + ".")); |
| } |
| } |
| }; |
| |
| var event$5 = { |
| change: { |
| updator: function () { |
| return { |
| attrs: { |
| index: this.currentIndex |
| } |
| } |
| } |
| } |
| }; |
| |
| function init$31 (Weex) { |
| Component$3 = Weex.Component; |
| extend$2 = Weex.utils.extend; |
| |
| /** |
| * data.attr |
| * support slider's attributes and three |
| * @param {number} neighbor-space 0 - 375, the exposing width of slides on both other sides. |
| * @param {number} neighbor-alpha 0 - 1, opacity of both other sides of slides, default is 0.6. |
| * @param {number} neighbor-scale 0 - 1, the scale of both other sides of slides, default is 0.8. |
| */ |
| function SliderNeighbor (data) { |
| this.autoPlay = false; // default value is false. |
| this.interval = DEFAULT_INTERVAL$1; |
| this.direction = 'row'; // 'column' is not temporarily supported. |
| this.slides = []; |
| this.isPageShow = true; |
| this.isDomRendering = true; |
| this.currentIndex = 0; |
| |
| this.neighborSpace = DEFAULT_NEIGHBOR_SPACE; |
| this.neighborAlpha = DEFAULT_NEIGHBOR_ALPHA; |
| this.neighborScale = DEFAULT_NEIGHBOR_SCALE; |
| |
| // bind event 'pageshow', 'pagehide' and 'visibilitychange' on window. |
| idleWhenPageDisappear$1(this); |
| // bind event 'renderBegin' and 'renderEnd' on window. |
| idleWhenDomRendering$1(this); |
| |
| Component$3.call(this, data); |
| } |
| SliderNeighbor.prototype = Object.create(Component$3.prototype); |
| extend$2(SliderNeighbor.prototype, proto$14); |
| extend$2(SliderNeighbor.prototype, { attr: attr$15 }); |
| extend$2(SliderNeighbor.prototype, { event: event$5 }); |
| |
| Weex.registerComponent('slider-neighbor', SliderNeighbor); |
| } |
| |
| var Neighbor = { init: init$31 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var displayMap = { |
| a: 'inline', |
| image: 'inline-block', |
| span: 'inline-block' |
| }; |
| |
| var typeMap$1 = { |
| a: 'a', |
| image: 'image', |
| span: 'text' |
| }; |
| |
| var _richTextNodeRef = 0; |
| var getRichTextNodeRef = function () { |
| return ("rtn-" + (_richTextNodeRef++)) |
| }; |
| |
| function _isArray (arr) { |
| return Object.prototype.toString.call(arr).slice(8, -1) === 'Array' |
| } |
| |
| function _isPlainObject (obj) { |
| return Object.prototype.toString.call(obj).slice(8, -1) === 'Object' |
| } |
| |
| function _parse (parent, parentNode, value) { |
| if (_isArray(value)) { |
| return value.forEach(function (node) { return _parse(parent, parentNode, node); }) |
| } |
| if (_isPlainObject(value)) { |
| var type = value.type; |
| var attr = value.attr; |
| var style = value.style; |
| var children = value.children; |
| // don't pass children to componnent's own `createChildren` method. |
| // otherwise there's no chance to set children's display to `inline`. |
| delete value.children; |
| var comp = parent.getComponentManager().createElement({ |
| type: typeMap$1[type], |
| ref: getRichTextNodeRef(), |
| attr: attr, |
| style: style |
| }); |
| comp.node.style.display = displayMap[type]; |
| parentNode.appendChild(comp.node); |
| if (_isArray(children)) { |
| children.forEach(function (child) { return _parse(comp, comp.node, child); }); |
| } |
| } |
| } |
| |
| var proto$15 = { |
| create: function create () { |
| var node = document.createElement('div'); |
| node.classList.add('weex-element'); |
| node.classList.add('weex-richtext'); |
| return node |
| }, |
| |
| parse: function parse () { |
| var this$1 = this; |
| |
| Array.prototype.slice.call(this.node.children) |
| .forEach(function (child) { return this$1.node.removeChild(child); }); |
| if (!this.value) { |
| return |
| } |
| _parse(this, this.node, this.value); |
| } |
| }; |
| |
| // updatable attributes |
| var attr$16 = { |
| value: function value (val) { |
| this.value = val; |
| this.parse(); |
| } |
| }; |
| |
| function init$32 (Weex) { |
| var Atomic = Weex.Atomic; |
| var extend = Weex.utils.extend; |
| |
| /** |
| * attrs: |
| * - value |
| */ |
| function RichText (data) { |
| Atomic.call(this, data); |
| } |
| RichText.prototype = Object.create(Atomic.prototype); |
| extend(RichText.prototype, proto$15); |
| extend(RichText.prototype, { attr: attr$16 }); |
| |
| Weex.registerComponent('richtext', RichText); |
| } |
| |
| var Richtext = { init: init$32 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| * config: |
| * - styles |
| * - duration [Number] milliseconds(ms) |
| * - timingFunction [string] |
| * - dealy [Number] milliseconds(ms) |
| */ |
| function transitionOnce$1 (comp, config, callback) { |
| var styles = config.styles || {}; |
| var duration = config.duration || 1000; // ms |
| var timingFunction = config.timingFunction || 'ease'; |
| var delay = config.delay || 0; // ms |
| var transitionValue = 'all ' + duration + 'ms ' |
| + timingFunction + ' ' + delay + 'ms'; |
| var dom = comp.node; |
| var transitionEndHandler = function (e) { |
| e.stopPropagation(); |
| dom.removeEventListener('webkitTransitionEnd', transitionEndHandler); |
| dom.removeEventListener('transitionend', transitionEndHandler); |
| dom.style.transition = ''; |
| dom.style.webkitTransition = ''; |
| callback(); |
| }; |
| dom.style.transition = transitionValue; |
| dom.style.webkitTransition = transitionValue; |
| dom.addEventListener('webkitTransitionEnd', transitionEndHandler); |
| dom.addEventListener('transitionend', transitionEndHandler); |
| comp.updateStyle(styles); |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var _data = {}; |
| |
| var animation = { |
| |
| /** |
| * transition |
| * @param {string} ref [description] |
| * @param {obj} config [description] |
| * @param {string} callbackId [description] |
| */ |
| transition: function (ref, config, callbackId) { |
| var refData = _data[ref]; |
| var stylesKey = JSON.stringify(config.styles); |
| var weexInstance = this; |
| // If the same component perform a animation with exactly the same |
| // styles in a sequence with so short interval that the prev animation |
| // is still in playing, then the next animation should be ignored. |
| if (refData && refData[stylesKey]) { |
| return |
| } |
| if (!refData) { |
| refData = _data[ref] = {}; |
| } |
| refData[stylesKey] = true; |
| |
| var component = this.getComponentManager().getComponent(ref); |
| return transitionOnce$1(component, config, function () { |
| // Remove the stylesKey in refData so that the same animation |
| // can be played again after current animation is already finished. |
| delete refData[stylesKey]; |
| weexInstance.sender.performCallback(callbackId); |
| }) |
| } |
| }; |
| |
| var meta = { |
| animation: [{ |
| name: 'transition', |
| args: ['string', 'object', 'function'] |
| }] |
| }; |
| |
| var Animation = { |
| init: function (Weex) { |
| Weex.registerApiModule('animation', animation, meta); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /** |
| |
| AUCTION: |
| taskQueue |
| Clipboard.setString() NOW not works, facing to user-act lose of taskQueue. |
| |
| works in Chrome Firefox Opera. but not in Safari. |
| @see https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand#Browser_compatibility |
| |
| Clipboard.getString() unimplemented. There is no easy way to do paste from clipboard to js variable. |
| |
| So look out your app behavior, when downgrade to html5 render. |
| Any idea is welcome. |
| **/ |
| |
| var WEEX_CLIPBOARD_ID = '__weex_clipboard_id__'; |
| |
| var clipboard = { |
| |
| getString: function (callbackId) { |
| // not supported in html5 |
| console.log('clipboard.getString() is not supported now.'); |
| }, |
| |
| setString: function (text) { |
| // not support safari |
| if (typeof text === 'string' && text !== '' && document.execCommand) { |
| var tempInput = element(); |
| tempInput.value = text; |
| |
| tempInput.select(); |
| document.execCommand('copy'); |
| // var out = document.execCommand('copy'); |
| // console.log("execCommand out is " + out); |
| tempInput.value = ''; |
| tempInput.blur(); |
| } |
| else { |
| console.log('only support string input now'); |
| } |
| } |
| |
| }; |
| |
| function element () { |
| var tempInput = document.getElementById(WEEX_CLIPBOARD_ID); |
| if (!tempInput) { |
| tempInput = document.createElement('input'); |
| tempInput.setAttribute('id', WEEX_CLIPBOARD_ID); |
| tempInput.style.cssText = 'height:1px;width:1px;border:none;'; |
| // tempInput.style.cssText = "height:40px;width:300px;border:solid;" |
| document.body.appendChild(tempInput); |
| } |
| return tempInput |
| } |
| |
| var meta$1 = { |
| clipboard: [{ |
| name: 'getString', |
| args: ['function'] |
| }, { |
| name: 'setString', |
| args: ['string'] |
| }] |
| }; |
| |
| var Clipboard = { |
| init: function (Weex) { |
| Weex.registerApiModule('clipboard', clipboard, meta$1); |
| } |
| }; |
| |
| /** |
| * Expose `Emitter`. |
| */ |
| |
| var index$5 = Emitter$1; |
| |
| /** |
| * Initialize a new `Emitter`. |
| * |
| * @api public |
| */ |
| |
| function Emitter$1(obj) { |
| if (obj) { return mixin(obj); } |
| } |
| |
| /** |
| * Mixin the emitter properties. |
| * |
| * @param {Object} obj |
| * @return {Object} |
| * @api private |
| */ |
| |
| function mixin(obj) { |
| for (var key in Emitter$1.prototype) { |
| obj[key] = Emitter$1.prototype[key]; |
| } |
| return obj; |
| } |
| |
| /** |
| * Listen on the given `event` with `fn`. |
| * |
| * @param {String} event |
| * @param {Function} fn |
| * @return {Emitter} |
| * @api public |
| */ |
| |
| Emitter$1.prototype.on = |
| Emitter$1.prototype.addEventListener = function(event, fn){ |
| this._callbacks = this._callbacks || {}; |
| (this._callbacks['$' + event] = this._callbacks['$' + event] || []) |
| .push(fn); |
| return this; |
| }; |
| |
| /** |
| * Adds an `event` listener that will be invoked a single |
| * time then automatically removed. |
| * |
| * @param {String} event |
| * @param {Function} fn |
| * @return {Emitter} |
| * @api public |
| */ |
| |
| Emitter$1.prototype.once = function(event, fn){ |
| function on() { |
| this.off(event, on); |
| fn.apply(this, arguments); |
| } |
| |
| on.fn = fn; |
| this.on(event, on); |
| return this; |
| }; |
| |
| /** |
| * Remove the given callback for `event` or all |
| * registered callbacks. |
| * |
| * @param {String} event |
| * @param {Function} fn |
| * @return {Emitter} |
| * @api public |
| */ |
| |
| Emitter$1.prototype.off = |
| Emitter$1.prototype.removeListener = |
| Emitter$1.prototype.removeAllListeners = |
| Emitter$1.prototype.removeEventListener = function(event, fn){ |
| this._callbacks = this._callbacks || {}; |
| |
| // all |
| if (0 == arguments.length) { |
| this._callbacks = {}; |
| return this; |
| } |
| |
| // specific event |
| var callbacks = this._callbacks['$' + event]; |
| if (!callbacks) { return this; } |
| |
| // remove all handlers |
| if (1 == arguments.length) { |
| delete this._callbacks['$' + event]; |
| return this; |
| } |
| |
| // remove specific handler |
| var cb; |
| for (var i = 0; i < callbacks.length; i++) { |
| cb = callbacks[i]; |
| if (cb === fn || cb.fn === fn) { |
| callbacks.splice(i, 1); |
| break; |
| } |
| } |
| return this; |
| }; |
| |
| /** |
| * Emit `event` with the given args. |
| * |
| * @param {String} event |
| * @param {Mixed} ... |
| * @return {Emitter} |
| */ |
| |
| Emitter$1.prototype.emit = function(event){ |
| var this$1 = this; |
| |
| this._callbacks = this._callbacks || {}; |
| var args = [].slice.call(arguments, 1) |
| , callbacks = this._callbacks['$' + event]; |
| |
| if (callbacks) { |
| callbacks = callbacks.slice(0); |
| for (var i = 0, len = callbacks.length; i < len; ++i) { |
| callbacks[i].apply(this$1, args); |
| } |
| } |
| |
| return this; |
| }; |
| |
| /** |
| * Return array of callbacks for `event`. |
| * |
| * @param {String} event |
| * @return {Array} |
| * @api public |
| */ |
| |
| Emitter$1.prototype.listeners = function(event){ |
| this._callbacks = this._callbacks || {}; |
| return this._callbacks['$' + event] || []; |
| }; |
| |
| /** |
| * Check if this emitter has `event` handlers. |
| * |
| * @param {String} event |
| * @return {Boolean} |
| * @api public |
| */ |
| |
| Emitter$1.prototype.hasListeners = function(event){ |
| return !! this.listeners(event).length; |
| }; |
| |
| /** |
| * toString ref. |
| */ |
| |
| var toString$3 = Object.prototype.toString; |
| |
| /** |
| * Return the type of `val`. |
| * |
| * @param {Mixed} val |
| * @return {String} |
| * @api public |
| */ |
| |
| var index$9 = function(val){ |
| switch (toString$3.call(val)) { |
| case '[object Date]': return 'date'; |
| case '[object RegExp]': return 'regexp'; |
| case '[object Arguments]': return 'arguments'; |
| case '[object Array]': return 'array'; |
| case '[object Error]': return 'error'; |
| } |
| |
| if (val === null) { return 'null'; } |
| if (val === undefined) { return 'undefined'; } |
| if (val !== val) { return 'nan'; } |
| if (val && val.nodeType === 1) { return 'element'; } |
| |
| val = val.valueOf |
| ? val.valueOf() |
| : Object.prototype.valueOf.apply(val); |
| |
| return typeof val; |
| }; |
| |
| /** |
| * Module dependencies. |
| */ |
| |
| var type$2; |
| try { |
| type$2 = index$9; |
| } catch (_) { |
| type$2 = index$9; |
| } |
| |
| /** |
| * Module exports. |
| */ |
| |
| var index$7 = clone$1; |
| |
| /** |
| * Clones objects. |
| * |
| * @param {Mixed} any object |
| * @api public |
| */ |
| |
| function clone$1(obj){ |
| switch (type$2(obj)) { |
| case 'object': |
| var copy = {}; |
| for (var key in obj) { |
| if (obj.hasOwnProperty(key)) { |
| copy[key] = clone$1(obj[key]); |
| } |
| } |
| return copy; |
| |
| case 'array': |
| var copy = new Array(obj.length); |
| for (var i = 0, l = obj.length; i < l; i++) { |
| copy[i] = clone$1(obj[i]); |
| } |
| return copy; |
| |
| case 'regexp': |
| // from millermedeiros/amd-utils - MIT |
| var flags = ''; |
| flags += obj.multiline ? 'm' : ''; |
| flags += obj.global ? 'g' : ''; |
| flags += obj.ignoreCase ? 'i' : ''; |
| return new RegExp(obj.source, flags); |
| |
| case 'date': |
| return new Date(obj.getTime()); |
| |
| default: // string, number, boolean, … |
| return obj; |
| } |
| } |
| |
| var index$11 = createCommonjsModule(function (module, exports) { |
| // easing functions from "Tween.js" |
| |
| exports.linear = function(n){ |
| return n; |
| }; |
| |
| exports.inQuad = function(n){ |
| return n * n; |
| }; |
| |
| exports.outQuad = function(n){ |
| return n * (2 - n); |
| }; |
| |
| exports.inOutQuad = function(n){ |
| n *= 2; |
| if (n < 1) { return 0.5 * n * n; } |
| return - 0.5 * (--n * (n - 2) - 1); |
| }; |
| |
| exports.inCube = function(n){ |
| return n * n * n; |
| }; |
| |
| exports.outCube = function(n){ |
| return --n * n * n + 1; |
| }; |
| |
| exports.inOutCube = function(n){ |
| n *= 2; |
| if (n < 1) { return 0.5 * n * n * n; } |
| return 0.5 * ((n -= 2 ) * n * n + 2); |
| }; |
| |
| exports.inQuart = function(n){ |
| return n * n * n * n; |
| }; |
| |
| exports.outQuart = function(n){ |
| return 1 - (--n * n * n * n); |
| }; |
| |
| exports.inOutQuart = function(n){ |
| n *= 2; |
| if (n < 1) { return 0.5 * n * n * n * n; } |
| return -0.5 * ((n -= 2) * n * n * n - 2); |
| }; |
| |
| exports.inQuint = function(n){ |
| return n * n * n * n * n; |
| }; |
| |
| exports.outQuint = function(n){ |
| return --n * n * n * n * n + 1; |
| }; |
| |
| exports.inOutQuint = function(n){ |
| n *= 2; |
| if (n < 1) { return 0.5 * n * n * n * n * n; } |
| return 0.5 * ((n -= 2) * n * n * n * n + 2); |
| }; |
| |
| exports.inSine = function(n){ |
| return 1 - Math.cos(n * Math.PI / 2 ); |
| }; |
| |
| exports.outSine = function(n){ |
| return Math.sin(n * Math.PI / 2); |
| }; |
| |
| exports.inOutSine = function(n){ |
| return .5 * (1 - Math.cos(Math.PI * n)); |
| }; |
| |
| exports.inExpo = function(n){ |
| return 0 == n ? 0 : Math.pow(1024, n - 1); |
| }; |
| |
| exports.outExpo = function(n){ |
| return 1 == n ? n : 1 - Math.pow(2, -10 * n); |
| }; |
| |
| exports.inOutExpo = function(n){ |
| if (0 == n) { return 0; } |
| if (1 == n) { return 1; } |
| if ((n *= 2) < 1) { return .5 * Math.pow(1024, n - 1); } |
| return .5 * (-Math.pow(2, -10 * (n - 1)) + 2); |
| }; |
| |
| exports.inCirc = function(n){ |
| return 1 - Math.sqrt(1 - n * n); |
| }; |
| |
| exports.outCirc = function(n){ |
| return Math.sqrt(1 - (--n * n)); |
| }; |
| |
| exports.inOutCirc = function(n){ |
| n *= 2; |
| if (n < 1) { return -0.5 * (Math.sqrt(1 - n * n) - 1); } |
| return 0.5 * (Math.sqrt(1 - (n -= 2) * n) + 1); |
| }; |
| |
| exports.inBack = function(n){ |
| var s = 1.70158; |
| return n * n * (( s + 1 ) * n - s); |
| }; |
| |
| exports.outBack = function(n){ |
| var s = 1.70158; |
| return --n * n * ((s + 1) * n + s) + 1; |
| }; |
| |
| exports.inOutBack = function(n){ |
| var s = 1.70158 * 1.525; |
| if ( ( n *= 2 ) < 1 ) { return 0.5 * ( n * n * ( ( s + 1 ) * n - s ) ); } |
| return 0.5 * ( ( n -= 2 ) * n * ( ( s + 1 ) * n + s ) + 2 ); |
| }; |
| |
| exports.inBounce = function(n){ |
| return 1 - exports.outBounce(1 - n); |
| }; |
| |
| exports.outBounce = function(n){ |
| if ( n < ( 1 / 2.75 ) ) { |
| return 7.5625 * n * n; |
| } else if ( n < ( 2 / 2.75 ) ) { |
| return 7.5625 * ( n -= ( 1.5 / 2.75 ) ) * n + 0.75; |
| } else if ( n < ( 2.5 / 2.75 ) ) { |
| return 7.5625 * ( n -= ( 2.25 / 2.75 ) ) * n + 0.9375; |
| } else { |
| return 7.5625 * ( n -= ( 2.625 / 2.75 ) ) * n + 0.984375; |
| } |
| }; |
| |
| exports.inOutBounce = function(n){ |
| if (n < .5) { return exports.inBounce(n * 2) * .5; } |
| return exports.outBounce(n * 2 - 1) * .5 + .5; |
| }; |
| |
| // aliases |
| |
| exports['in-quad'] = exports.inQuad; |
| exports['out-quad'] = exports.outQuad; |
| exports['in-out-quad'] = exports.inOutQuad; |
| exports['in-cube'] = exports.inCube; |
| exports['out-cube'] = exports.outCube; |
| exports['in-out-cube'] = exports.inOutCube; |
| exports['in-quart'] = exports.inQuart; |
| exports['out-quart'] = exports.outQuart; |
| exports['in-out-quart'] = exports.inOutQuart; |
| exports['in-quint'] = exports.inQuint; |
| exports['out-quint'] = exports.outQuint; |
| exports['in-out-quint'] = exports.inOutQuint; |
| exports['in-sine'] = exports.inSine; |
| exports['out-sine'] = exports.outSine; |
| exports['in-out-sine'] = exports.inOutSine; |
| exports['in-expo'] = exports.inExpo; |
| exports['out-expo'] = exports.outExpo; |
| exports['in-out-expo'] = exports.inOutExpo; |
| exports['in-circ'] = exports.inCirc; |
| exports['out-circ'] = exports.outCirc; |
| exports['in-out-circ'] = exports.inOutCirc; |
| exports['in-back'] = exports.inBack; |
| exports['out-back'] = exports.outBack; |
| exports['in-out-back'] = exports.inOutBack; |
| exports['in-bounce'] = exports.inBounce; |
| exports['out-bounce'] = exports.outBounce; |
| exports['in-out-bounce'] = exports.inOutBounce; |
| }); |
| |
| /** |
| * Module dependencies. |
| */ |
| |
| var Emitter = index$5; |
| var clone = index$7; |
| var type$1 = index$9; |
| var ease = index$11; |
| |
| /** |
| * Expose `Tween`. |
| */ |
| |
| var index$3 = Tween$1; |
| |
| /** |
| * Initialize a new `Tween` with `obj`. |
| * |
| * @param {Object|Array} obj |
| * @api public |
| */ |
| |
| function Tween$1(obj) { |
| if (!(this instanceof Tween$1)) { return new Tween$1(obj); } |
| this._from = obj; |
| this.ease('linear'); |
| this.duration(500); |
| } |
| |
| /** |
| * Mixin emitter. |
| */ |
| |
| Emitter(Tween$1.prototype); |
| |
| /** |
| * Reset the tween. |
| * |
| * @api public |
| */ |
| |
| Tween$1.prototype.reset = function(){ |
| this.isArray = 'array' === type$1(this._from); |
| this._curr = clone(this._from); |
| this._done = false; |
| this._start = Date.now(); |
| return this; |
| }; |
| |
| /** |
| * Tween to `obj` and reset internal state. |
| * |
| * tween.to({ x: 50, y: 100 }) |
| * |
| * @param {Object|Array} obj |
| * @return {Tween} self |
| * @api public |
| */ |
| |
| Tween$1.prototype.to = function(obj){ |
| this.reset(); |
| this._to = obj; |
| return this; |
| }; |
| |
| /** |
| * Set duration to `ms` [500]. |
| * |
| * @param {Number} ms |
| * @return {Tween} self |
| * @api public |
| */ |
| |
| Tween$1.prototype.duration = function(ms){ |
| this._duration = ms; |
| return this; |
| }; |
| |
| /** |
| * Set easing function to `fn`. |
| * |
| * tween.ease('in-out-sine') |
| * |
| * @param {String|Function} fn |
| * @return {Tween} |
| * @api public |
| */ |
| |
| Tween$1.prototype.ease = function(fn){ |
| fn = 'function' == typeof fn ? fn : ease[fn]; |
| if (!fn) { throw new TypeError('invalid easing function'); } |
| this._ease = fn; |
| return this; |
| }; |
| |
| /** |
| * Stop the tween and immediately emit "stop" and "end". |
| * |
| * @return {Tween} |
| * @api public |
| */ |
| |
| Tween$1.prototype.stop = function(){ |
| this.stopped = true; |
| this._done = true; |
| this.emit('stop'); |
| this.emit('end'); |
| return this; |
| }; |
| |
| /** |
| * Perform a step. |
| * |
| * @return {Tween} self |
| * @api private |
| */ |
| |
| Tween$1.prototype.step = function(){ |
| if (this._done) { return; } |
| |
| // duration |
| var duration = this._duration; |
| var now = Date.now(); |
| var delta = now - this._start; |
| var done = delta >= duration; |
| |
| // complete |
| if (done) { |
| this._from = this._to; |
| this._update(this._to); |
| this._done = true; |
| this.emit('end'); |
| return this; |
| } |
| |
| // tween |
| var from = this._from; |
| var to = this._to; |
| var curr = this._curr; |
| var fn = this._ease; |
| var p = (now - this._start) / duration; |
| var n = fn(p); |
| |
| // array |
| if (this.isArray) { |
| for (var i = 0; i < from.length; ++i) { |
| curr[i] = from[i] + (to[i] - from[i]) * n; |
| } |
| |
| this._update(curr); |
| return this; |
| } |
| |
| // objech |
| for (var k in from) { |
| curr[k] = from[k] + (to[k] - from[k]) * n; |
| } |
| |
| this._update(curr); |
| return this; |
| }; |
| |
| /** |
| * Set update function to `fn` or |
| * when no argument is given this performs |
| * a "step". |
| * |
| * @param {Function} fn |
| * @return {Tween} self |
| * @api public |
| */ |
| |
| Tween$1.prototype.update = function(fn){ |
| if (0 == arguments.length) { return this.step(); } |
| this._update = fn; |
| return this; |
| }; |
| |
| var index$13 = createCommonjsModule(function (module, exports) { |
| /** |
| * Expose `requestAnimationFrame()`. |
| */ |
| |
| exports = module.exports = window.requestAnimationFrame |
| || window.webkitRequestAnimationFrame |
| || window.mozRequestAnimationFrame |
| || fallback; |
| |
| /** |
| * Fallback implementation. |
| */ |
| |
| var prev = new Date().getTime(); |
| function fallback(fn) { |
| var curr = new Date().getTime(); |
| var ms = Math.max(0, 16 - (curr - prev)); |
| var req = setTimeout(fn, ms); |
| prev = curr; |
| return req; |
| } |
| |
| /** |
| * Cancel. |
| */ |
| |
| var cancel = window.cancelAnimationFrame |
| || window.webkitCancelAnimationFrame |
| || window.mozCancelAnimationFrame |
| || window.clearTimeout; |
| |
| exports.cancel = function(id){ |
| cancel.call(window, id); |
| }; |
| }); |
| |
| /** |
| * Module dependencies. |
| */ |
| |
| var Tween = index$3; |
| var raf$1 = index$13; |
| |
| /** |
| * Expose `scrollTo`. |
| */ |
| |
| var index$2 = scrollTo; |
| |
| /** |
| * Scroll to `(x, y)`. |
| * |
| * @param {Number} x |
| * @param {Number} y |
| * @api public |
| */ |
| |
| function scrollTo(x, y, options) { |
| options = options || {}; |
| |
| // start position |
| var start = scroll(); |
| |
| // setup tween |
| var tween = Tween(start) |
| .ease(options.ease || 'out-circ') |
| .to({ top: y, left: x }) |
| .duration(options.duration || 1000); |
| |
| // scroll |
| tween.update(function(o){ |
| window.scrollTo(o.left | 0, o.top | 0); |
| }); |
| |
| // handle end |
| tween.on('end', function(){ |
| animate = function(){}; |
| }); |
| |
| // animate |
| function animate() { |
| raf$1(animate); |
| tween.update(); |
| } |
| |
| animate(); |
| |
| return tween; |
| } |
| |
| /** |
| * Return scroll position. |
| * |
| * @return {Object} |
| * @api private |
| */ |
| |
| function scroll() { |
| var y = window.pageYOffset || document.documentElement.scrollTop; |
| var x = window.pageXOffset || document.documentElement.scrollLeft; |
| return { top: y, left: x }; |
| } |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var camelToKebab$1; |
| var appendStyle$2; |
| |
| var dom = { |
| |
| /** |
| * createBody: create root component |
| * @param {object} element |
| * container|listview|scrollview |
| * @return {[type]} [description] |
| */ |
| createBody: function (element) { |
| var componentManager = this.getComponentManager(); |
| element.instanceId = componentManager.instanceId; |
| return componentManager.createBody(element) |
| }, |
| |
| addElement: function (parentRef, element, index) { |
| var componentManager = this.getComponentManager(); |
| element.instanceId = componentManager.instanceId; |
| return componentManager.addElement(parentRef, element, index) |
| }, |
| |
| removeElement: function (ref) { |
| var componentManager = this.getComponentManager(); |
| return componentManager.removeElement(ref) |
| }, |
| |
| moveElement: function (ref, parentRef, index) { |
| var componentManager = this.getComponentManager(); |
| return componentManager.moveElement(ref, parentRef, index) |
| }, |
| |
| addEvent: function (ref, type) { |
| var componentManager = this.getComponentManager(); |
| return componentManager.addEvent(ref, type) |
| }, |
| |
| removeEvent: function (ref, type) { |
| var componentManager = this.getComponentManager(); |
| return componentManager.removeEvent(ref, type) |
| }, |
| |
| /** |
| * updateAttrs: update attributes of component |
| * @param {string} ref |
| * @param {obj} attr |
| */ |
| updateAttrs: function (ref, attr) { |
| var componentManager = this.getComponentManager(); |
| return componentManager.updateAttrs(ref, attr) |
| }, |
| |
| /** |
| * updateStyle: udpate style of component |
| * @param {string} ref |
| * @param {obj} style |
| */ |
| updateStyle: function (ref, style) { |
| var componentManager = this.getComponentManager(); |
| return componentManager.updateStyle(ref, style) |
| }, |
| |
| /** |
| * scrollToElement |
| * @param {string} ref |
| * @param {obj} options {offset:Number} |
| * ps: scroll-to has 'ease' and 'duration'(ms) as options. |
| */ |
| scrollToElement: function (ref, options) { |
| !options && (options = {}); |
| var offset = Number(options.offset) || 0; |
| var elem = this.getComponentManager().getComponent(ref); |
| if (!elem) { |
| return console.error(("[h5-render] component of ref " + ref + " doesn't exist.")) |
| } |
| var parentScroller = elem.getParentScroller(); |
| if (parentScroller) { |
| parentScroller.scroller.scrollToElement(elem.node, true, offset); |
| } |
| else { |
| var offsetTop = elem.node.getBoundingClientRect().top |
| + document.body.scrollTop; |
| var tween = index$2(0, offsetTop + offset, options); |
| tween.on('end', function () { |
| console.log('scroll end.'); |
| }); |
| } |
| }, |
| |
| /** |
| * getComponentRect |
| * @param {string} ref |
| * @param {function} callbackId |
| */ |
| getComponentRect: function (ref, callbackId) { |
| var info = { result: false }; |
| |
| if (ref && ref === 'viewport') { |
| info.result = true; |
| info.size = { |
| width: document.documentElement.clientWidth, |
| height: document.documentElement.clientHeight, |
| top: 0, |
| left: 0, |
| right: document.documentElement.clientWidth, |
| bottom: document.documentElement.clientHeight |
| }; |
| } |
| else { |
| var elem = this.getComponentManager().getComponent(ref); |
| if (elem && elem.node) { |
| info.result = true; |
| info.size = elem.node.getBoundingClientRect(); |
| } |
| } |
| |
| var message = info.result ? info : { |
| result: false, |
| errMsg: 'Illegal parameter' |
| }; |
| this.sender.performCallback(callbackId, message); |
| return message |
| }, |
| |
| /** |
| * for adding fontFace |
| * @param {string} key fontFace |
| * @param {object} styles rules |
| */ |
| addRule: function (key, styles) { |
| key = camelToKebab$1(key); |
| var stylesText = ''; |
| for (var k in styles) { |
| if (styles.hasOwnProperty(k)) { |
| stylesText += camelToKebab$1(k) + ':' + styles[k] + ';'; |
| } |
| } |
| var styleText = "@" + key + "{" + stylesText + "}"; |
| appendStyle$2(styleText, 'dom-added-rules'); |
| }, |
| |
| createFinish: function createFinish (callback) { |
| return this.getComponentManager().createFinish() |
| }, |
| |
| updateFinish: function updateFinish (callback) { |
| return this.getComponentManager().updateFinish() |
| }, |
| |
| refreshFinish: function refreshFinish (callback) { |
| return this.getComponentManager().refreshFinish() |
| } |
| }; |
| |
| var meta$2 = { |
| dom: [{ |
| name: 'createBody', |
| args: ['object'] |
| }, { |
| name: 'addElement', |
| args: ['string', 'object', 'number'] |
| }, { |
| name: 'removeElement', |
| args: ['string'] |
| }, { |
| name: 'moveElement', |
| args: ['string', 'string', 'number'] |
| }, { |
| name: 'addEvent', |
| args: ['string', 'string'] |
| }, { |
| name: 'removeEvent', |
| args: ['string', 'string'] |
| }, { |
| name: 'updateAttrs', |
| args: ['string', 'object'] |
| }, { |
| name: 'updateStyle', |
| args: ['string', 'object'] |
| }, { |
| name: 'createFinish', |
| args: [] |
| }, { |
| name: 'updateFinish', |
| args: [] |
| }, { |
| name: 'refreshFinish', |
| args: [] |
| }, { |
| name: 'scrollToElement', |
| args: ['string', 'object'] |
| }, { |
| name: 'getComponentRect', |
| args: ['string', 'function'] |
| }, { |
| name: 'addRule', |
| args: ['string', 'object'] |
| }] |
| }; |
| |
| var Dom = { |
| init: function (Weex) { |
| camelToKebab$1 = Weex.utils.camelToKebab; |
| appendStyle$2 = Weex.utils.appendStyle; |
| Weex.registerApiModule('dom', dom, meta$2); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var event$6 = { |
| /** |
| * openUrl |
| * @param {string} url |
| */ |
| openURL: function (url) { |
| location.href = url; |
| } |
| |
| }; |
| |
| var meta$3 = { |
| event: [{ |
| name: 'openURL', |
| args: ['string'] |
| }] |
| }; |
| |
| var Event$1 = { |
| init: function (Weex) { |
| Weex.registerApiModule('event', event$6, meta$3); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var supportGeolocation = 'geolocation' in navigator; |
| var errorMsg = "[h5-render]: browser doesn't support geolocation."; |
| |
| var geolocation = { |
| // options: |
| // - enableHighAccuracy optional, value is true or false, false by default. |
| // - timeout [none-native] optional, value is a number (milliseconds), default vaule is FINFINITY. |
| // - maximumAge [none-native] optional, value is a number (milliseconds), default value is 0. |
| getCurrentPosition: function getCurrentPosition (successCbId, errorCbId, options) { |
| var this$1 = this; |
| |
| var successCb = function (pos) { return this$1.sender.performCallback(successCbId, pos); }; |
| var errorCb = function (err) { return this$1.sender.performCallback(errorCbId, err); }; |
| if (supportGeolocation) { |
| navigator.geolocation.getCurrentPosition(successCb, errorCb, options); |
| } |
| else { |
| console.warn(errorMsg); |
| errorCb(new Error(errorMsg)); |
| } |
| }, |
| |
| // options: the same with `getCurrentPosition`. |
| watchPosition: function watchPosition (successCbId, errorCbId, options) { |
| var this$1 = this; |
| |
| var successCb = function (pos) { return this$1.sender.performCallback(successCbId, pos, true); }; |
| var errorCb = function (err) { return this$1.sender.performCallback(errorCbId, err); }; |
| if (supportGeolocation) { |
| var id = navigator.geolocation.watchPosition(function (pos) { |
| pos.watchId = id; |
| successCb(pos); |
| }, errorCb, options); |
| } |
| else { |
| console.warn(errorMsg); |
| errorCb(new Error(errorMsg)); |
| } |
| }, |
| |
| clearWatch: function clearWatch (watchId) { |
| if (supportGeolocation) { |
| navigator.geolocation.clearWatch(watchId); |
| } |
| else { |
| console.warn(errorMsg); |
| } |
| } |
| }; |
| |
| var meta$4 = { |
| geolocation: [{ |
| name: 'getCurrentPosition', |
| args: ['function', 'function', 'object'] |
| }, { |
| name: 'watchPosition', |
| args: ['function', 'function', 'object'] |
| }, { |
| name: 'clearWatch', |
| args: ['string'] |
| }] |
| }; |
| |
| var Geolocation = { |
| init: function init (Weex) { |
| Weex.registerApiModule('geolocation', geolocation, meta$4); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // track varies kinds of events and listeners. |
| var handlerTraker = {}; |
| |
| var globalEvent = { |
| |
| /** |
| * addEventListener |
| * @param {string} evt - the event name to add a listener on. |
| */ |
| addEventListener: function addEventListener (evt, callbackId) { |
| var this$1 = this; |
| |
| var cb = function (e) { return this$1.sender.performCallback(callbackId, e, true); }; |
| if (!handlerTraker[evt]) { |
| handlerTraker[evt] = [cb]; |
| } |
| else { |
| handlerTraker[evt].push(cb); |
| } |
| document.addEventListener(evt, cb); |
| }, |
| |
| /** |
| * removeEventListener |
| * @param {string} evt - the event name to remove a listener from. |
| */ |
| removeEventListener: function removeEventListener (evt) { |
| handlerTraker[evt].forEach(function (cb) { return document.removeEventListener(evt, cb); }); |
| } |
| }; |
| |
| var meta$5 = { |
| globalEvent: [{ |
| name: 'addEventListener', |
| args: ['string', 'function'] |
| }, { |
| name: 'removeEventListener', |
| args: ['string'] |
| }] |
| }; |
| |
| var GlobalEvent = { |
| init: function init (Weex) { |
| Weex.registerApiModule('globalEvent', globalEvent, meta$5); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var metaModule = { |
| |
| /** |
| * setViewport |
| * @param {object} config |
| * - width: number | 'device-width' |
| */ |
| setViewport: function (config) { |
| document.querySelector('meta[name=viewport]').setAttribute('content', ("width=" + (config.width) + ", user-scalable=no")); |
| } |
| }; |
| |
| var meta$6 = { |
| meta: [{ |
| name: 'setViewport', |
| args: ['object'] |
| }] |
| }; |
| |
| var Meta = { |
| init: function (Weex) { |
| Weex.registerApiModule('meta', metaModule, meta$6); |
| } |
| }; |
| |
| __$styleInject(".amfe-modal-wrap {\n display: none;\n position: fixed;\n z-index: 999999999;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: #000;\n opacity: 0.5;\n}\n\n.amfe-modal-node {\n position: fixed;\n z-index: 9999999999;\n top: 50%;\n left: 50%;\n width: 6.666667rem;\n min-height: 2.666667rem;\n border-radius: 0.066667rem;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n background-color: #fff;\n}\n.amfe-modal-node.hide {\n display: none;\n}\n.amfe-modal-node .content {\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n width: 100%;\n min-height: 1.866667rem;\n box-sizing: border-box;\n font-size: 0.32rem;\n line-height: 0.426667rem;\n padding: 0.213333rem;\n border-bottom: 1px solid #ddd;\n}\n.amfe-modal-node .btn-group {\n width: 100%;\n height: 0.8rem;\n font-size: 0.373333rem;\n text-align: center;\n margin: 0;\n padding: 0;\n border: none;\n}\n.amfe-modal-node .btn-group .btn {\n box-sizing: border-box;\n height: 0.8rem;\n line-height: 0.8rem;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n",undefined); |
| |
| // there will be only one instance of modal. |
| var MODAL_WRAP_CLASS = 'amfe-modal-wrap'; |
| var MODAL_NODE_CLASS = 'amfe-modal-node'; |
| |
| function Modal$2() { |
| this.wrap = document.querySelector(MODAL_WRAP_CLASS); |
| this.node = document.querySelector(MODAL_NODE_CLASS); |
| if (!this.wrap) { |
| this.createWrap(); |
| } |
| if (!this.node) { |
| this.createNode(); |
| } |
| this.clearNode(); |
| this.createNodeContent(); |
| this.bindEvents(); |
| } |
| |
| Modal$2.prototype = { |
| |
| show: function () { |
| this.wrap.style.display = 'block'; |
| this.node.classList.remove('hide'); |
| }, |
| |
| destroy: function () { |
| document.body.removeChild(this.wrap); |
| document.body.removeChild(this.node); |
| this.wrap = null; |
| this.node = null; |
| }, |
| |
| createWrap: function () { |
| this.wrap = document.createElement('div'); |
| this.wrap.className = MODAL_WRAP_CLASS; |
| document.body.appendChild(this.wrap); |
| }, |
| |
| createNode: function () { |
| this.node = document.createElement('div'); |
| this.node.classList.add(MODAL_NODE_CLASS, 'hide'); |
| document.body.appendChild(this.node); |
| }, |
| |
| clearNode: function () { |
| this.node.innerHTML = ''; |
| }, |
| |
| createNodeContent: function () { |
| |
| // do nothing. |
| // child classes can override this method. |
| }, |
| |
| bindEvents: function () { |
| this.wrap.addEventListener('click', function (e) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| }); |
| } |
| }; |
| |
| var modal$2 = Modal$2; |
| |
| __$styleInject(".amfe-alert .amfe-alert-ok {\n width: 100%;\n}\n",undefined); |
| |
| var Modal$1 = modal$2; |
| |
| |
| var CONTENT_CLASS = 'content'; |
| var MSG_CLASS = 'content-msg'; |
| var BUTTON_GROUP_CLASS = 'btn-group'; |
| var BUTTON_CLASS = 'btn'; |
| |
| function Alert$1(config) { |
| this.msg = config.message || ''; |
| this.callback = config.callback; |
| this.okTitle = config.okTitle || 'OK'; |
| Modal$1.call(this); |
| this.node.classList.add('amfe-alert'); |
| } |
| |
| Alert$1.prototype = Object.create(Modal$1.prototype); |
| |
| Alert$1.prototype.createNodeContent = function () { |
| var content = document.createElement('div'); |
| content.classList.add(CONTENT_CLASS); |
| this.node.appendChild(content); |
| |
| var msg = document.createElement('div'); |
| msg.classList.add(MSG_CLASS); |
| msg.appendChild(document.createTextNode(this.msg)); |
| content.appendChild(msg); |
| |
| var buttonGroup = document.createElement('div'); |
| buttonGroup.classList.add(BUTTON_GROUP_CLASS); |
| this.node.appendChild(buttonGroup); |
| var button = document.createElement('div'); |
| button.classList.add(BUTTON_CLASS, 'alert-ok'); |
| button.appendChild(document.createTextNode(this.okTitle)); |
| buttonGroup.appendChild(button); |
| }; |
| |
| Alert$1.prototype.bindEvents = function () { |
| Modal$1.prototype.bindEvents.call(this); |
| var button = this.node.querySelector('.' + BUTTON_CLASS); |
| button.addEventListener('click', function () { |
| this.destroy(); |
| this.callback && this.callback(); |
| }.bind(this)); |
| }; |
| |
| var alert$1 = Alert$1; |
| |
| __$styleInject(".amfe-confirm .btn-group .btn {\n float: left;\n width: 50%;\n}\n.amfe-confirm .btn-group .btn.btn-ok {\n border-right: 1px solid #ddd;\n}\n",undefined); |
| |
| var Modal$3 = modal$2; |
| |
| |
| var CONTENT_CLASS$1 = 'content'; |
| var MSG_CLASS$1 = 'content-msg'; |
| var BUTTON_GROUP_CLASS$1 = 'btn-group'; |
| var BUTTON_CLASS$1 = 'btn'; |
| |
| function Confirm$1(config) { |
| this.msg = config.message || ''; |
| this.callback = config.callback; |
| this.okTitle = config.okTitle || 'OK'; |
| this.cancelTitle = config.cancelTitle || 'Cancel'; |
| Modal$3.call(this); |
| this.node.classList.add('amfe-confirm'); |
| } |
| |
| Confirm$1.prototype = Object.create(Modal$3.prototype); |
| |
| Confirm$1.prototype.createNodeContent = function () { |
| var content = document.createElement('div'); |
| content.classList.add(CONTENT_CLASS$1); |
| this.node.appendChild(content); |
| |
| var msg = document.createElement('div'); |
| msg.classList.add(MSG_CLASS$1); |
| msg.appendChild(document.createTextNode(this.msg)); |
| content.appendChild(msg); |
| |
| var buttonGroup = document.createElement('div'); |
| buttonGroup.classList.add(BUTTON_GROUP_CLASS$1); |
| this.node.appendChild(buttonGroup); |
| var btnOk = document.createElement('div'); |
| btnOk.appendChild(document.createTextNode(this.okTitle)); |
| btnOk.classList.add('btn-ok', BUTTON_CLASS$1); |
| var btnCancel = document.createElement('div'); |
| btnCancel.appendChild(document.createTextNode(this.cancelTitle)); |
| btnCancel.classList.add('btn-cancel', BUTTON_CLASS$1); |
| buttonGroup.appendChild(btnOk); |
| buttonGroup.appendChild(btnCancel); |
| this.node.appendChild(buttonGroup); |
| }; |
| |
| Confirm$1.prototype.bindEvents = function () { |
| Modal$3.prototype.bindEvents.call(this); |
| var btnOk = this.node.querySelector('.' + BUTTON_CLASS$1 + '.btn-ok'); |
| var btnCancel = this.node.querySelector('.' + BUTTON_CLASS$1 + '.btn-cancel'); |
| btnOk.addEventListener('click', function () { |
| this.destroy(); |
| this.callback && this.callback(this.okTitle); |
| }.bind(this)); |
| btnCancel.addEventListener('click', function () { |
| this.destroy(); |
| this.callback && this.callback(this.cancelTitle); |
| }.bind(this)); |
| }; |
| |
| var confirm = Confirm$1; |
| |
| __$styleInject(".amfe-prompt .input-wrap {\n box-sizing: border-box;\n width: 100%;\n margin-top: 0.133333rem;\n // padding: 0.24rem 0.213333rem 0.213333rem;\n height: 0.96rem;\n}\n.amfe-prompt .input-wrap .input {\n box-sizing: border-box;\n width: 100%;\n height: 0.56rem;\n line-height: 0.56rem;\n font-size: 0.32rem;\n border: 1px solid #999;\n}\n.amfe-prompt .btn-group .btn {\n float: left;\n width: 50%;\n}\n.amfe-prompt .btn-group .btn.btn-ok {\n border-right: 1px solid #ddd;\n}\n",undefined); |
| |
| var Modal$4 = modal$2; |
| |
| |
| var CONTENT_CLASS$2 = 'content'; |
| var MSG_CLASS$2 = 'content-msg'; |
| var BUTTON_GROUP_CLASS$2 = 'btn-group'; |
| var BUTTON_CLASS$2 = 'btn'; |
| var INPUT_WRAP_CLASS = 'input-wrap'; |
| var INPUT_CLASS = 'input'; |
| |
| function Prompt$1(config) { |
| this.msg = config.message || ''; |
| this.defaultMsg = config.default || ''; |
| this.callback = config.callback; |
| this.okTitle = config.okTitle || 'OK'; |
| this.cancelTitle = config.cancelTitle || 'Cancel'; |
| Modal$4.call(this); |
| this.node.classList.add('amfe-prompt'); |
| } |
| |
| Prompt$1.prototype = Object.create(Modal$4.prototype); |
| |
| Prompt$1.prototype.createNodeContent = function () { |
| |
| var content = document.createElement('div'); |
| content.classList.add(CONTENT_CLASS$2); |
| this.node.appendChild(content); |
| |
| var msg = document.createElement('div'); |
| msg.classList.add(MSG_CLASS$2); |
| msg.appendChild(document.createTextNode(this.msg)); |
| content.appendChild(msg); |
| |
| var inputWrap = document.createElement('div'); |
| inputWrap.classList.add(INPUT_WRAP_CLASS); |
| content.appendChild(inputWrap); |
| var input = document.createElement('input'); |
| input.classList.add(INPUT_CLASS); |
| input.type = 'text'; |
| input.autofocus = true; |
| input.placeholder = this.defaultMsg; |
| inputWrap.appendChild(input); |
| |
| var buttonGroup = document.createElement('div'); |
| buttonGroup.classList.add(BUTTON_GROUP_CLASS$2); |
| var btnOk = document.createElement('div'); |
| btnOk.appendChild(document.createTextNode(this.okTitle)); |
| btnOk.classList.add('btn-ok', BUTTON_CLASS$2); |
| var btnCancel = document.createElement('div'); |
| btnCancel.appendChild(document.createTextNode(this.cancelTitle)); |
| btnCancel.classList.add('btn-cancel', BUTTON_CLASS$2); |
| buttonGroup.appendChild(btnOk); |
| buttonGroup.appendChild(btnCancel); |
| this.node.appendChild(buttonGroup); |
| }; |
| |
| Prompt$1.prototype.bindEvents = function () { |
| Modal$4.prototype.bindEvents.call(this); |
| var btnOk = this.node.querySelector('.' + BUTTON_CLASS$2 + '.btn-ok'); |
| var btnCancel = this.node.querySelector('.' + BUTTON_CLASS$2 + '.btn-cancel'); |
| var that = this; |
| btnOk.addEventListener('click', function () { |
| var val = document.querySelector('input').value; |
| this.destroy(); |
| this.callback && this.callback({ |
| result: that.okTitle, |
| data: val |
| }); |
| }.bind(this)); |
| btnCancel.addEventListener('click', function () { |
| var val = document.querySelector('input').value; |
| this.destroy(); |
| this.callback && this.callback({ |
| result: that.cancelTitle, |
| data: val |
| }); |
| }.bind(this)); |
| }; |
| |
| var prompt = Prompt$1; |
| |
| __$styleInject(".amfe-toast {\n font-size: 0.32rem;\n line-height: 0.426667rem;\n position: fixed;\n box-sizing: border-box;\n max-width: 80%;\n bottom: 2.666667rem;\n left: 50%;\n padding: 0.213333rem;\n background-color: #000;\n color: #fff;\n text-align: center;\n opacity: 0.6;\n transition: all 0.4s ease-in-out;\n border-radius: 0.066667rem;\n -webkit-transform: translateX(-50%);\n transform: translateX(-50%);\n}\n\n.amfe-toast.hide {\n opacity: 0;\n}\n",undefined); |
| |
| var queue$1 = []; |
| var timer; |
| var isProcessing = false; |
| var toastWin; |
| var TOAST_WIN_CLASS_NAME = 'amfe-toast'; |
| |
| var DEFAULT_DURATION = 0.8; |
| |
| function showToastWindow(msg, callback) { |
| var handleTransitionEnd = function () { |
| toastWin.removeEventListener('transitionend', handleTransitionEnd); |
| toastWin.removeEventListener('webkitTransitionEnd', handleTransitionEnd); |
| callback && callback(); |
| }; |
| if (!toastWin) { |
| toastWin = document.createElement('div'); |
| toastWin.classList.add(TOAST_WIN_CLASS_NAME, 'hide'); |
| document.body.appendChild(toastWin); |
| } |
| toastWin.textContent = msg; |
| toastWin.addEventListener('transitionend', handleTransitionEnd); |
| toastWin.addEventListener('webkitTransitionEnd', handleTransitionEnd); |
| setTimeout(function () { |
| toastWin.classList.remove('hide'); |
| }, 0); |
| } |
| |
| function hideToastWindow(callback) { |
| var handleTransitionEnd = function () { |
| toastWin.removeEventListener('transitionend', handleTransitionEnd); |
| toastWin.removeEventListener('webkitTransitionEnd', handleTransitionEnd); |
| callback && callback(); |
| }; |
| if (!toastWin) { |
| return |
| } |
| toastWin.addEventListener('transitionend', handleTransitionEnd); |
| toastWin.addEventListener('webkitTransitionEnd', handleTransitionEnd); |
| setTimeout(function () { |
| toastWin.classList.add('hide'); |
| }, 0); |
| } |
| |
| var toast$1 = { |
| |
| push: function (msg, duration) { |
| queue$1.push({ |
| msg: msg, |
| duration: duration || DEFAULT_DURATION |
| }); |
| this.show(); |
| }, |
| |
| show: function () { |
| var that = this; |
| |
| // All messages had been toasted already, so remove the toast window, |
| if (!queue$1.length) { |
| toastWin && toastWin.parentNode.removeChild(toastWin); |
| toastWin = null; |
| return |
| } |
| |
| // the previous toast is not ended yet. |
| if (isProcessing) { |
| return |
| } |
| isProcessing = true; |
| |
| var toastInfo = queue$1.shift(); |
| showToastWindow(toastInfo.msg, function () { |
| timer = setTimeout(function () { |
| timer = null; |
| hideToastWindow(function () { |
| isProcessing = false; |
| that.show(); |
| }); |
| }, toastInfo.duration * 1000); |
| }); |
| } |
| }; |
| |
| var toast_1 = { |
| push: toast$1.push.bind(toast$1) |
| }; |
| |
| var Alert = alert$1; |
| var Confirm = confirm; |
| var Prompt = prompt; |
| var toast = toast_1; |
| |
| var modal = { |
| |
| toast: function (msg, duration) { |
| toast.push(msg, duration); |
| }, |
| |
| alert: function (config) { |
| new Alert(config).show(); |
| }, |
| |
| prompt: function (config) { |
| new Prompt(config).show(); |
| }, |
| |
| confirm: function (config) { |
| new Confirm(config).show(); |
| } |
| |
| }; |
| |
| !window.lib && (window.lib = {}); |
| window.lib.modal = modal; |
| |
| var index$15 = modal; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var msg = { |
| |
| // duration: default is 0.8 seconds. |
| toast: function (config) { |
| index$15.toast(config.message, config.duration); |
| }, |
| |
| // config: |
| // - message: string |
| // - okTitle: title of ok button |
| // - callback |
| alert: function (config, callbackId) { |
| var sender = this.sender; |
| config.callback = function () { |
| sender.performCallback(callbackId); |
| }; |
| index$15.alert(config); |
| }, |
| |
| // config: |
| // - message: string |
| // - okTitle: title of ok button |
| // - cancelTitle: title of cancel button |
| // - callback |
| confirm: function (config, callbackId) { |
| var sender = this.sender; |
| config.callback = function (val) { |
| sender.performCallback(callbackId, val); |
| }; |
| index$15.confirm(config); |
| }, |
| |
| // config: |
| // - message: string |
| // - okTitle: title of ok button |
| // - cancelTitle: title of cancel button |
| // - callback |
| prompt: function (config, callbackId) { |
| var sender = this.sender; |
| config.callback = function (val) { |
| sender.performCallback(callbackId, val); |
| }; |
| index$15.prompt(config); |
| } |
| }; |
| |
| var meta$7 = { |
| modal: [{ |
| name: 'toast', |
| args: ['object'] |
| }, { |
| name: 'alert', |
| args: ['object', 'function'] |
| }, { |
| name: 'confirm', |
| args: ['object', 'function'] |
| }, { |
| name: 'prompt', |
| args: ['object', 'function'] |
| }] |
| }; |
| |
| var Modal = { |
| init: function (Weex) { |
| Weex.registerApiModule('modal', msg, meta$7); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var navigator$1 = { |
| |
| // config |
| // - url: the url to push |
| // - animated: this configuration item is native only |
| // callback is not currently supported |
| push: function (config, callbackId) { |
| window.location.href = config.url; |
| this.sender.performCallback(callbackId); |
| }, |
| |
| // config |
| // - animated: this configuration item is native only |
| // callback is note currently supported |
| pop: function (config, callbackId) { |
| window.history.back(); |
| this.sender.performCallback(callbackId); |
| } |
| |
| }; |
| |
| var meta$8 = { |
| navigator: [{ |
| name: 'push', |
| args: ['object', 'function'] |
| }, { |
| name: 'pop', |
| args: ['object', 'function'] |
| }] |
| }; |
| |
| var Navigator = { |
| init: function (Weex) { |
| Weex.registerApiModule('navigator', navigator$1, meta$8); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var pageInfo = { |
| |
| setTitle: function (title) { |
| title = title || 'Weex HTML5'; |
| try { |
| title = decodeURIComponent(title); |
| } |
| catch (e) {} |
| document.title = title; |
| } |
| }; |
| |
| var meta$9 = { |
| pageInfo: [{ |
| name: 'setTitle', |
| args: ['string'] |
| }] |
| }; |
| |
| var PageInfo = { |
| init: function (Weex) { |
| Weex.registerApiModule('pageInfo', pageInfo, meta$9); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global localStorage */ |
| |
| var supportLocalStorage = typeof localStorage !== 'undefined'; |
| var SUCCESS = 'success'; |
| var FAILED = 'failed'; |
| var INVALID_PARAM = 'invalid_param'; |
| var UNDEFINED = 'undefined'; |
| |
| var storage = { |
| |
| /** |
| * When passed a key name and value, will add that key to the storage, |
| * or update that key's value if it already exists. |
| * @param {string} key |
| * @param {string} value |
| * @param {function} callbackId |
| */ |
| setItem: function (key, value, callbackId) { |
| if (!supportLocalStorage) { |
| console.error('your browser is not support localStorage yet.'); |
| return |
| } |
| var sender = this.sender; |
| if (!key || !value) { |
| sender.performCallback(callbackId, { |
| result: 'failed', |
| data: INVALID_PARAM |
| }); |
| return |
| } |
| try { |
| localStorage.setItem(key, value); |
| sender.performCallback(callbackId, { |
| result: SUCCESS, |
| data: UNDEFINED |
| }); |
| } |
| catch (e) { |
| // accept any exception thrown during a storage attempt as a quota error |
| sender.performCallback(callbackId, { |
| result: FAILED, |
| data: UNDEFINED |
| }); |
| } |
| }, |
| |
| /** |
| * When passed a key name, will return that key's value. |
| * @param {string} key |
| * @param {function} callbackId |
| */ |
| getItem: function (key, callbackId) { |
| if (!supportLocalStorage) { |
| console.error('your browser is not support localStorage yet.'); |
| return |
| } |
| var sender = this.sender; |
| if (!key) { |
| sender.performCallback(callbackId, { |
| result: FAILED, |
| data: INVALID_PARAM |
| }); |
| return |
| } |
| var val = localStorage.getItem(key); |
| sender.performCallback(callbackId, { |
| result: val ? SUCCESS : FAILED, |
| data: val || UNDEFINED |
| }); |
| }, |
| |
| /** |
| *When passed a key name, will remove that key from the storage. |
| * @param {string} key |
| * @param {function} callbackId |
| */ |
| removeItem: function (key, callbackId) { |
| if (!supportLocalStorage) { |
| console.error('your browser is not support localStorage yet.'); |
| return |
| } |
| var sender = this.sender; |
| if (!key) { |
| sender.performCallback(callbackId, { |
| result: FAILED, |
| data: INVALID_PARAM |
| }); |
| return |
| } |
| localStorage.removeItem(key); |
| sender.performCallback(callbackId, { |
| result: SUCCESS, |
| data: UNDEFINED |
| }); |
| }, |
| |
| /** |
| * Returns an integer representing the number of data items stored in the Storage object. |
| * @param {function} callbackId |
| */ |
| length: function (callbackId) { |
| if (!supportLocalStorage) { |
| console.error('your browser is not support localStorage yet.'); |
| return |
| } |
| var sender = this.sender; |
| var len = localStorage.length; |
| sender.performCallback(callbackId, { |
| result: SUCCESS, |
| data: len |
| }); |
| }, |
| |
| /** |
| * Returns an array that contains all keys stored in Storage object. |
| * @param {function} callbackId |
| */ |
| getAllKeys: function (callbackId) { |
| if (!supportLocalStorage) { |
| console.error('your browser is not support localStorage yet.'); |
| return |
| } |
| var sender = this.sender; |
| var _arr = []; |
| for (var i = 0; i < localStorage.length; i++) { |
| _arr.push(localStorage.key(i)); |
| } |
| sender.performCallback(callbackId, { |
| result: SUCCESS, |
| data: _arr |
| }); |
| } |
| }; |
| |
| var meta$10 = { |
| storage: [{ |
| name: 'setItem', |
| args: ['string', 'string', 'function'] |
| }, { |
| name: 'getItem', |
| args: ['string', 'function'] |
| }, { |
| name: 'removeItem', |
| args: ['string', 'function'] |
| }, { |
| name: 'length', |
| args: ['function'] |
| }, { |
| name: 'getAllKeys', |
| args: ['function'] |
| }] |
| }; |
| |
| var Storage = { |
| init: function (Weex) { |
| Weex.registerApiModule('storage', storage, meta$10); |
| } |
| }; |
| |
| var index$17 = function (str) { |
| return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { |
| return '%' + c.charCodeAt(0).toString(16).toUpperCase(); |
| }); |
| }; |
| |
| /* |
| object-assign |
| (c) Sindre Sorhus |
| @license MIT |
| */ |
| |
| /* eslint-disable no-unused-vars */ |
| var getOwnPropertySymbols = Object.getOwnPropertySymbols; |
| var hasOwnProperty$2 = Object.prototype.hasOwnProperty; |
| var propIsEnumerable = Object.prototype.propertyIsEnumerable; |
| |
| function toObject$2(val) { |
| if (val === null || val === undefined) { |
| throw new TypeError('Object.assign cannot be called with null or undefined'); |
| } |
| |
| return Object(val); |
| } |
| |
| function shouldUseNative() { |
| try { |
| if (!Object.assign) { |
| return false; |
| } |
| |
| // Detect buggy property enumeration order in older V8 versions. |
| |
| // https://bugs.chromium.org/p/v8/issues/detail?id=4118 |
| var test1 = new String('abc'); // eslint-disable-line no-new-wrappers |
| test1[5] = 'de'; |
| if (Object.getOwnPropertyNames(test1)[0] === '5') { |
| return false; |
| } |
| |
| // https://bugs.chromium.org/p/v8/issues/detail?id=3056 |
| var test2 = {}; |
| for (var i = 0; i < 10; i++) { |
| test2['_' + String.fromCharCode(i)] = i; |
| } |
| var order2 = Object.getOwnPropertyNames(test2).map(function (n) { |
| return test2[n]; |
| }); |
| if (order2.join('') !== '0123456789') { |
| return false; |
| } |
| |
| // https://bugs.chromium.org/p/v8/issues/detail?id=3056 |
| var test3 = {}; |
| 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { |
| test3[letter] = letter; |
| }); |
| if (Object.keys(Object.assign({}, test3)).join('') !== |
| 'abcdefghijklmnopqrst') { |
| return false; |
| } |
| |
| return true; |
| } catch (err) { |
| // We don't expect any of the above to throw, but better to be safe. |
| return false; |
| } |
| } |
| |
| var index$19 = shouldUseNative() ? Object.assign : function (target, source) { |
| var arguments$1 = arguments; |
| |
| var from; |
| var to = toObject$2(target); |
| var symbols; |
| |
| for (var s = 1; s < arguments.length; s++) { |
| from = Object(arguments$1[s]); |
| |
| for (var key in from) { |
| if (hasOwnProperty$2.call(from, key)) { |
| to[key] = from[key]; |
| } |
| } |
| |
| if (getOwnPropertySymbols) { |
| symbols = getOwnPropertySymbols(from); |
| for (var i = 0; i < symbols.length; i++) { |
| if (propIsEnumerable.call(from, symbols[i])) { |
| to[symbols[i]] = from[symbols[i]]; |
| } |
| } |
| } |
| } |
| |
| return to; |
| }; |
| |
| var strictUriEncode = index$17; |
| var objectAssign = index$19; |
| |
| function encoderForArrayFormat(opts) { |
| switch (opts.arrayFormat) { |
| case 'index': |
| return function (key, value, index) { |
| return value === null ? [ |
| encode(key, opts), |
| '[', |
| index, |
| ']' |
| ].join('') : [ |
| encode(key, opts), |
| '[', |
| encode(index, opts), |
| ']=', |
| encode(value, opts) |
| ].join(''); |
| }; |
| |
| case 'bracket': |
| return function (key, value) { |
| return value === null ? encode(key, opts) : [ |
| encode(key, opts), |
| '[]=', |
| encode(value, opts) |
| ].join(''); |
| }; |
| |
| default: |
| return function (key, value) { |
| return value === null ? encode(key, opts) : [ |
| encode(key, opts), |
| '=', |
| encode(value, opts) |
| ].join(''); |
| }; |
| } |
| } |
| |
| function parserForArrayFormat(opts) { |
| var result; |
| |
| switch (opts.arrayFormat) { |
| case 'index': |
| return function (key, value, accumulator) { |
| result = /\[(\d*)\]$/.exec(key); |
| |
| key = key.replace(/\[\d*\]$/, ''); |
| |
| if (!result) { |
| accumulator[key] = value; |
| return; |
| } |
| |
| if (accumulator[key] === undefined) { |
| accumulator[key] = {}; |
| } |
| |
| accumulator[key][result[1]] = value; |
| }; |
| |
| case 'bracket': |
| return function (key, value, accumulator) { |
| result = /(\[\])$/.exec(key); |
| key = key.replace(/\[\]$/, ''); |
| |
| if (!result) { |
| accumulator[key] = value; |
| return; |
| } else if (accumulator[key] === undefined) { |
| accumulator[key] = [value]; |
| return; |
| } |
| |
| accumulator[key] = [].concat(accumulator[key], value); |
| }; |
| |
| default: |
| return function (key, value, accumulator) { |
| if (accumulator[key] === undefined) { |
| accumulator[key] = value; |
| return; |
| } |
| |
| accumulator[key] = [].concat(accumulator[key], value); |
| }; |
| } |
| } |
| |
| function encode(value, opts) { |
| if (opts.encode) { |
| return opts.strict ? strictUriEncode(value) : encodeURIComponent(value); |
| } |
| |
| return value; |
| } |
| |
| function keysSorter(input) { |
| if (Array.isArray(input)) { |
| return input.sort(); |
| } else if (typeof input === 'object') { |
| return keysSorter(Object.keys(input)).sort(function (a, b) { |
| return Number(a) - Number(b); |
| }).map(function (key) { |
| return input[key]; |
| }); |
| } |
| |
| return input; |
| } |
| |
| var extract = function (str) { |
| return str.split('?')[1] || ''; |
| }; |
| |
| var parse$2 = function (str, opts) { |
| opts = objectAssign({arrayFormat: 'none'}, opts); |
| |
| var formatter = parserForArrayFormat(opts); |
| |
| // Create an object with no prototype |
| // https://github.com/sindresorhus/query-string/issues/47 |
| var ret = Object.create(null); |
| |
| if (typeof str !== 'string') { |
| return ret; |
| } |
| |
| str = str.trim().replace(/^(\?|#|&)/, ''); |
| |
| if (!str) { |
| return ret; |
| } |
| |
| str.split('&').forEach(function (param) { |
| var parts = param.replace(/\+/g, ' ').split('='); |
| // Firefox (pre 40) decodes `%3D` to `=` |
| // https://github.com/sindresorhus/query-string/pull/37 |
| var key = parts.shift(); |
| var val = parts.length > 0 ? parts.join('=') : undefined; |
| |
| // missing `=` should be `null`: |
| // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters |
| val = val === undefined ? null : decodeURIComponent(val); |
| |
| formatter(decodeURIComponent(key), val, ret); |
| }); |
| |
| return Object.keys(ret).sort().reduce(function (result, key) { |
| var val = ret[key]; |
| if (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) { |
| // Sort object keys, not values |
| result[key] = keysSorter(val); |
| } else { |
| result[key] = val; |
| } |
| |
| return result; |
| }, Object.create(null)); |
| }; |
| |
| var stringify = function (obj, opts) { |
| var defaults = { |
| encode: true, |
| strict: true, |
| arrayFormat: 'none' |
| }; |
| |
| opts = objectAssign(defaults, opts); |
| |
| var formatter = encoderForArrayFormat(opts); |
| |
| return obj ? Object.keys(obj).sort().map(function (key) { |
| var val = obj[key]; |
| |
| if (val === undefined) { |
| return ''; |
| } |
| |
| if (val === null) { |
| return encode(key, opts); |
| } |
| |
| if (Array.isArray(val)) { |
| var result = []; |
| |
| val.slice().forEach(function (val2) { |
| if (val2 === undefined) { |
| return; |
| } |
| |
| result.push(formatter(key, val2, result.length)); |
| }); |
| |
| return result.join('&'); |
| } |
| |
| return encode(key, opts) + '=' + encode(val, opts); |
| }).filter(function (x) { |
| return x.length > 0; |
| }).join('&') : ''; |
| }; |
| |
| var index$16 = { |
| extract: extract, |
| parse: parse$2, |
| stringify: stringify |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global lib, XMLHttpRequest */ |
| /* deps: httpurl */ |
| |
| var utils$1; |
| |
| var jsonpCnt = 0; |
| var ERROR_STATE = -1; |
| |
| function _jsonp (config, callback, progressCallback) { |
| var cbName = 'jsonp_' + (++jsonpCnt); |
| var url; |
| |
| if (!config.url) { |
| console.error('[h5-render] config.url should be set in _jsonp for \'fetch\' API.'); |
| } |
| |
| global[cbName] = (function (cb) { |
| return function (response) { |
| callback({ |
| status: 200, |
| ok: true, |
| statusText: 'OK', |
| data: response |
| }); |
| delete global[cb]; |
| } |
| })(cbName); |
| |
| var script = document.createElement('script'); |
| try { |
| url = lib.httpurl(config.url); |
| } |
| catch (err) { |
| console.error('[h5-render] invalid config.url in _jsonp for \'fetch\' API: ' |
| + config.url); |
| } |
| url.params.callback = cbName; |
| script.type = 'text/javascript'; |
| script.src = url.toString(); |
| // script.onerror is not working on IE or safari. |
| // but they are not considered here. |
| script.onerror = (function (cb) { |
| return function (err) { |
| console.error('[h5-render] unexpected error in _jsonp for \'fetch\' API', err); |
| callback({ |
| status: ERROR_STATE, |
| ok: false, |
| statusText: '', |
| data: '' |
| }); |
| delete global[cb]; |
| } |
| })(cbName); |
| var head = document.getElementsByTagName('head')[0]; |
| head.insertBefore(script, null); |
| } |
| |
| function _xhr (config, callback, progressCallback) { |
| var xhr = new XMLHttpRequest(); |
| xhr.responseType = config.type; |
| xhr.open(config.method, config.url, true); |
| |
| // cors cookie support |
| if (config.withCredentials === true) { |
| xhr.withCredentials = true; |
| } |
| |
| var headers = config.headers || {}; |
| for (var k in headers) { |
| xhr.setRequestHeader(k, headers[k]); |
| } |
| |
| xhr.onload = function (res) { |
| callback({ |
| status: xhr.status, |
| ok: xhr.status >= 200 && xhr.status < 300, |
| statusText: xhr.statusText, |
| data: xhr.response, |
| headers: xhr.getAllResponseHeaders().split('\n') |
| .reduce(function (obj, headerStr) { |
| var headerArr = headerStr.match(/(.+): (.+)/); |
| if (headerArr) { |
| obj[headerArr[1]] = headerArr[2]; |
| } |
| return obj |
| }, {}) |
| }); |
| }; |
| |
| if (progressCallback) { |
| xhr.onprogress = function (e) { |
| progressCallback({ |
| readyState: xhr.readyState, |
| status: xhr.status, |
| length: e.loaded, |
| total: e.total, |
| statusText: xhr.statusText, |
| headers: xhr.getAllResponseHeaders().split('\n') |
| .reduce(function (obj, headerStr) { |
| var headerArr = headerStr.match(/(.+): (.+)/); |
| if (headerArr) { |
| obj[headerArr[1]] = headerArr[2]; |
| } |
| return obj |
| }, {}) |
| }); |
| }; |
| } |
| |
| xhr.onerror = function (err) { |
| console.error('[h5-render] unexpected error in _xhr for \'fetch\' API', err); |
| callback({ |
| status: ERROR_STATE, |
| ok: false, |
| statusText: '', |
| data: '' |
| }); |
| }; |
| |
| xhr.send(config.body || null); |
| } |
| |
| var stream = { |
| |
| /** |
| * sendHttp |
| * @deprecated |
| * Note: This API is deprecated. Please use stream.fetch instead. |
| * send a http request through XHR. |
| * @param {obj} params |
| * - method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'PATCH', |
| * - url: url requested |
| * @param {string} callbackId |
| */ |
| sendHttp: function (param, callbackId) { |
| if (typeof param === 'string') { |
| try { |
| param = JSON.parse(param); |
| } |
| catch (e) { |
| return |
| } |
| } |
| if (typeof param !== 'object' || !param.url) { |
| return console.error( |
| '[h5-render] invalid config or invalid config.url for sendHttp API') |
| } |
| |
| var sender = this.sender; |
| var method = param.method || 'GET'; |
| var xhr = new XMLHttpRequest(); |
| xhr.open(method, param.url, true); |
| xhr.onload = function () { |
| sender.performCallback(callbackId, this.responseText); |
| }; |
| xhr.onerror = function (error) { |
| return console.error('[h5-render] unexpected error in sendHttp API', error) |
| // sender.performCallback( |
| // callbackId, |
| // new Error('unexpected error in sendHttp API') |
| // ) |
| }; |
| xhr.send(); |
| }, |
| |
| /** |
| * fetch |
| * use stream.fetch to request for a json file, a plain text file or |
| * a arraybuffer for a file stream. (You can use Blob and FileReader |
| * API implemented by most modern browsers to read a arraybuffer.) |
| * @param {object} options config options |
| * - method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'PATCH' |
| * - headers {obj} |
| * - url {string} |
| * - mode {string} 'cors' | 'no-cors' | 'same-origin' | 'navigate' |
| * - withCredentials {boolean} |
| * - body |
| * - type {string} 'json' | 'jsonp' | 'text' |
| * @param {string} callbackId |
| * @param {string} progressCallbackId |
| */ |
| fetch: function (options, callbackId, progressCallbackId) { |
| var DEFAULT_METHOD = 'GET'; |
| var DEFAULT_MODE = 'cors'; |
| var DEFAULT_TYPE = 'text'; |
| |
| var methodOptions = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH']; |
| var modeOptions = ['cors', 'no-cors', 'same-origin', 'navigate']; |
| var typeOptions = ['text', 'json', 'jsonp', 'arraybuffer']; |
| |
| // const fallback = false // fallback from 'fetch' API to XHR. |
| var sender = this.sender; |
| |
| var config = utils$1.extend({}, options); |
| |
| // validate options.method |
| if (typeof config.method === 'undefined') { |
| config.method = DEFAULT_METHOD; |
| console.warn('[h5-render] options.method for \'fetch\' API has been set to ' |
| + 'default value \'' + config.method + '\''); |
| } |
| else if (methodOptions.indexOf((config.method + '') |
| .toUpperCase()) === -1) { |
| return console.error('[h5-render] options.method \'' |
| + config.method |
| + '\' for \'fetch\' API should be one of ' |
| + methodOptions + '.') |
| } |
| |
| // validate options.url |
| if (!config.url) { |
| return console.error('[h5-render] options.url should be set for \'fetch\' API.') |
| } |
| |
| // validate body content for method 'GET'. |
| if (config.method.toUpperCase() === 'GET') { |
| var body = config.body; |
| if (utils$1.isPlainObject(body)) { |
| body = index$16.stringify(body); |
| } |
| var url = config.url; |
| var hashIdx = url.indexOf('#'); |
| hashIdx <= -1 && (hashIdx = url.length); |
| var hash = url.substr(hashIdx); |
| hash && (hash = '#' + hash); |
| url = url.substring(0, hashIdx); |
| url += (config.url.indexOf('?') <= -1 ? '?' : '&') + body + hash; |
| config.url = url; |
| } |
| |
| // validate options.mode |
| if (typeof config.mode === 'undefined') { |
| config.mode = DEFAULT_MODE; |
| } |
| else if (modeOptions.indexOf((config.mode + '').toLowerCase()) === -1) { |
| return console.error('[h5-render] options.mode \'' |
| + config.mode |
| + '\' for \'fetch\' API should be one of ' |
| + modeOptions + '.') |
| } |
| |
| // validate options.type |
| if (typeof config.type === 'undefined') { |
| config.type = DEFAULT_TYPE; |
| console.warn('[h5-render] options.type for \'fetch\' API has been set to ' |
| + 'default value \'' + config.type + '\'.'); |
| } |
| else if (typeOptions.indexOf((config.type + '').toLowerCase()) === -1) { |
| return console.error('[h5-render] options.type \'' |
| + config.type |
| + '\' for \'fetch\' API should be one of ' |
| + typeOptions + '.') |
| } |
| |
| // validate options.headers |
| config.headers = config.headers || {}; |
| if (!utils$1.isPlainObject(config.headers)) { |
| return console.error('[h5-render] options.headers should be a plain object') |
| } |
| |
| // validate options.timeout |
| config.timeout = parseInt(config.timeout, 10) || 2500; |
| |
| var _callArgs = [config, function (res) { |
| sender.performCallback(callbackId, res); |
| }]; |
| if (progressCallbackId) { |
| _callArgs.push(function (res) { |
| // Set 'keepAlive' to true for sending continuous callbacks |
| sender.performCallback(progressCallbackId, res, true); |
| }); |
| } |
| |
| if (config.type === 'jsonp') { |
| _jsonp.apply(this, _callArgs); |
| } |
| else { |
| _xhr.apply(this, _callArgs); |
| } |
| } |
| |
| }; |
| |
| var meta$11 = { |
| stream: [{ |
| name: 'sendHttp', |
| args: ['object', 'function'] |
| }, { |
| name: 'fetch', |
| args: ['object', 'function', 'function'] |
| }] |
| }; |
| |
| var Stream = { |
| init: function (Weex) { |
| utils$1 = Weex.utils; |
| Weex.registerApiModule('stream', stream, meta$11); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| var webview = { |
| |
| // ref: ref of the web component. |
| goBack: function (ref) { |
| var webComp = this.getComponentManager().getComponent(ref); |
| if (!webComp.goBack) { |
| console.error('error: the specified component has no method of' |
| + ' goBack. Please make sure it is a webview component.'); |
| return |
| } |
| webComp.goBack(); |
| }, |
| |
| // ref: ref of the web component. |
| goForward: function (ref) { |
| var webComp = this.getComponentManager().getComponent(ref); |
| if (!webComp.goForward) { |
| console.error('error: the specified component has no method of' |
| + ' goForward. Please make sure it is a webview component.'); |
| return |
| } |
| webComp.goForward(); |
| }, |
| |
| // ref: ref of the web component. |
| reload: function (ref) { |
| var webComp = this.getComponentManager().getComponent(ref); |
| if (!webComp.reload) { |
| console.error('error: the specified component has no method of' |
| + ' reload. Please make sure it is a webview component.'); |
| return |
| } |
| webComp.reload(); |
| } |
| |
| }; |
| |
| var meta$12 = { |
| webview: [{ |
| name: 'goBack', |
| args: ['string'] |
| }, { |
| name: 'goForward', |
| args: ['string'] |
| }, { |
| name: 'reload', |
| args: ['string'] |
| }] |
| }; |
| |
| var Webview = { |
| init: function (Weex) { |
| Weex.registerApiModule('webview', webview, meta$12); |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| /* global WebSocket */ |
| |
| var instance; |
| var callback$2 = { }; |
| |
| var webSocketIns = { |
| |
| WebSocket: function (url, protocol) { |
| if (instance) { |
| instance.close(); |
| instance = undefined; |
| callback$2 = { }; |
| } |
| if (protocol === '') { |
| protocol = undefined; |
| } |
| var self = this; |
| instance = new WebSocket(url, protocol); |
| instance.onopen = function (e) { |
| if (callback$2.onopen) { |
| self.sender.performCallback(callback$2.onopen, { type: e.type }, true); |
| } |
| }; |
| |
| instance.onmessage = function (e) { |
| if (callback$2.onmessage) { |
| self.sender.performCallback(callback$2.onmessage, { origin: e.origin, data: e.data, source: e.data }, true); |
| } |
| }; |
| |
| instance.onerror = function (e) { |
| if (callback$2.onerror) { |
| self.sender.performCallback(callback$2.onerror, { code: e.code, data: e.data }); |
| } |
| }; |
| |
| instance.onclose = function (e) { |
| if (callback$2.onclose) { |
| self.sender.performCallback(callback$2.onclose, { data: e.data, code: e.code, reason: e.reason }); |
| } |
| }; |
| }, |
| |
| close: function (code, signal) { |
| if (instance) { |
| instance.close(code, signal); |
| instance = undefined; |
| callback$2 = { }; |
| } |
| }, |
| |
| send: function (data) { |
| if (instance) { |
| instance.send(data); |
| } |
| }, |
| |
| onopen: function (func) { |
| if (instance) { |
| callback$2.onopen = func; |
| } |
| }, |
| |
| onerror: function (func) { |
| if (instance) { |
| callback$2.onerror = func; |
| } |
| }, |
| |
| onmessage: function (func) { |
| if (instance) { |
| callback$2.onmessage = func; |
| } |
| }, |
| |
| onclose: function (func) { |
| if (instance) { |
| callback$2.onclose = func; |
| } |
| } |
| }; |
| |
| var meta$13 = { |
| webSocket: [{ |
| name: 'WebSocket', |
| args: ['string', 'string'] |
| }, { |
| name: 'close', |
| args: ['numble', 'string'] |
| }, { |
| name: 'send', |
| args: ['string'] |
| }, { |
| name: 'onopen', |
| args: ['function'] |
| }, { |
| name: 'onmessage', |
| args: ['function'] |
| }, { |
| name: 'onclose', |
| args: ['function'] |
| }, { |
| name: 'onerror', |
| args: ['function'] |
| }] |
| }; |
| |
| var WebSocket$1 = { |
| init: function (Weex) { |
| Weex.registerApiModule('webSocket', webSocketIns, meta$13); |
| } |
| }; |
| |
| // import components. |
| // import apis. |
| var packages = { Image: Image$1, Text: Text, Scrollable: Scrollable, Slider: Slider, Indicator: Indicator, Tabheader: Tabheader, Input: Input, Textarea: Textarea, Video: Video, Switch: Switch, A: A, Embed: Embed, Spinner: Spinner, Web: Web, Neighbor: Neighbor, Richtext: Richtext, Animation: Animation, Clipboard: Clipboard, Dom: Dom, Event: Event$1, Geolocation: Geolocation, GlobalEvent: GlobalEvent, Meta: Meta, Modal: Modal, Navigator: Navigator, PageInfo: PageInfo, Storage: Storage, Stream: Stream, Webview: Webview, WebSocket: WebSocket$1 }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // install the apis and components as packages. |
| var extensions = { |
| init: function init (Weex) { |
| if (typeof packages !== 'object') { |
| return |
| } |
| for (var k in packages) { |
| Weex.install(packages[k]); |
| } |
| // packages.forEach(pkg => Weex.install(pkg)) |
| } |
| }; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| // install the extended apis and components. |
| Weex$1.install(root); |
| Weex$1.install(div); |
| Weex$1.install(droot); |
| |
| Weex$1.install(extensions); |
| |
| global.registerComponents([ |
| { type: 'input', methods: ['focus', 'blur'] } |
| ]); |
| |
| return Weex$1; |
| |
| }))); |
| //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uLy4uL2h0bWw1L3NoYXJlZC9hcnJheUZyb20uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1waWUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIi4uLy4uL2h0bWw1L3NoYXJlZC9vYmplY3RBc3NpZ24uanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvb2JqZWN0U2V0UHJvdG90eXBlT2YuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvcHJvbWlzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19taWNyb3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vLi4vaHRtbDUvc2hhcmVkL2NvbnNvbGUuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvc2V0VGltZW91dC5qcyIsIi4uLy4uL2h0bWw1L3NoYXJlZC9mcmVlemUuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvaW5kZXguanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3V0aWxzLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2Uvbm9ybWFsaXplLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvQ2FsbGJhY2tNYW5hZ2VyLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL29wZXJhdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdmRvbS9Ob2RlLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL1dlZXhFbGVtZW50LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL2RpcmVjdGl2ZS5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdmRvbS9FbGVtZW50LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvVGFza0NlbnRlci5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvYXBpL3NlcnZpY2UuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9pbml0LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL0NvbW1lbnQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2JyaWRnZS9MaXN0ZW5lci5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvYnJpZGdlL0hhbmRsZXIuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vRG9jdW1lbnQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vaW5kZXguanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9jb25maWcuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy92YW5pbGxhL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3dlZXgtdnVlLWZyYW1ld29yay9mYWN0b3J5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3dlZXgtdnVlLWZyYW1ld29yay9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwaS9tZXRob2RzLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvdXRpbC9zaGFyZWQuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS91dGlsL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvY29yZS9kZXAuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb3JlL3dhdGNoZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb3JlL2FycmF5LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvY29yZS9vYnNlcnZlci5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2NvcmUvc3RhdGUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb25maWcuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9kaXJlY3RpdmUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9kb20taGVscGVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvdm0vY29tcGlsZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9ldmVudHMuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9yZWdpc3Rlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zZW12ZXIvc2VtdmVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2Rvd25ncmFkZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC92aWV3cG9ydC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9idW5kbGUvYm9vdHN0cmFwLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2J1bmRsZS9kZWZpbmUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvYnVuZGxlL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2N0cmwvbWlzYy5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9jdHJsL2luaXQuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvY3RybC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9kaWZmZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvaW5zdGFuY2UuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvaW5kZXguanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9zdGF0aWMvbWFwLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL2NyZWF0ZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L3N0YXRpYy9saWZlLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL3JlZ2lzdGVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL2JyaWRnZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L3N0YXRpYy9taXNjLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvd2VleC1yYXgtZnJhbWV3b3JrL2Rpc3QvZnJhbWV3b3JrLndlZXguanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYnJpZGdlL3Byb3RvY29sLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvcmVuZGVyL2NvbmZpZy5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3V0aWxzL2FycmF5LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvdXRpbHMvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9icmlkZ2Uvc2VuZGVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYnJpZGdlL3JlY2VpdmVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYnJpZGdlL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZG9tL2FwcGVhcldhdGNoZXIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9kb20vY29tcG9uZW50TWFuYWdlci5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3JlbmRlci9sb2FkZXIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9kb20vaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC92YWx1ZUZpbHRlci5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvY29tcG9uZW50L29wZXJhdGUuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC9zdGlja3kuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC9wb3NpdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvY29tcG9uZW50L2ZsZXhib3guanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYXBwZWFyanMvc3JjL2FwcGVhci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sYXp5aW1nL3NyYy9hZGFwdGVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYmFzZS9jb21wb25lbnQvbGF6eWxvYWQuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvYXRvbWljLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYmFzZS9tb2R1bGVFdmVudC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3JlbmRlci9yZWdpc3Rlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9lbnZkL2J1aWxkL2VudmQuY29tbW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2h0dHB1cmwvYnVpbGQvaHR0cHVybC5jb21tb24uanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9yZW5kZXIvZ2VzdHVyZS5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3JlbmRlci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2Uvcm9vdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvZGl2LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYmFzZS9kcm9vdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2ltYWdlL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvdGV4dC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbW90aW9uLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9zY3JvbGwuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL3Njcm9sbGFibGUuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL2xpc3QvbGlzdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC92bGlzdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC9obGlzdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsZXIvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL3JlZnJlc2gvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL2xvYWRpbmcvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2N1YmljYmV6aWVyL2J1aWxkL2N1YmljYmV6aWVyLmNvbW1vbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9hbmltYXRpb25qcy9idWlsZC9hbmltYXRpb24uY29tbW9uLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvc2xpZGVyL3RpbWVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvc2xpZGVyL2NhcnJvdXNlbC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3NsaWRlci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2luZGljYXRvci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3RhYmhlYWRlci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2lucHV0LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvdGV4dGFyZWEuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy92aWRlby9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3N3aXRjaC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2EuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9lbWJlZC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3NwaW5uZXIvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy93ZWIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9uZWlnaGJvci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3JpY2h0ZXh0LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9hbmltYXRpb24vbGliLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9hbmltYXRpb24vaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL2NsaXBib2FyZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb21wb25lbnQtZW1pdHRlci9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb21wb25lbnQtdHlwZS9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb21wb25lbnQtY2xvbmUvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZWFzZS1jb21wb25lbnQvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29tcG9uZW50LXR3ZWVuL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbXBvbmVudC1yYWYvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc2Nyb2xsLXRvL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9kb20uanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL2V2ZW50LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9nZW9sb2NhdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9hcGkvZ2xvYmFsRXZlbnQuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL21ldGEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbW9kYWxzL3NyYy9tb2RhbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9tb2RhbHMvc3JjL2FsZXJ0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21vZGFscy9zcmMvY29uZmlybS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9tb2RhbHMvc3JjL3Byb21wdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9tb2RhbHMvc3JjL3RvYXN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21vZGFscy9zcmMvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL21vZGFsLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9uYXZpZ2F0b3IuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL3BhZ2VJbmZvLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9zdG9yYWdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmljdC11cmktZW5jb2RlL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcXVlcnktc3RyaW5nL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9zdHJlYW0uanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL3dlYnZpZXcuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL3dlYlNvY2tldC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9wYWNrZXIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gUHJvZHVjdGlvbiBzdGVwcyBvZiBFQ01BLTI2MiwgRWRpdGlvbiA2LCAyMi4xLjIuMVxuLy8gUmVmZXJlbmNlOiBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtYXJyYXkuZnJvbVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmICghQXJyYXkuZnJvbSkge1xuICBBcnJheS5mcm9tID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgdmFyIGlzQ2FsbGFibGUgPSBmdW5jdGlvbihmbikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9O1xuICAgIHZhciB0b0ludGVnZXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG51bWJlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIgPT09IDAgfHwgIWlzRmluaXRlKG51bWJlcikpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobnVtYmVyID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xuICAgIH07XG4gICAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbiAgICB2YXIgdG9MZW5ndGggPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGxlbiA9IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuLCAwKSwgbWF4U2FmZUludGVnZXIpO1xuICAgIH07XG5cbiAgICAvLyBUaGUgbGVuZ3RoIHByb3BlcnR5IG9mIHRoZSBmcm9tIG1ldGhvZCBpcyAxLlxuICAgIHJldHVybiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZS8qLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgICAgLy8gMS4gTGV0IEMgYmUgdGhlIHRoaXMgdmFsdWUuXG4gICAgICB2YXIgQyA9IHRoaXM7XG5cbiAgICAgIC8vIDIuIExldCBpdGVtcyBiZSBUb09iamVjdChhcnJheUxpa2UpLlxuICAgICAgdmFyIGl0ZW1zID0gT2JqZWN0KGFycmF5TGlrZSk7XG5cbiAgICAgIC8vIDMuIFJldHVybklmQWJydXB0KGl0ZW1zKS5cbiAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5mcm9tIHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0IC0gbm90IG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIG1hcGZuIGlzIHVuZGVmaW5lZCwgdGhlbiBsZXQgbWFwcGluZyBiZSBmYWxzZS5cbiAgICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCB1bmRlZmluZWQ7XG4gICAgICB2YXIgVDtcbiAgICAgIGlmICh0eXBlb2YgbWFwRm4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIDUuIGVsc2VcbiAgICAgICAgLy8gNS4gYSBJZiBJc0NhbGxhYmxlKG1hcGZuKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUobWFwRm4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIGIuIElmIHRoaXNBcmcgd2FzIHN1cHBsaWVkLCBsZXQgVCBiZSB0aGlzQXJnOyBlbHNlIGxldCBUIGJlIHVuZGVmaW5lZC5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgVCA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMC4gTGV0IGxlblZhbHVlIGJlIEdldChpdGVtcywgXCJsZW5ndGhcIikuXG4gICAgICAvLyAxMS4gTGV0IGxlbiBiZSBUb0xlbmd0aChsZW5WYWx1ZSkuXG4gICAgICB2YXIgbGVuID0gdG9MZW5ndGgoaXRlbXMubGVuZ3RoKTtcblxuICAgICAgLy8gMTMuIElmIElzQ29uc3RydWN0b3IoQykgaXMgdHJ1ZSwgdGhlblxuICAgICAgLy8gMTMuIGEuIExldCBBIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2Qgb2YgQyB3aXRoIGFuIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgc2luZ2xlIGl0ZW0gbGVuLlxuICAgICAgLy8gMTQuIGEuIEVsc2UsIExldCBBIGJlIEFycmF5Q3JlYXRlKGxlbikuXG4gICAgICB2YXIgQSA9IGlzQ2FsbGFibGUoQykgPyBPYmplY3QobmV3IEMobGVuKSkgOiBuZXcgQXJyYXkobGVuKTtcblxuICAgICAgLy8gMTYuIExldCBrIGJlIDAuXG4gICAgICB2YXIgayA9IDA7XG4gICAgICAvLyAxNy4gUmVwZWF0LCB3aGlsZSBrIDwgbGVu4oCmIChhbHNvIHN0ZXBzIGEgLSBoKVxuICAgICAgdmFyIGtWYWx1ZTtcbiAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgIGtWYWx1ZSA9IGl0ZW1zW2tdO1xuICAgICAgICBpZiAobWFwRm4pIHtcbiAgICAgICAgICBBW2tdID0gdHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gbWFwRm4oa1ZhbHVlLCBrKSA6IG1hcEZuLmNhbGwoVCwga1ZhbHVlLCBrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBW2tdID0ga1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGsgKz0gMTtcbiAgICAgIH1cbiAgICAgIC8vIDE4LiBMZXQgcHV0U3RhdHVzIGJlIFB1dChBLCBcImxlbmd0aFwiLCBsZW4sIHRydWUpLlxuICAgICAgQS5sZW5ndGggPSBsZW47XG4gICAgICAvLyAyMC4gUmV0dXJuIEEuXG4gICAgICByZXR1cm4gQTtcbiAgICB9O1xuICB9KCkpO1xufVxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS4wJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG4iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcbiIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgUyA9IFN5bWJvbCgpO1xuICB2YXIgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICB3aGlsZSAoYUxlbiA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikgaWYgKGlzRW51bS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkpIFRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICdjb3JlLWpzL2ZuL29iamVjdC9hc3NpZ24nXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi81NTkzNTU0XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKCFPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mID0gKGZ1bmN0aW9uKE9iamVjdCwgbWFnaWMpIHtcbiAgICB2YXIgc2V0O1xuICAgIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICBzZXQuY2FsbChPLCBwcm90byk7XG4gICAgICByZXR1cm4gTztcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIHRoaXMgd29ya3MgYWxyZWFkeSBpbiBGaXJlZm94IGFuZCBTYWZhcmlcbiAgICAgIHNldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgbWFnaWMpLnNldDtcbiAgICAgIHNldC5jYWxsKHt9LCBudWxsKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIElFIDwgMTEgY2Fubm90IGJlIHNoaW1tZWRcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZSAhPT0ge31bbWFnaWNdIHx8XG4gICAgICAgIC8vIG5laXRoZXIgY2FuIGFueSBicm93c2VyIHRoYXQgYWN0dWFsbHlcbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgX19wcm90b19fIGNvcnJlY3RseVxuICAgICAgICAvLyAoYWxsIGJ1dCBvbGQgVjggd2lsbCByZXR1cm4gaGVyZSlcbiAgICAgICAge19fcHJvdG9fXzogbnVsbH0uX19wcm90b19fID09PSB2b2lkIDBcbiAgICAgICAgLy8gdGhpcyBjYXNlIG1lYW5zIG51bGwgb2JqZWN0cyBjYW5ub3QgYmUgcGFzc2VkXG4gICAgICAgIC8vIHRocm91Z2ggc2V0UHJvdG90eXBlT2YgaW4gYSByZWxpYWJsZSB3YXlcbiAgICAgICAgLy8gd2hpY2ggbWVhbnMgaGVyZSBhICoqU2hhbSoqIGlzIG5lZWRlZCBpbnN0ZWFkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gbm9kZWpzIDAuOCBhbmQgMC4xMCBhcmUgKGJ1Z2d5IGFuZC4uKSBmaW5lIGhlcmVcbiAgICAgIC8vIHByb2JhYmx5IENocm9tZSBvciBzb21lIG9sZCBNb2JpbGUgc3RvY2sgYnJvd3NlclxuICAgICAgc2V0ID0gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgdGhpc1ttYWdpY10gPSBwcm90bztcbiAgICAgIH07XG4gICAgICAvLyBwbGVhc2Ugbm90ZSB0aGF0IHRoaXMgd2lsbCAqKm5vdCoqIHdvcmtcbiAgICAgIC8vIGluIHRob3NlIGJyb3dzZXJzIHRoYXQgZG8gbm90IGluaGVyaXRcbiAgICAgIC8vIF9fcHJvdG9fXyBieSBtaXN0YWtlIGZyb20gT2JqZWN0LnByb3RvdHlwZVxuICAgICAgLy8gaW4gdGhlc2UgY2FzZXMgd2Ugc2hvdWxkIHByb2JhYmx5IHRocm93IGFuIGVycm9yXG4gICAgICAvLyBvciBhdCBsZWFzdCBiZSBpbmZvcm1lZCBhYm91dCB0aGUgaXNzdWVcbiAgICAgIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID0gc2V0UHJvdG90eXBlT2YoXG4gICAgICAgIHNldFByb3RvdHlwZU9mKHt9LCBudWxsKSxcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZVxuICAgICAgKSBpbnN0YW5jZW9mIE9iamVjdDtcbiAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09PSB0cnVlIG1lYW5zIGl0IHdvcmtzIGFzIG1lYW50XG4gICAgICAvLyBzZXRQcm90b3R5cGVPZi5wb2x5ZmlsbCA9PT0gZmFsc2UgbWVhbnMgaXQncyBub3QgMTAwJSByZWxpYWJsZVxuICAgICAgLy8gc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPT09IHVuZGVmaW5lZFxuICAgICAgLy8gb3JcbiAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09ICBudWxsIG1lYW5zIGl0J3Mgbm90IGEgcG9seWZpbGxcbiAgICAgIC8vIHdoaWNoIG1lYW5zIGl0IHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgICAvLyB3ZSBjYW4gZXZlbiBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX187XG4gICAgfVxuICAgIHJldHVybiBzZXRQcm90b3R5cGVPZjtcbiAgfShPYmplY3QsICdfX3Byb3RvX18nKSk7XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gZml4IFByb21pc2UgUHJvYmxlbSBvbiBKU0NvbnRleHQgb2YgaU9TN344XG4vLyBAc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzU4NjZcblxuY29uc3QgeyBXWEVudmlyb25tZW50IH0gPSBnbG9iYWxcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChXWEVudmlyb25tZW50ICYmIFdYRW52aXJvbm1lbnQucGxhdGZvcm0gPT09ICdpT1MnKSB7XG4gIGdsb2JhbC5Qcm9taXNlID0gdW5kZWZpbmVkXG59XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIHRlc3QgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYgKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcbiIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZTogZmFsc2UsIHY6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgZTogdHJ1ZSwgdjogZSB9O1xuICB9XG59O1xuIiwidmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gTElCUkFSWSA/IGZ1bmN0aW9uIChhLCBiKSB7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufSA6IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX2ggPT0gMikgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgaWYgKHByb21pc2UuX2ggPT0gMSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9hIHx8IHByb21pc2UuX2M7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlYWN0aW9uO1xuICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkge1xuICAgIHJlYWN0aW9uID0gY2hhaW5baSsrXTtcbiAgICBpZiAocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpIHJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBzYW1lQ29uc3RydWN0b3IoJFByb21pc2UsIEMpXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZiAoeCBpbnN0YW5jZW9mICRQcm9taXNlICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogVGhpcyBmaWxlIHdpbGwgaGFjayBgY29uc29sZWAgbWV0aG9kcyBieSBgV1hFbnZpcm9ubWVudC5sb2dMZXZlbGAuXG4gKiBTbyB3ZSBjYW4gY29udHJvbCBob3cgbWFueSBhbmQgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBzZW50IGJ5IGNoYW5nZSB0aGUgbG9nIGxldmVsLlxuICogQWRkaXRpb25hbGx5IGluIG5hdGl2ZSBwbGF0Zm9ybSB0aGUgbWVzc2FnZSBjb250ZW50IG11c3QgYmUgcHJpbWl0aXZlIHZhbHVlcyBhbmRcbiAqIHVzaW5nIGBuYXRpdmVMb2coLi4uYXJncywgbG9nTGV2ZWxNYXJrKWAgc28gd2UgY3JlYXRlIGEgbmV3IGBjb25zb2xlYCBvYmplY3QgaW5cbiAqIGdsb2JhbCBhZGQgYSBmb3JtYXQgcHJvY2VzcyBmb3IgaXRzIG1ldGhvZHMuXG4gKi9cblxuY29uc3QgTEVWRUxTID0gWydvZmYnLCAnZXJyb3InLCAnd2FybicsICdpbmZvJywgJ2xvZycsICdkZWJ1ZyddXG5sZXQgbGV2ZWxNYXAgPSB7fVxuXG5jb25zdCBvcmlnaW5hbENvbnNvbGUgPSBnbG9iYWwuY29uc29sZVxuXG4vKipcbiAqIEhhY2sgY29uc29sZSBmb3IgbmF0aXZlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmF0aXZlQ29uc29sZSAoKSB7XG4gIGdlbmVyYXRlTGV2ZWxNYXAoKVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8vIG1vY2sgY29uc29sZSBpbiBuYXRpdmUgZW52aXJvbm1lbnRcbiAgaWYgKGdsb2JhbC5XWEVudmlyb25tZW50ICYmIGdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtICE9PSAnV2ViJykge1xuICAgIGdsb2JhbC5jb25zb2xlID0ge1xuICAgICAgZGVidWc6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdkZWJ1ZycpKSB7IGdsb2JhbC5uYXRpdmVMb2coLi4uZm9ybWF0KGFyZ3MpLCAnX19ERUJVRycpIH1cbiAgICAgIH0sXG4gICAgICBsb2c6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdsb2cnKSkgeyBnbG9iYWwubmF0aXZlTG9nKC4uLmZvcm1hdChhcmdzKSwgJ19fTE9HJykgfVxuICAgICAgfSxcbiAgICAgIGluZm86ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdpbmZvJykpIHsgZ2xvYmFsLm5hdGl2ZUxvZyguLi5mb3JtYXQoYXJncyksICdfX0lORk8nKSB9XG4gICAgICB9LFxuICAgICAgd2FybjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrTGV2ZWwoJ3dhcm4nKSkgeyBnbG9iYWwubmF0aXZlTG9nKC4uLmZvcm1hdChhcmdzKSwgJ19fV0FSTicpIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrTGV2ZWwoJ2Vycm9yJykpIHsgZ2xvYmFsLm5hdGl2ZUxvZyguLi5mb3JtYXQoYXJncyksICdfX0VSUk9SJykgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFdlYiBvciBOb2RlXG4gIGVsc2Uge1xuICAgIGNvbnN0IHsgZGVidWcsIGxvZywgaW5mbywgd2FybiwgZXJyb3IgfSA9IGNvbnNvbGVcbiAgICBjb25zb2xlLl9fb3JpX18gPSB7IGRlYnVnLCBsb2csIGluZm8sIHdhcm4sIGVycm9yIH1cbiAgICBjb25zb2xlLmRlYnVnID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdkZWJ1ZycpKSB7IGNvbnNvbGUuX19vcmlfXy5kZWJ1Zy5hcHBseShjb25zb2xlLCBhcmdzKSB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdsb2cnKSkgeyBjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3MpIH1cbiAgICB9XG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdpbmZvJykpIHsgY29uc29sZS5fX29yaV9fLmluZm8uYXBwbHkoY29uc29sZSwgYXJncykgfVxuICAgIH1cbiAgICBjb25zb2xlLndhcm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGNoZWNrTGV2ZWwoJ3dhcm4nKSkgeyBjb25zb2xlLl9fb3JpX18ud2Fybi5hcHBseShjb25zb2xlLCBhcmdzKSB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGNoZWNrTGV2ZWwoJ2Vycm9yJykpIHsgY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3MpIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldCBoYWNrZWQgY29uc29sZSB0byBvcmlnaW5hbC5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE5hdGl2ZUNvbnNvbGUgKCkge1xuICBsZXZlbE1hcCA9IHt9XG4gIGdsb2JhbC5jb25zb2xlID0gb3JpZ2luYWxDb25zb2xlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgbWFwIGZvciB3aGljaCB0eXBlcyBvZiBtZXNzYWdlIHdpbGwgYmUgc2VudCBpbiBhIGNlcnRhaW4gbWVzc2FnZSBsZXZlbFxuICogYXMgdGhlIG9yZGVyIG9mIExFVkVMUy5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVMZXZlbE1hcCAoKSB7XG4gIExFVkVMUy5mb3JFYWNoKGxldmVsID0+IHtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gTEVWRUxTLmluZGV4T2YobGV2ZWwpXG4gICAgbGV2ZWxNYXBbbGV2ZWxdID0ge31cbiAgICBMRVZFTFMuZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgIGNvbnN0IHR5cGVJbmRleCA9IExFVkVMUy5pbmRleE9mKHR5cGUpXG4gICAgICBpZiAodHlwZUluZGV4IDw9IGxldmVsSW5kZXgpIHtcbiAgICAgICAgbGV2ZWxNYXBbbGV2ZWxdW3R5cGVdID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBjZXJ0YWluIHR5cGUgb2YgbWVzc2FnZSB3aWxsIGJlIHNlbnQgaW4gY3VycmVudCBsb2cgbGV2ZWwgb2YgZW52LlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVja0xldmVsICh0eXBlKSB7XG4gIGNvbnN0IGxvZ0xldmVsID0gKGdsb2JhbC5XWEVudmlyb25tZW50ICYmIGdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsKSB8fCAnbG9nJ1xuICByZXR1cm4gbGV2ZWxNYXBbbG9nTGV2ZWxdICYmIGxldmVsTWFwW2xvZ0xldmVsXVt0eXBlXVxufVxuXG4vKipcbiAqIENvbnZlcnQgYWxsIGxvZyBhcmd1bWVudHMgaW50byBwcmltaXRpdmUgdmFsdWVzLlxuICogQHBhcmFtICB7YXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gZm9ybWF0IChhcmdzKSB7XG4gIHJldHVybiBhcmdzLm1hcCgodikgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodilcbiAgICBpZiAodHlwZS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBvYmplY3RdJykge1xuICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdiA9IFN0cmluZyh2KVxuICAgIH1cbiAgICByZXR1cm4gdlxuICB9KVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogUG9seWZpbGwgYHNldFRpbWVvdXRgIG9uIEFuZHJvaWQgVjggdXNpbmcgbmF0aXZlIG1ldGhvZFxuICogYHNldFRpbWVvdXROYXRpdmUoY2FsbGJhY2tJZCwgdGltZSlgIGFuZCBKUyBtZXRob2RcbiAqIGBzZXRUaW1lb3V0Q2FsbGJhY2soY2FsbGJhY2tJZClgLlxuICogVGhpcyBwb2x5ZmlsbCBpcyBvbmx5IHVzZWQgaW4gdmlydHVhbC1ET00gZGlmZiAmIGZsdXNoIGFnb3JpdGhtLiBOb3RcbiAqIGFjY2Vzc2VkIGJ5IEpTIEJ1bmRsZSBjb2RlIChUaGUgdGltZXIgQVBJcyBwb2x5ZmlsbCBmb3IgSlMgQnVuZGxlIGlzIGluXG4gKiBgaHRtbDUvZGVmYXVsdC9hcHAvY3RybC5qc2ApLlxuICovXG5cbmNvbnN0IG9yaWdpbmFsU2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0XG5jb25zdCBzZXRUaW1lb3V0TmF0aXZlID0gZ2xvYmFsLnNldFRpbWVvdXROYXRpdmVcblxuLyoqXG4gKiBTZXQgdXAgbmF0aXZlIHRpbWVyXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmF0aXZlVGltZXIgKCkge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBzZXRUaW1lb3V0TmF0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGltZW91dE1hcCA9IHt9XG4gICAgbGV0IHRpbWVvdXRJZCA9IDBcblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0ID0gKGNiLCB0aW1lKSA9PiB7XG4gICAgICB0aW1lb3V0TWFwWysrdGltZW91dElkXSA9IGNiXG4gICAgICBzZXRUaW1lb3V0TmF0aXZlKHRpbWVvdXRJZC50b1N0cmluZygpLCB0aW1lKVxuICAgIH1cblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0Q2FsbGJhY2sgPSAoaWQpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGltZW91dE1hcFtpZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGltZW91dE1hcFtpZF0oKVxuICAgICAgICBkZWxldGUgdGltZW91dE1hcFtpZF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE5hdGl2ZVRpbWVyICgpIHtcbiAgZ2xvYmFsLnNldFRpbWVvdXQgPSBvcmlnaW5hbFNldFRpbWVvdXRcbiAgZ2xvYmFsLnNldFRpbWVvdXRDYWxsYmFjayA9IG51bGxcbn1cblxuc2V0TmF0aXZlVGltZXIoKVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEZyZWV6ZSB0aGUgcHJvdG90eXBlIG9mIGphdmFzY3JpcHQgYnVpbGQtaW4gb2JqZWN0cy5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemVQcm90b3R5cGUgKCkge1xuICBPYmplY3QuZnJlZXplKE9iamVjdClcbiAgT2JqZWN0LmZyZWV6ZShBcnJheSlcblxuICAvLyBPYmplY3QuZnJlZXplKE9iamVjdC5wcm90b3R5cGUpXG4gIGZyZWV6ZU9iamVjdFByb3RvKClcbiAgT2JqZWN0LmZyZWV6ZShBcnJheS5wcm90b3R5cGUpXG4gIE9iamVjdC5mcmVlemUoU3RyaW5nLnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShOdW1iZXIucHJvdG90eXBlKVxuICBPYmplY3QuZnJlZXplKEJvb2xlYW4ucHJvdG90eXBlKVxuXG4gIC8vIE9iamVjdC5mcmVlemUoRXJyb3IucHJvdG90eXBlKVxuICBmcmVlemVFcnJvclByb3RvKClcbiAgT2JqZWN0LmZyZWV6ZShEYXRlLnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShSZWdFeHAucHJvdG90eXBlKVxufVxuXG5mdW5jdGlvbiBmcmVlemVPYmplY3RQcm90byAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LnByb3RvdHlwZVxuICBjb25zdCBwcm90b05hbWUgPSAnT2JqZWN0LnByb3RvdHlwZSdcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ19fZGVmaW5lR2V0dGVyX18nLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdfX2RlZmluZVNldHRlcl9fJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAnX19sb29rdXBHZXR0ZXJfXycsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ19fbG9va3VwU2V0dGVyX18nLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdjb25zdHJ1Y3RvcicsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ2hhc093blByb3BlcnR5JywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAnaXNQcm90b3R5cGVPZicsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAndG9Mb2NhbGVTdHJpbmcnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICd0b1N0cmluZycsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ3ZhbHVlT2YnLCBwcm90b05hbWUpXG4gIE9iamVjdC5zZWFsKHByb3RvKVxufVxuXG5mdW5jdGlvbiBmcmVlemVFcnJvclByb3RvICgpIHtcbiAgY29uc3QgcHJvdG8gPSBFcnJvci5wcm90b3R5cGVcbiAgY29uc3QgcHJvdG9OYW1lID0gJ0Vycm9yLnByb3RvdHlwZSdcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ25hbWUnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdtZXNzYWdlJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAndG9TdHJpbmcnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdjb25zdHJ1Y3RvcicsIHByb3RvTmFtZSlcbiAgT2JqZWN0LnNlYWwocHJvdG8pXG59XG5cbmZ1bmN0aW9uIGZyZWV6ZVByb3RvUHJvcGVydHkgKHByb3RvLCBwcm9wZXJ0eU5hbWUsIHByb3RvTmFtZSkge1xuICBpZiAoIXByb3RvLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG9yaWdpbiA9IHByb3RvW3Byb3BlcnR5TmFtZV1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBwcm9wZXJ0eU5hbWUsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvcmlnaW5cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gcHJvdG8pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBhc3NpZ24gdG8gcmVhZCBvbmx5IHByb3BlcnR5ICR7cHJvcGVydHlOYW1lfSBvZiAke3Byb3RvTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICcuL2FycmF5RnJvbSdcbmltcG9ydCAnLi9vYmplY3RBc3NpZ24nXG5pbXBvcnQgJy4vb2JqZWN0U2V0UHJvdG90eXBlT2YnXG5cbi8vIGltcG9ydCBwcm9taXNlIGhhY2sgYW5kIHBvbHlmaWxsc1xuaW1wb3J0ICcuL3Byb21pc2UnXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZydcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJ1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UnXG5cbmV4cG9ydCAqIGZyb20gJy4vY29uc29sZSdcbmV4cG9ydCAqIGZyb20gJy4vc2V0VGltZW91dCdcbmV4cG9ydCAqIGZyb20gJy4vZnJlZXplJ1xuIiwiXG4vKipcbiAqIEdldCBhIHVuaXF1ZSBpZC5cbiAqL1xubGV0IG5leHROb2RlUmVmID0gMVxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUlkICgpIHtcbiAgcmV0dXJuIChuZXh0Tm9kZVJlZisrKS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBvZiAodikge1xuICBjb25zdCBzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpXG4gIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxlbmd0aCAtIDEpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb0Jhc2U2NCAoYnVmZmVyKSB7XG4gIGlmICh0eXBlb2YgYnRvYSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IHN0cmluZyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChcbiAgICBuZXcgVWludDhBcnJheShidWZmZXIpLFxuICAgIGNvZGUgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKVxuICApLmpvaW4oJycpXG4gIHJldHVybiBidG9hKHN0cmluZykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9CdWZmZXIgKGJhc2U2NCkge1xuICBpZiAodHlwZW9mIGF0b2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApXG4gIH1cbiAgY29uc3Qgc3RyaW5nID0gYXRvYihiYXNlNjQpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShzdHJpbmcubGVuZ3RoKVxuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHN0cmluZywgKGNoLCBpKSA9PiB7XG4gICAgYXJyYXlbaV0gPSBjaC5jaGFyQ29kZUF0KDApXG4gIH0pXG4gIHJldHVybiBhcnJheS5idWZmZXJcbn1cbiIsImltcG9ydCB7IHR5cG9mLCBidWZmZXJUb0Jhc2U2NCwgYmFzZTY0VG9CdWZmZXIgfSBmcm9tICcuLi91dGlscydcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBwcmltaXRpdmUgdmFsdWUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgICB2XG4gKiBAcmV0dXJuIHtwcmltaXRpdmV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcmltaXRpdmUgKHYpIHtcbiAgY29uc3QgdHlwZSA9IHR5cG9mKHYpXG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnVW5kZWZpbmVkJzpcbiAgICBjYXNlICdOdWxsJzpcbiAgICAgIHJldHVybiAnJ1xuXG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKClcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiB2LnRvSVNPU3RyaW5nKClcblxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiB2XG5cbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnQHR5cGUnOiAnYmluYXJ5JyxcbiAgICAgICAgZGF0YVR5cGU6IHR5cGUsXG4gICAgICAgIGJhc2U2NDogYnVmZmVyVG9CYXNlNjQodilcbiAgICAgIH1cblxuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ0B0eXBlJzogJ2JpbmFyeScsXG4gICAgICAgIGRhdGFUeXBlOiB0eXBlLFxuICAgICAgICBiYXNlNjQ6IGJ1ZmZlclRvQmFzZTY0KHYuYnVmZmVyKVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQcmltaXRpdmUgKGRhdGEpIHtcbiAgaWYgKHR5cG9mKGRhdGEpID09PSAnT2JqZWN0Jykge1xuICAgIC8vIGRlY29kZSBiYXNlNjQgaW50byBiaW5hcnlcbiAgICBpZiAoZGF0YVsnQHR5cGUnXSAmJiBkYXRhWydAdHlwZSddID09PSAnYmluYXJ5Jykge1xuICAgICAgcmV0dXJuIGJhc2U2NFRvQnVmZmVyKGRhdGEuYmFzZTY0IHx8ICcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlYWxEYXRhID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICByZWFsRGF0YVtrZXldID0gZGVjb2RlUHJpbWl0aXZlKGRhdGFba2V5XSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWxEYXRhXG4gIH1cbiAgaWYgKHR5cG9mKGRhdGEpID09PSAnQXJyYXknKSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKGRlY29kZVByaW1pdGl2ZSlcbiAgfVxuICByZXR1cm4gZGF0YVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGRlY29kZVByaW1pdGl2ZSB9IGZyb20gJy4vbm9ybWFsaXplJ1xuXG4vKipcbiAqIEZvciBnZW5lcmFsIGNhbGxiYWNrIG1hbmFnZW1lbnQgb2YgYSBjZXJ0YWluIFdlZXggaW5zdGFuY2UuXG4gKiBCZWNhdXNlIGZ1bmN0aW9uIGNhbiBub3QgcGFzc2VkIGludG8gbmF0aXZlLCBzbyB3ZSBjcmVhdGUgY2FsbGJhY2tcbiAqIGNhbGxiYWNrIGlkIGZvciBlYWNoIGZ1bmN0aW9uIGFuZCBwYXNzIHRoZSBjYWxsYmFjayBpZCBpbnRvIG5hdGl2ZVxuICogaW4gZmFjdC4gQW5kIHdoZW4gYSBjYWxsYmFjayBjYWxsZWQgZnJvbSBuYXRpdmUsIHdlIGNhbiBmaW5kIHRoZSByZWFsXG4gKiBjYWxsYmFjayB0aHJvdWdoIHRoZSBjYWxsYmFjayBpZCB3ZSBoYXZlIHBhc3NlZCBiZWZvcmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbGxiYWNrTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yIChpbnN0YW5jZUlkKSB7XG4gICAgdGhpcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZFxuICAgIHRoaXMubGFzdENhbGxiYWNrSWQgPSAwXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7fVxuICB9XG4gIGFkZCAoY2FsbGJhY2spIHtcbiAgICB0aGlzLmxhc3RDYWxsYmFja0lkKytcbiAgICB0aGlzLmNhbGxiYWNrc1t0aGlzLmxhc3RDYWxsYmFja0lkXSA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHRoaXMubGFzdENhbGxiYWNrSWRcbiAgfVxuICByZW1vdmUgKGNhbGxiYWNrSWQpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2NhbGxiYWNrSWRdXG4gICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2NhbGxiYWNrSWRdXG4gICAgcmV0dXJuIGNhbGxiYWNrXG4gIH1cbiAgY29uc3VtZSAoY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2NhbGxiYWNrSWRdXG4gICAgaWYgKHR5cGVvZiBpZktlZXBBbGl2ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgaWZLZWVwQWxpdmUgPT09IGZhbHNlKSB7XG4gICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbY2FsbGJhY2tJZF1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGRlY29kZVByaW1pdGl2ZShkYXRhKSlcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBjYWxsYmFjayBpZCBcIiR7Y2FsbGJhY2tJZH1cImApXG4gIH1cbiAgY2xvc2UgKCkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge31cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IGRvY01hcCA9IHt9XG5cbi8qKlxuICogQWRkIGEgZG9jdW1lbnQgb2JqZWN0IGludG8gZG9jTWFwLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvYyAoaWQsIGRvYykge1xuICBpZiAoaWQpIHtcbiAgICBkb2NNYXBbaWRdID0gZG9jXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRvY3VtZW50IG9iamVjdCBieSBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9jIChpZCkge1xuICByZXR1cm4gZG9jTWFwW2lkXVxufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgZG9jdW1lbnQgZnJvbSBkb2NNYXAgYnkgaWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvYyAoaWQpIHtcbiAgZGVsZXRlIGRvY01hcFtpZF1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogR2V0IGxpc3RlbmVyIGJ5IGRvY3VtZW50IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0ZW5lciAoaWQpIHtcbiAgY29uc3QgZG9jID0gZG9jTWFwW2lkXVxuICBpZiAoZG9jICYmIGRvYy5saXN0ZW5lcikge1xuICAgIHJldHVybiBkb2MubGlzdGVuZXJcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEdldCBUYXNrQ2VudGVyIGluc3RhbmNlIGJ5IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IFRhc2tDZW50ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhc2tDZW50ZXIgKGlkKSB7XG4gIGNvbnN0IGRvYyA9IGRvY01hcFtpZF1cbiAgaWYgKGRvYyAmJiBkb2MudGFza0NlbnRlcikge1xuICAgIHJldHVybiBkb2MudGFza0NlbnRlclxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQXBwZW5kIGJvZHkgbm9kZSB0byBkb2N1bWVudEVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gYmVmb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRCb2R5IChkb2MsIG5vZGUsIGJlZm9yZSkge1xuICBjb25zdCB7IGRvY3VtZW50RWxlbWVudCB9ID0gZG9jXG5cbiAgaWYgKGRvY3VtZW50RWxlbWVudC5wdXJlQ2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBub2RlLnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBjaGlsZHJlbiA9IGRvY3VtZW50RWxlbWVudC5jaGlsZHJlblxuICBjb25zdCBiZWZvcmVJbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoYmVmb3JlKVxuICBpZiAoYmVmb3JlSW5kZXggPCAwKSB7XG4gICAgY2hpbGRyZW4ucHVzaChub2RlKVxuICB9XG4gIGVsc2Uge1xuICAgIGNoaWxkcmVuLnNwbGljZShiZWZvcmVJbmRleCwgMCwgbm9kZSlcbiAgfVxuXG4gIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgaWYgKG5vZGUucm9sZSA9PT0gJ2JvZHknKSB7XG4gICAgICBub2RlLmRvY0lkID0gZG9jLmlkXG4gICAgICBub2RlLm93bmVyRG9jdW1lbnQgPSBkb2NcbiAgICAgIG5vZGUucGFyZW50Tm9kZSA9IGRvY3VtZW50RWxlbWVudFxuICAgICAgbGlua1BhcmVudChub2RlLCBkb2N1bWVudEVsZW1lbnQpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgY2hpbGQucGFyZW50Tm9kZSA9IG5vZGVcbiAgICAgIH0pXG4gICAgICBzZXRCb2R5KGRvYywgbm9kZSlcbiAgICAgIG5vZGUuZG9jSWQgPSBkb2MuaWRcbiAgICAgIG5vZGUub3duZXJEb2N1bWVudCA9IGRvY1xuICAgICAgbGlua1BhcmVudChub2RlLCBkb2N1bWVudEVsZW1lbnQpXG4gICAgICBkZWxldGUgZG9jLm5vZGVNYXBbbm9kZS5ub2RlSWRdXG4gICAgfVxuICAgIGRvY3VtZW50RWxlbWVudC5wdXJlQ2hpbGRyZW4ucHVzaChub2RlKVxuICAgIHNlbmRCb2R5KGRvYywgbm9kZSlcbiAgfVxuICBlbHNlIHtcbiAgICBub2RlLnBhcmVudE5vZGUgPSBkb2N1bWVudEVsZW1lbnRcbiAgICBkb2Mubm9kZU1hcFtub2RlLnJlZl0gPSBub2RlXG4gIH1cbn1cblxuZnVuY3Rpb24gc2VuZEJvZHkgKGRvYywgbm9kZSkge1xuICBjb25zdCBib2R5ID0gbm9kZS50b0pTT04oKVxuICBjb25zdCBjaGlsZHJlbiA9IGJvZHkuY2hpbGRyZW5cbiAgZGVsZXRlIGJvZHkuY2hpbGRyZW5cbiAgbGV0IHJlc3VsdCA9IGRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAnY3JlYXRlQm9keScgfSwgW2JvZHldKVxuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIHJlc3VsdCA9IGRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAnYWRkRWxlbWVudCcgfSwgW2JvZHkucmVmLCBjaGlsZCwgLTFdKVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFNldCB1cCBib2R5IG5vZGUuXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRCb2R5IChkb2MsIGVsKSB7XG4gIGVsLnJvbGUgPSAnYm9keSdcbiAgZWwuZGVwdGggPSAxXG4gIGRlbGV0ZSBkb2Mubm9kZU1hcFtlbC5ub2RlSWRdXG4gIGVsLnJlZiA9ICdfcm9vdCdcbiAgZG9jLm5vZGVNYXAuX3Jvb3QgPSBlbFxuICBkb2MuYm9keSA9IGVsXG59XG5cbi8qKlxuICogRXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBub2RlLlxuICogQHBhcmFtIHtvYmplY3R9IGNoaWxkIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJlbnQgbm9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlua1BhcmVudCAobm9kZSwgcGFyZW50KSB7XG4gIG5vZGUucGFyZW50Tm9kZSA9IHBhcmVudFxuICBpZiAocGFyZW50LmRvY0lkKSB7XG4gICAgbm9kZS5kb2NJZCA9IHBhcmVudC5kb2NJZFxuICAgIG5vZGUub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50XG4gICAgbm9kZS5vd25lckRvY3VtZW50Lm5vZGVNYXBbbm9kZS5ub2RlSWRdID0gbm9kZVxuICAgIG5vZGUuZGVwdGggPSBwYXJlbnQuZGVwdGggKyAxXG4gIH1cbiAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICBsaW5rUGFyZW50KGNoaWxkLCBub2RlKVxuICB9KVxufVxuXG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dEVsZW1lbnQgKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmdcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50LlxuICogQHBhcmFtIHtvYmplY3R9IG5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudCAobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cbiAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydCBhIG5vZGUgaW50byBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IG5vZGVcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleFxuICogQHBhcmFtIHtib29sZWFufSBjaGFuZ2VTaWJsaW5nXG4gKiBAcmV0dXJuIHtudW1iZXJ9IG5ld0luZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRJbmRleCAodGFyZ2V0LCBsaXN0LCBuZXdJbmRleCwgY2hhbmdlU2libGluZykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAobmV3SW5kZXggPCAwKSB7XG4gICAgbmV3SW5kZXggPSAwXG4gIH1cbiAgY29uc3QgYmVmb3JlID0gbGlzdFtuZXdJbmRleCAtIDFdXG4gIGNvbnN0IGFmdGVyID0gbGlzdFtuZXdJbmRleF1cbiAgbGlzdC5zcGxpY2UobmV3SW5kZXgsIDAsIHRhcmdldClcbiAgaWYgKGNoYW5nZVNpYmxpbmcpIHtcbiAgICBiZWZvcmUgJiYgKGJlZm9yZS5uZXh0U2libGluZyA9IHRhcmdldClcbiAgICB0YXJnZXQucHJldmlvdXNTaWJsaW5nID0gYmVmb3JlXG4gICAgdGFyZ2V0Lm5leHRTaWJsaW5nID0gYWZ0ZXJcbiAgICBhZnRlciAmJiAoYWZ0ZXIucHJldmlvdXNTaWJsaW5nID0gdGFyZ2V0KVxuICB9XG4gIHJldHVybiBuZXdJbmRleFxufVxuXG4vKipcbiAqIE1vdmUgdGhlIG5vZGUgdG8gYSBuZXcgaW5kZXggaW4gbGlzdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgbm9kZVxuICogQHBhcmFtIHthcnJheX0gbGlzdFxuICogQHBhcmFtIHtudW1iZXJ9IG5ld0luZGV4XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNoYW5nZVNpYmxpbmdcbiAqIEByZXR1cm4ge251bWJlcn0gbmV3SW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmVJbmRleCAodGFyZ2V0LCBsaXN0LCBuZXdJbmRleCwgY2hhbmdlU2libGluZykge1xuICBjb25zdCBpbmRleCA9IGxpc3QuaW5kZXhPZih0YXJnZXQpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoY2hhbmdlU2libGluZykge1xuICAgIGNvbnN0IGJlZm9yZSA9IGxpc3RbaW5kZXggLSAxXVxuICAgIGNvbnN0IGFmdGVyID0gbGlzdFtpbmRleCArIDFdXG4gICAgYmVmb3JlICYmIChiZWZvcmUubmV4dFNpYmxpbmcgPSBhZnRlcilcbiAgICBhZnRlciAmJiAoYWZ0ZXIucHJldmlvdXNTaWJsaW5nID0gYmVmb3JlKVxuICB9XG4gIGxpc3Quc3BsaWNlKGluZGV4LCAxKVxuICBsZXQgbmV3SW5kZXhBZnRlciA9IG5ld0luZGV4XG4gIGlmIChpbmRleCA8PSBuZXdJbmRleCkge1xuICAgIG5ld0luZGV4QWZ0ZXIgPSBuZXdJbmRleCAtIDFcbiAgfVxuICBjb25zdCBiZWZvcmVOZXcgPSBsaXN0W25ld0luZGV4QWZ0ZXIgLSAxXVxuICBjb25zdCBhZnRlck5ldyA9IGxpc3RbbmV3SW5kZXhBZnRlcl1cbiAgbGlzdC5zcGxpY2UobmV3SW5kZXhBZnRlciwgMCwgdGFyZ2V0KVxuICBpZiAoY2hhbmdlU2libGluZykge1xuICAgIGJlZm9yZU5ldyAmJiAoYmVmb3JlTmV3Lm5leHRTaWJsaW5nID0gdGFyZ2V0KVxuICAgIHRhcmdldC5wcmV2aW91c1NpYmxpbmcgPSBiZWZvcmVOZXdcbiAgICB0YXJnZXQubmV4dFNpYmxpbmcgPSBhZnRlck5ld1xuICAgIGFmdGVyTmV3ICYmIChhZnRlck5ldy5wcmV2aW91c1NpYmxpbmcgPSB0YXJnZXQpXG4gIH1cbiAgaWYgKGluZGV4ID09PSBuZXdJbmRleEFmdGVyKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgcmV0dXJuIG5ld0luZGV4XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBub2RlIGZyb20gbGlzdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgbm9kZVxuICogQHBhcmFtIHthcnJheX0gbGlzdFxuICogQHBhcmFtIHtib29sZWFufSBjaGFuZ2VTaWJsaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVJbmRleCAodGFyZ2V0LCBsaXN0LCBjaGFuZ2VTaWJsaW5nKSB7XG4gIGNvbnN0IGluZGV4ID0gbGlzdC5pbmRleE9mKHRhcmdldClcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChjaGFuZ2VTaWJsaW5nKSB7XG4gICAgY29uc3QgYmVmb3JlID0gbGlzdFtpbmRleCAtIDFdXG4gICAgY29uc3QgYWZ0ZXIgPSBsaXN0W2luZGV4ICsgMV1cbiAgICBiZWZvcmUgJiYgKGJlZm9yZS5uZXh0U2libGluZyA9IGFmdGVyKVxuICAgIGFmdGVyICYmIChhZnRlci5wcmV2aW91c1NpYmxpbmcgPSBiZWZvcmUpXG4gIH1cbiAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGdldERvYyB9IGZyb20gJy4vb3BlcmF0aW9uJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMubm9kZUlkID0gdW5pcXVlSWQoKVxuICAgIHRoaXMucmVmID0gdGhpcy5ub2RlSWRcbiAgICB0aGlzLmNoaWxkcmVuID0gW11cbiAgICB0aGlzLnB1cmVDaGlsZHJlbiA9IFtdXG4gICAgdGhpcy5wYXJlbnROb2RlID0gbnVsbFxuICAgIHRoaXMubmV4dFNpYmxpbmcgPSBudWxsXG4gICAgdGhpcy5wcmV2aW91c1NpYmxpbmcgPSBudWxsXG4gIH1cblxuICAvKipcbiAgKiBEZXN0cm95IGN1cnJlbnQgbm9kZSwgYW5kIHJlbW92ZSBpdHNlbGYgZm9ybSBub2RlTWFwLlxuICAqL1xuICBkZXN0cm95ICgpIHtcbiAgICBjb25zdCBkb2MgPSBnZXREb2ModGhpcy5kb2NJZClcbiAgICBpZiAoZG9jKSB7XG4gICAgICBkZWxldGUgdGhpcy5kb2NJZFxuICAgICAgZGVsZXRlIGRvYy5ub2RlTWFwW3RoaXMubm9kZUlkXVxuICAgIH1cbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgY2hpbGQuZGVzdHJveSgpXG4gICAgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBnZXRUYXNrQ2VudGVyIH0gZnJvbSAnLi9vcGVyYXRpb24nXG5cbmxldCBFbGVtZW50XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50IChFbCkge1xuICBFbGVtZW50ID0gRWxcbn1cblxuLyoqXG4gKiBBIG1hcCB3aGljaCBzdG9yZXMgYWxsIHR5cGUgb2YgZWxlbWVudHMuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5jb25zdCByZWdpc3RlcmVkRWxlbWVudHMgPSB7fVxuXG4vKipcbiAqIFJlZ2lzdGVyIGFuIGV4dGVuZGVkIGVsZW1lbnQgdHlwZSB3aXRoIGNvbXBvbmVudCBtZXRob2RzLlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlICAgIGNvbXBvbmVudCB0eXBlXG4gKiBAcGFyYW0gIHthcnJheX0gIG1ldGhvZHMgYSBsaXN0IG9mIG1ldGhvZCBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJFbGVtZW50ICh0eXBlLCBtZXRob2RzKSB7XG4gIC8vIFNraXAgd2hlbiBubyBzcGVjaWFsIGNvbXBvbmVudCBtZXRob2RzLlxuICBpZiAoIW1ldGhvZHMgfHwgIW1ldGhvZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBJbml0IGNvbnN0cnVjdG9yLlxuICBjbGFzcyBXZWV4RWxlbWVudCBleHRlbmRzIEVsZW1lbnQge31cblxuICAvLyBBZGQgbWV0aG9kcyB0byBwcm90b3R5cGUuXG4gIG1ldGhvZHMuZm9yRWFjaChtZXRob2ROYW1lID0+IHtcbiAgICBXZWV4RWxlbWVudC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgIHJldHVybiB0YXNrQ2VudGVyLnNlbmQoJ2NvbXBvbmVudCcsIHtcbiAgICAgICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgICAgIGNvbXBvbmVudDogdHlwZSxcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWVcbiAgICAgICAgfSwgYXJncylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgLy8gQWRkIHRvIGVsZW1lbnQgdHlwZSBtYXAuXG4gIHJlZ2lzdGVyZWRFbGVtZW50c1t0eXBlXSA9IFdlZXhFbGVtZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRWxlbWVudCAodHlwZSkge1xuICBkZWxldGUgcmVnaXN0ZXJlZEVsZW1lbnRzW3R5cGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWV4RWxlbWVudCAodHlwZSkge1xuICByZXR1cm4gcmVnaXN0ZXJlZEVsZW1lbnRzW3R5cGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dlZXhFbGVtZW50ICh0eXBlKSB7XG4gIHJldHVybiAhIXJlZ2lzdGVyZWRFbGVtZW50c1t0eXBlXVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBlbGVtZW50IHR5cGVzLiBPbmx5IGZvciB0ZXN0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJXZWV4RWxlbWVudHMgKCkge1xuICBmb3IgKGNvbnN0IHR5cGUgaW4gcmVnaXN0ZXJlZEVsZW1lbnRzKSB7XG4gICAgdW5yZWdpc3RlckVsZW1lbnQodHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwb2YgfSBmcm9tICcuLi91dGlscydcblxuLy8gbWF0Y2ggdGhlIGJpbmRpbmcgZGVsaW1pdGVyXG5jb25zdCBkZWxpbWl0ZXJSRSA9IC9cXFtcXFsoKD86LnxcXG4pKz8pXFxdXFxdL2dcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQmluZGluZyAodGV4dCkge1xuICBpZiAodHlwb2YodGV4dCkgPT09ICdTdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgJ0BiaW5kaW5nJzogdGV4dCB9XG4gIH1cbiAgcmV0dXJuIHRleHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nIChzdHJpbmcpIHtcbiAgY29uc3QgdG9rZW5zID0gW11cbiAgbGV0IGxhc3RJbmRleCA9IGRlbGltaXRlclJFLmxhc3RJbmRleCA9IDBcbiAgbGV0IG1hdGNoLCBpbmRleFxuICB3aGlsZSAoKG1hdGNoID0gZGVsaW1pdGVyUkUuZXhlYyhzdHJpbmcpKSkge1xuICAgIGluZGV4ID0gbWF0Y2guaW5kZXhcbiAgICBpZiAoaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgIHRva2Vucy5wdXNoKHN0cmluZy5zbGljZShsYXN0SW5kZXgsIGluZGV4KSlcbiAgICB9XG4gICAgY29uc3QgYmluZGluZyA9IGdlbmVyYXRlQmluZGluZyhtYXRjaFsxXS50cmltKCkpXG4gICAgdG9rZW5zLnB1c2goYmluZGluZylcbiAgICBsYXN0SW5kZXggPSBpbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuICB9XG4gIGlmIChsYXN0SW5kZXggPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgdG9rZW5zLnB1c2goc3RyaW5nLnNsaWNlKGxhc3RJbmRleCkpXG4gIH1cbiAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdG9rZW5zWzBdXG4gIH1cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRGlyZWN0aXZlICh2YWx1ZSkge1xuICBpZiAodHlwb2YodmFsdWUpID09PSAnU3RyaW5nJyAmJiBkZWxpbWl0ZXJSRS50ZXN0KHZhbHVlKSkge1xuICAgIHJldHVybiBwYXJzZVN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodHlwb2YodmFsdWUpID09PSAnT2JqZWN0Jykge1xuICAgIGNvbnN0IHJlYWxEYXRhID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgcmVhbERhdGFba2V5XSA9IGZpbHRlckRpcmVjdGl2ZSh2YWx1ZVtrZXldKVxuICAgIH1cbiAgICByZXR1cm4gcmVhbERhdGFcbiAgfVxuICBpZiAodHlwb2YodmFsdWUpID09PSAnQXJyYXknKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcChmaWx0ZXJEaXJlY3RpdmUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJ1xuaW1wb3J0IHtcbiAgZ2V0RG9jLFxuICBnZXRUYXNrQ2VudGVyLFxuICBsaW5rUGFyZW50LFxuICBuZXh0RWxlbWVudCxcbiAgcHJldmlvdXNFbGVtZW50LFxuICBpbnNlcnRJbmRleCxcbiAgbW92ZUluZGV4LFxuICByZW1vdmVJbmRleFxufSBmcm9tICcuL29wZXJhdGlvbidcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBnZXRXZWV4RWxlbWVudCwgc2V0RWxlbWVudCB9IGZyb20gJy4vV2VleEVsZW1lbnQnXG5pbXBvcnQgeyBmaWx0ZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSdcblxuY29uc3QgREVGQVVMVF9UQUdfTkFNRSA9ICdkaXYnXG5jb25zdCBCVUJCTEVfRVZFTlRTID0gW1xuICAnY2xpY2snLCAnbG9uZ3ByZXNzJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJyxcbiAgJ3BhbnN0YXJ0JywgJ3Bhbm1vdmUnLCAncGFuZW5kJywgJ2hvcml6b250YWxwYW4nLCAndmVydGljYWxwYW4nLCAnc3dpcGUnXG5dXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTm9kZSAoZG9jSWQsIG5vZGUpIHtcbiAgY29uc3QgZG9jID0gZ2V0RG9jKGRvY0lkKVxuICBkb2Mubm9kZU1hcFtub2RlLm5vZGVJZF0gPSBub2RlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKHR5cGUgPSBERUZBVUxUX1RBR19OQU1FLCBwcm9wcywgaXNFeHRlbmRlZCkge1xuICAgIHN1cGVyKClcblxuICAgIGNvbnN0IFdlZXhFbGVtZW50ID0gZ2V0V2VleEVsZW1lbnQodHlwZSlcbiAgICBpZiAoV2VleEVsZW1lbnQgJiYgIWlzRXh0ZW5kZWQpIHtcbiAgICAgIHJldHVybiBuZXcgV2VleEVsZW1lbnQocHJvcHMpXG4gICAgfVxuXG4gICAgcHJvcHMgPSBwcm9wcyB8fCB7fVxuICAgIHRoaXMubm9kZVR5cGUgPSAxXG4gICAgdGhpcy5ub2RlSWQgPSB1bmlxdWVJZCgpXG4gICAgdGhpcy5yZWYgPSB0aGlzLm5vZGVJZFxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgICB0aGlzLmF0dHIgPSBwcm9wcy5hdHRyIHx8IHt9XG4gICAgdGhpcy5zdHlsZSA9IHByb3BzLnN0eWxlIHx8IHt9XG4gICAgdGhpcy5jbGFzc1N0eWxlID0gcHJvcHMuY2xhc3NTdHlsZSB8fCB7fVxuICAgIHRoaXMuZXZlbnQgPSB7fVxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXVxuICAgIHRoaXMucHVyZUNoaWxkcmVuID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgYSBjaGlsZCBub2RlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGFwcGVuZENoaWxkIChub2RlKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSAmJiBub2RlLnBhcmVudE5vZGUgIT09IHRoaXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHRoaXMpXG4gICAgICBpbnNlcnRJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgaW5zZXJ0SW5kZXgobm9kZSwgdGhpcy5wdXJlQ2hpbGRyZW4sIHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2FkZEVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbdGhpcy5yZWYsIG5vZGUudG9KU09OKCksIC0xXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgdHJ1ZSlcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbW92ZUluZGV4KG5vZGUsIHRoaXMucHVyZUNoaWxkcmVuLCB0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ21vdmVFbGVtZW50JyB9LFxuICAgICAgICAgICAgW25vZGUucmVmLCB0aGlzLnJlZiwgaW5kZXhdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5vZGUgYmVmb3JlIHNwZWNpZmllZCBub2RlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICAgKiBAcGFyYW0ge29iamVjdH0gYmVmb3JlXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgaW5zZXJ0QmVmb3JlIChub2RlLCBiZWZvcmUpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlICYmIG5vZGUucGFyZW50Tm9kZSAhPT0gdGhpcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChub2RlID09PSBiZWZvcmUgfHwgKG5vZGUubmV4dFNpYmxpbmcgJiYgbm9kZS5uZXh0U2libGluZyA9PT0gYmVmb3JlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHRoaXMpXG4gICAgICBpbnNlcnRJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmluZGV4T2YoYmVmb3JlKSwgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgY29uc3QgcHVyZUJlZm9yZSA9IG5leHRFbGVtZW50KGJlZm9yZSlcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbnNlcnRJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHB1cmVCZWZvcmVcbiAgICAgICAgICA/IHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHVyZUJlZm9yZSlcbiAgICAgICAgICA6IHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAgICdkb20nLFxuICAgICAgICAgICAgeyBhY3Rpb246ICdhZGRFbGVtZW50JyB9LFxuICAgICAgICAgICAgW3RoaXMucmVmLCBub2RlLnRvSlNPTigpLCBpbmRleF1cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtb3ZlSW5kZXgobm9kZSwgdGhpcy5jaGlsZHJlbiwgdGhpcy5jaGlsZHJlbi5pbmRleE9mKGJlZm9yZSksIHRydWUpXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBjb25zdCBwdXJlQmVmb3JlID0gbmV4dEVsZW1lbnQoYmVmb3JlKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBjb25zdCBpbmRleCA9IG1vdmVJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHB1cmVCZWZvcmVcbiAgICAgICAgICA/IHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHVyZUJlZm9yZSlcbiAgICAgICAgICA6IHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ21vdmVFbGVtZW50JyB9LFxuICAgICAgICAgICAgW25vZGUucmVmLCB0aGlzLnJlZiwgaW5kZXhdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5vZGUgYWZ0ZXIgc3BlY2lmaWVkIG5vZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhZnRlclxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGluc2VydEFmdGVyIChub2RlLCBhZnRlcikge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9PSB0aGlzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKG5vZGUgPT09IGFmdGVyIHx8IChub2RlLnByZXZpb3VzU2libGluZyAmJiBub2RlLnByZXZpb3VzU2libGluZyA9PT0gYWZ0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIGxpbmtQYXJlbnQobm9kZSwgdGhpcylcbiAgICAgIGluc2VydEluZGV4KG5vZGUsIHRoaXMuY2hpbGRyZW4sIHRoaXMuY2hpbGRyZW4uaW5kZXhPZihhZnRlcikgKyAxLCB0cnVlKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbnNlcnRJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KGFmdGVyKSkgKyAxXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2FkZEVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbdGhpcy5yZWYsIG5vZGUudG9KU09OKCksIGluZGV4XVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmluZGV4T2YoYWZ0ZXIpICsgMSwgdHJ1ZSlcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbW92ZUluZGV4KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdGhpcy5wdXJlQ2hpbGRyZW4sXG4gICAgICAgICAgdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQoYWZ0ZXIpKSArIDFcbiAgICAgICAgKVxuICAgICAgICBjb25zdCB0YXNrQ2VudGVyID0gZ2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKVxuICAgICAgICBpZiAodGFza0NlbnRlciAmJiBpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAgICdkb20nLFxuICAgICAgICAgICAgeyBhY3Rpb246ICdtb3ZlRWxlbWVudCcgfSxcbiAgICAgICAgICAgIFtub2RlLnJlZiwgdGhpcy5yZWYsIGluZGV4XVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjaGlsZCBub2RlLCBhbmQgZGVjaWRlIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGRlc3Ryb3llZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG5vZGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcmVzZXJ2ZWRcbiAgICovXG4gIHJlbW92ZUNoaWxkIChub2RlLCBwcmVzZXJ2ZWQpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICByZW1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0cnVlKVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgcmVtb3ZlSW5kZXgobm9kZSwgdGhpcy5wdXJlQ2hpbGRyZW4pXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgICAgdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ3JlbW92ZUVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbbm9kZS5yZWZdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcHJlc2VydmVkKSB7XG4gICAgICBub2RlLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY2hpbGQgbm9kZXMuXG4gICAqL1xuICBjbGVhciAoKSB7XG4gICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICB0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICB0YXNrQ2VudGVyLnNlbmQoXG4gICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgeyBhY3Rpb246ICdyZW1vdmVFbGVtZW50JyB9LFxuICAgICAgICAgIFtub2RlLnJlZl1cbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgbm9kZS5kZXN0cm95KClcbiAgICB9KVxuICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gMFxuICAgIHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW4gYXR0cmlidXRlLCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIGJlIHNlbmQgdG8gbmF0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudFxuICAgKi9cbiAgc2V0QXR0ciAoa2V5LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgaWYgKHRoaXMuYXR0cltrZXldID09PSB2YWx1ZSAmJiBzaWxlbnQgIT09IGZhbHNlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5hdHRyW2tleV0gPSB2YWx1ZVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKCFzaWxlbnQgJiYgdGFza0NlbnRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICAgIHJlc3VsdFtrZXldID0gZmlsdGVyRGlyZWN0aXZlKHZhbHVlKVxuICAgICAgdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAnZG9tJyxcbiAgICAgICAgeyBhY3Rpb246ICd1cGRhdGVBdHRycycgfSxcbiAgICAgICAgW3RoaXMucmVmLCByZXN1bHRdXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHN0eWxlIHByb3BlcnR5LCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIGJlIHNlbmQgdG8gbmF0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudFxuICAgKi9cbiAgc2V0U3R5bGUgKGtleSwgdmFsdWUsIHNpbGVudCkge1xuICAgIGlmICh0aGlzLnN0eWxlW2tleV0gPT09IHZhbHVlICYmIHNpbGVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnN0eWxlW2tleV0gPSB2YWx1ZVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKCFzaWxlbnQgJiYgdGFza0NlbnRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgJ2RvbScsXG4gICAgICAgIHsgYWN0aW9uOiAndXBkYXRlU3R5bGUnIH0sXG4gICAgICAgIFt0aGlzLnJlZiwgcmVzdWx0XVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3R5bGUgcHJvcGVydGllcyBmcm9tIGNsYXNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY2xhc3NTdHlsZVxuICAgKi9cbiAgc2V0Q2xhc3NTdHlsZSAoY2xhc3NTdHlsZSkge1xuICAgIC8vIHJlc2V0IHByZXZpb3VzIGNsYXNzIHN0eWxlIHRvIGVtcHR5IHN0cmluZ1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2xhc3NTdHlsZSkge1xuICAgICAgdGhpcy5jbGFzc1N0eWxlW2tleV0gPSAnJ1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jbGFzc1N0eWxlLCBjbGFzc1N0eWxlKVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgJ2RvbScsXG4gICAgICAgIHsgYWN0aW9uOiAndXBkYXRlU3R5bGUnIH0sXG4gICAgICAgIFt0aGlzLnJlZiwgdGhpcy50b1N0eWxlKCldXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBldmVudCBoYW5kbGVyXG4gICAqL1xuICBhZGRFdmVudCAodHlwZSwgaGFuZGxlcikge1xuICAgIGlmICghdGhpcy5ldmVudFt0eXBlXSkge1xuICAgICAgdGhpcy5ldmVudFt0eXBlXSA9IGhhbmRsZXJcbiAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICBpZiAodGFza0NlbnRlcikge1xuICAgICAgICB0YXNrQ2VudGVyLnNlbmQoXG4gICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgeyBhY3Rpb246ICdhZGRFdmVudCcgfSxcbiAgICAgICAgICBbdGhpcy5yZWYsIHR5cGVdXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCB0eXBlXG4gICAqL1xuICByZW1vdmVFdmVudCAodHlwZSkge1xuICAgIGlmICh0aGlzLmV2ZW50W3R5cGVdKSB7XG4gICAgICBkZWxldGUgdGhpcy5ldmVudFt0eXBlXVxuICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAnZG9tJyxcbiAgICAgICAgICB7IGFjdGlvbjogJ3JlbW92ZUV2ZW50JyB9LFxuICAgICAgICAgIFt0aGlzLnJlZiwgdHlwZV1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIGFuIGV2ZW50IG1hbnVhbGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSB0eXBlXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGUgaGFuZGxlclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQnViYmxlIHdoZXRoZXIgb3Igbm90IGV2ZW50IGJ1YmJsZVxuICAgKiBAcmV0dXJuIHt9IGFueXRoaW5nIHJldHVybmVkIGJ5IGhhbmRsZXIgZnVuY3Rpb25cbiAgICovXG4gIGZpcmVFdmVudCAodHlwZSwgZSwgaXNCdWJibGUpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbFxuICAgIGxldCBpc1N0b3BQcm9wYWdhdGlvbiA9IGZhbHNlXG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuZXZlbnRbdHlwZV1cbiAgICBpZiAoaGFuZGxlciAmJiBlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgICAgaXNTdG9wUHJvcGFnYXRpb24gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXN1bHQgPSBoYW5kbGVyLmNhbGwodGhpcywgZSlcbiAgICB9XG5cbiAgICBpZiAoIWlzU3RvcFByb3BhZ2F0aW9uXG4gICAgICAmJiBpc0J1YmJsZVxuICAgICAgJiYgQlVCQkxFX0VWRU5UUy5pbmNsdWRlcyh0eXBlKVxuICAgICAgJiYgdGhpcy5wYXJlbnROb2RlXG4gICAgICAmJiB0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KSB7XG4gICAgICBlLmN1cnJlbnRUYXJnZXQgPSB0aGlzLnBhcmVudE5vZGVcbiAgICAgIHRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQodHlwZSwgZSwgaXNCdWJibGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgc3R5bGVzIG9mIGN1cnJlbnQgZWxlbWVudC5cbiAgICogQHJldHVybiB7b2JqZWN0fSBzdHlsZVxuICAgKi9cbiAgdG9TdHlsZSAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2xhc3NTdHlsZSwgdGhpcy5zdHlsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZWxlbWVudCB0byBKU09OIGxpa2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IGVsZW1lbnRcbiAgICovXG4gIHRvSlNPTiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgcmVmOiB0aGlzLnJlZi50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgYXR0cjogZmlsdGVyRGlyZWN0aXZlKHRoaXMuYXR0ciksXG4gICAgICBzdHlsZTogdGhpcy50b1N0eWxlKClcbiAgICB9XG4gICAgY29uc3QgZXZlbnQgPSBPYmplY3Qua2V5cyh0aGlzLmV2ZW50KVxuICAgIGlmIChldmVudC5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5ldmVudCA9IGV2ZW50XG4gICAgfVxuICAgIGlmICh0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IHRoaXMucHVyZUNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IGNoaWxkLnRvSlNPTigpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBIVE1MIGVsZW1lbnQgdGFnIHN0cmluZy5cbiAgICogQHJldHVybiB7c3Rpcm5nfSBodG1sXG4gICAqL1xuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuICc8JyArIHRoaXMudHlwZSArXG4gICAgJyBhdHRyPScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpICtcbiAgICAnIHN0eWxlPScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkgKyAnPicgK1xuICAgIHRoaXMucHVyZUNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IGNoaWxkLnRvU3RyaW5nKCkpLmpvaW4oJycpICtcbiAgICAnPC8nICsgdGhpcy50eXBlICsgJz4nXG4gIH1cbn1cblxuc2V0RWxlbWVudChFbGVtZW50KVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgQ2FsbGJhY2tNYW5hZ2VyIGZyb20gJy4vQ2FsbGJhY2tNYW5hZ2VyJ1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vdmRvbS9FbGVtZW50J1xuaW1wb3J0IHsgdHlwb2YgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IG5vcm1hbGl6ZVByaW1pdGl2ZSB9IGZyb20gJy4vbm9ybWFsaXplJ1xuXG5sZXQgZmFsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fVxuXG4vLyBUaGUgQVBJIG9mIFRhc2tDZW50ZXIgd291bGQgYmUgcmUtZGVzaWduLlxuZXhwb3J0IGNsYXNzIFRhc2tDZW50ZXIge1xuICBjb25zdHJ1Y3RvciAoaWQsIHNlbmRUYXNrcykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaW5zdGFuY2VJZCcsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogaWRcbiAgICB9KVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FsbGJhY2tNYW5hZ2VyJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBuZXcgQ2FsbGJhY2tNYW5hZ2VyKGlkKVxuICAgIH0pXG4gICAgZmFsbGJhY2sgPSBzZW5kVGFza3MgfHwgZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIGNhbGxiYWNrIChjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSkge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGNhbGxiYWNrSWQsIGRhdGEsIGlmS2VlcEFsaXZlKVxuICB9XG5cbiAgZGVzdHJveUNhbGxiYWNrICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIHZhbHVlLiBTcGVjaWFsbHksIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCB0aGVuIGdlbmVyYXRlIGEgZnVuY3Rpb24gaWRcbiAgICogYW5kIHNhdmUgaXQgdG8gYENhbGxiYWNrTWFuYWdlcmAsIGF0IGxhc3QgcmV0dXJuIHRoZSBmdW5jdGlvbiBpZC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgdlxuICAgKiBAcmV0dXJuIHtwcmltaXRpdmV9XG4gICAqL1xuICBub3JtYWxpemUgKHYpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwb2YodilcbiAgICBpZiAodiAmJiB2IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHYucmVmXG4gICAgfVxuICAgIGlmICh2ICYmIHYuX2lzVnVlICYmIHYuJGVsIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHYuJGVsLnJlZlxuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ0Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZCh2KS50b1N0cmluZygpXG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVQcmltaXRpdmUodilcbiAgfVxuXG4gIHNlbmQgKHR5cGUsIHBhcmFtcywgYXJncywgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBjb21wb25lbnQsIHJlZiwgbW9kdWxlLCBtZXRob2QgfSA9IHBhcmFtc1xuXG4gICAgYXJncyA9IGFyZ3MubWFwKGFyZyA9PiB0aGlzLm5vcm1hbGl6ZShhcmcpKVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdkb20nOlxuICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKHRoaXMuaW5zdGFuY2VJZCwgYXJncylcbiAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLCByZWYsIG1ldGhvZCwgYXJncywgT2JqZWN0LmFzc2lnbih7IGNvbXBvbmVudCB9LCBvcHRpb25zKSlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLCBtb2R1bGUsIG1ldGhvZCwgYXJncywgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBjYWxsRE9NIChhY3Rpb24sIGFyZ3MpIHtcbiAgICByZXR1cm4gdGhpc1thY3Rpb25dKHRoaXMuaW5zdGFuY2VJZCwgYXJncylcbiAgfVxuXG4gIGNhbGxDb21wb25lbnQgKHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKVxuICB9XG5cbiAgY2FsbE1vZHVsZSAobW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCwgbW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKCkge1xuICBjb25zdCBET01fTUVUSE9EUyA9IHtcbiAgICBjcmVhdGVGaW5pc2g6IGdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLFxuICAgIHVwZGF0ZUZpbmlzaDogZ2xvYmFsLmNhbGxVcGRhdGVGaW5pc2gsXG4gICAgcmVmcmVzaEZpbmlzaDogZ2xvYmFsLmNhbGxSZWZyZXNoRmluaXNoLFxuXG4gICAgY3JlYXRlQm9keTogZ2xvYmFsLmNhbGxDcmVhdGVCb2R5LFxuXG4gICAgYWRkRWxlbWVudDogZ2xvYmFsLmNhbGxBZGRFbGVtZW50LFxuICAgIHJlbW92ZUVsZW1lbnQ6IGdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxcbiAgICBtb3ZlRWxlbWVudDogZ2xvYmFsLmNhbGxNb3ZlRWxlbWVudCxcbiAgICB1cGRhdGVBdHRyczogZ2xvYmFsLmNhbGxVcGRhdGVBdHRycyxcbiAgICB1cGRhdGVTdHlsZTogZ2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxcblxuICAgIGFkZEV2ZW50OiBnbG9iYWwuY2FsbEFkZEV2ZW50LFxuICAgIHJlbW92ZUV2ZW50OiBnbG9iYWwuY2FsbFJlbW92ZUV2ZW50XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBUYXNrQ2VudGVyLnByb3RvdHlwZVxuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBET01fTUVUSE9EUykge1xuICAgIGNvbnN0IG1ldGhvZCA9IERPTV9NRVRIT0RTW25hbWVdXG4gICAgcHJvdG9bbmFtZV0gPSBtZXRob2QgP1xuICAgICAgKGlkLCBhcmdzKSA9PiBtZXRob2QoaWQsIC4uLmFyZ3MpIDpcbiAgICAgIChpZCwgYXJncykgPT4gZmFsbGJhY2soaWQsIFt7IG1vZHVsZTogJ2RvbScsIG1ldGhvZDogbmFtZSwgYXJncyB9XSwgJy0xJylcbiAgfVxuXG4gIHByb3RvLmNvbXBvbmVudEhhbmRsZXIgPSBnbG9iYWwuY2FsbE5hdGl2ZUNvbXBvbmVudCB8fFxuICAgICgoaWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSA9PlxuICAgICAgZmFsbGJhY2soaWQsIFt7IGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsIHJlZiwgbWV0aG9kLCBhcmdzIH1dKSlcblxuICBwcm90by5tb2R1bGVIYW5kbGVyID0gZ2xvYmFsLmNhbGxOYXRpdmVNb2R1bGUgfHxcbiAgICAoKGlkLCBtb2R1bGUsIG1ldGhvZCwgYXJncykgPT5cbiAgICAgIGZhbGxiYWNrKGlkLCBbeyBtb2R1bGUsIG1ldGhvZCwgYXJncyB9XSkpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gSlMgU2VydmljZXNcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VzID0gW11cblxuLyoqXG4gKiBSZWdpc3RlciBhIEphdmFTY3JpcHQgc2VydmljZS5cbiAqIEEgSmF2YVNjcmlwdCBzZXJ2aWNlIG9wdGlvbnMgY291bGQgaGF2ZSBhIHNldCBvZiBsaWZlY3ljbGUgbWV0aG9kc1xuICogZm9yIGVhY2ggV2VleCBpbnN0YW5jZS4gRm9yIGV4YW1wbGU6IGNyZWF0ZSwgcmVmcmVzaCwgZGVzdHJveS5cbiAqIEZvciB0aGUgSlMgZnJhbWV3b3JrIG1haW50YWluZXIgaWYgeW91IHdhbnQgdG8gc3VwcGx5IHNvbWUgZmVhdHVyZXNcbiAqIHdoaWNoIG5lZWQgdG8gd29yayB3ZWxsIGluIGRpZmZlcmVudCBXZWV4IGluc3RhbmNlcywgZXZlbiBpbiBkaWZmZXJlbnRcbiAqIGZyYW1ld29ya3Mgc2VwYXJhdGVseS4gWW91IGNhbiBtYWtlIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIHRvIGluaXRcbiAqIGl0cyB2YXJpYWJsZXMgb3IgY2xhc3NlcyBmb3IgZWFjaCBXZWV4IGluc3RhbmNlIHdoZW4gaXQncyBjcmVhdGVkXG4gKiBhbmQgcmVjeWNsZSB0aGVtIHdoZW4gaXQncyBkZXN0cm95ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb3VsZCBoYXZlIHsgY3JlYXRlLCByZWZyZXNoLCBkZXN0cm95IH1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBtZXRob2RzLiBJbiBjcmVhdGUgbWV0aG9kIGl0IHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuIG9iamVjdCBvZiB3aGF0IHZhcmlhYmxlcyBvciBjbGFzc2VzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBpbmplY3RlZCBpbnRvIHRoZSBXZWV4IGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIgKG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKGhhcyhuYW1lKSkge1xuICAgIGNvbnNvbGUud2FybihgU2VydmljZSBcIiR7bmFtZX1cIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhYClcbiAgfVxuICBlbHNlIHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucylcbiAgICBzZXJ2aWNlcy5wdXNoKHsgbmFtZSwgb3B0aW9ucyB9KVxuICB9XG59XG5cbi8qKlxuICogVW5yZWdpc3RlciBhIEphdmFTY3JpcHQgc2VydmljZSBieSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlciAobmFtZSkge1xuICBzZXJ2aWNlcy5zb21lKChzZXJ2aWNlLCBpbmRleCkgPT4ge1xuICAgIGlmIChzZXJ2aWNlLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHNlcnZpY2VzLnNwbGljZShpbmRleCwgMSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIHdpdGggYSBjZXJ0YWluIG5hbWUgZXhpc3RlZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXMgKG5hbWUpIHtcbiAgcmV0dXJuIGluZGV4T2YobmFtZSkgPj0gMFxufVxuXG4vKipcbiAqIEZpbmQgdGhlIGluZGV4IG9mIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIGJ5IG5hbWVcbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBpbmRleE9mIChuYW1lKSB7XG4gIHJldHVybiBzZXJ2aWNlcy5tYXAoc2VydmljZSA9PiBzZXJ2aWNlLm5hbWUpLmluZGV4T2YobmFtZSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgaW5pdCBhcyBpbml0VGFza0hhbmRsZXIgfSBmcm9tICcuLi9icmlkZ2UvVGFza0NlbnRlcidcbmltcG9ydCB7IHJlZ2lzdGVyRWxlbWVudCB9IGZyb20gJy4uL3Zkb20vV2VleEVsZW1lbnQnXG5pbXBvcnQgeyBzZXJ2aWNlcywgcmVnaXN0ZXIsIHVucmVnaXN0ZXIgfSBmcm9tICcuL3NlcnZpY2UnXG5cbmxldCBmcmFtZXdvcmtzXG5sZXQgcnVudGltZUNvbmZpZ1xuXG5jb25zdCB2ZXJzaW9uUmVnRXhwID0gL15cXHMqXFwvXFwvICooXFx7W159XSpcXH0pICpcXHI/XFxuL1xuXG4vKipcbiAqIERldGVjdCBhIEpTIEJ1bmRsZSBjb2RlIGFuZCBtYWtlIHN1cmUgd2hpY2ggZnJhbWV3b3JrIGl0J3MgYmFzZWQgdG8uIEVhY2ggSlNcbiAqIEJ1bmRsZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgaXQgc3RhcnRzIHdpdGggYSBsaW5lIG9mIEpTT04gY29tbWVudCBhbmQgaXNcbiAqIG1vcmUgdGhhdCBvbmUgbGluZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gY29kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRCdW5kbGVUeXBlIChjb2RlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHZlcnNpb25SZWdFeHAuZXhlYyhjb2RlKVxuICBpZiAocmVzdWx0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3VsdFsxXSlcbiAgICAgIHJldHVybiBpbmZvLmZyYW1ld29ya1xuICAgIH1cbiAgICBjYXRjaCAoZSkge31cbiAgfVxuXG4gIC8vIGRlZmF1bHQgYnVuZGxlIHR5cGVcbiAgcmV0dXJuICdXZWV4J1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZXJ2aWNlcyAoaWQsIGVudiwgY29uZmlnKSB7XG4gIC8vIEluaXQgSmF2YVNjcmlwdCBzZXJ2aWNlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgY29uc3Qgc2VydmljZU1hcCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgc2VydmljZU1hcC5zZXJ2aWNlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICBzZXJ2aWNlcy5mb3JFYWNoKCh7IG5hbWUsIG9wdGlvbnMgfSkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW0pTIFJ1bnRpbWVdIGNyZWF0ZSBzZXJ2aWNlICR7bmFtZX0uYClcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlID0gb3B0aW9ucy5jcmVhdGVcbiAgICBpZiAoY3JlYXRlKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoaWQsIGVudiwgY29uZmlnKVxuICAgICAgT2JqZWN0LmFzc2lnbihzZXJ2aWNlTWFwLnNlcnZpY2UsIHJlc3VsdClcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VydmljZU1hcCwgcmVzdWx0Lmluc3RhbmNlKVxuICAgIH1cbiAgfSlcbiAgZGVsZXRlIHNlcnZpY2VNYXAuc2VydmljZS5pbnN0YW5jZVxuICBPYmplY3QuZnJlZXplKHNlcnZpY2VNYXAuc2VydmljZSlcbiAgcmV0dXJuIHNlcnZpY2VNYXBcbn1cblxuY29uc3QgaW5zdGFuY2VNYXAgPSB7fVxuXG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtUeXBlIChpZCkge1xuICBpZiAoaW5zdGFuY2VNYXBbaWRdKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlTWFwW2lkXS5mcmFtZXdvcmtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoaWNoIGZyYW1ld29yayBhIGNlcnRhaW4gSlMgQnVuZGxlIGNvZGUgYmFzZWQgdG8uIEFuZCBjcmVhdGUgaW5zdGFuY2VcbiAqIGJ5IHRoaXMgZnJhbWV3b3JrLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UgKGlkLCBjb2RlLCBjb25maWcsIGRhdGEpIHtcbiAgaWYgKGluc3RhbmNlTWFwW2lkXSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuXG4gIC8vIEluaXQgaW5zdGFuY2UgaW5mby5cbiAgY29uc3QgYnVuZGxlVHlwZSA9IGdldEJ1bmRsZVR5cGUoY29kZSlcblxuICAvLyBJbml0IGluc3RhbmNlIGNvbmZpZy5cbiAgY29uZmlnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb25maWcgfHwge30pKVxuICBjb25maWcuZW52ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnbG9iYWwuV1hFbnZpcm9ubWVudCB8fCB7fSkpXG5cbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBjb25maWcsXG4gICAgY3JlYXRlZDogRGF0ZS5ub3coKSxcbiAgICBmcmFtZXdvcms6IGJ1bmRsZVR5cGVcbiAgfVxuICBjb250ZXh0LnNlcnZpY2VzID0gY3JlYXRlU2VydmljZXMoaWQsIGNvbnRleHQsIHJ1bnRpbWVDb25maWcpXG4gIGluc3RhbmNlTWFwW2lkXSA9IGNvbnRleHRcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBjcmVhdGUgYW4gJHtidW5kbGVUeXBlfSBpbnN0YW5jZWApXG4gIH1cblxuICBjb25zdCBmbSA9IGZyYW1ld29ya3NbYnVuZGxlVHlwZV1cbiAgaWYgKCFmbSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgYnVuZGxlIHR5cGUgXCIke2J1bmRsZVR5cGV9XCIuYClcbiAgfVxuXG4gIHJldHVybiBmbS5jcmVhdGVJbnN0YW5jZShpZCwgY29kZSwgY29uZmlnLCBkYXRhLCBjb250ZXh0KVxufVxuXG5jb25zdCBtZXRob2RzID0ge1xuICBjcmVhdGVJbnN0YW5jZSxcbiAgcmVnaXN0ZXJTZXJ2aWNlOiByZWdpc3RlcixcbiAgdW5yZWdpc3RlclNlcnZpY2U6IHVucmVnaXN0ZXJcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBtZXRob2RzIHdoaWNoIGluaXQgZWFjaCBmcmFtZXdvcmtzLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAqL1xuZnVuY3Rpb24gZ2VuSW5pdCAobWV0aG9kTmFtZSkge1xuICBtZXRob2RzW21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gJ3JlZ2lzdGVyQ29tcG9uZW50cycpIHtcbiAgICAgIGNoZWNrQ29tcG9uZW50TWV0aG9kcyhhcmdzWzBdKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZnJhbWV3b3Jrcykge1xuICAgICAgY29uc3QgZnJhbWV3b3JrID0gZnJhbWV3b3Jrc1tuYW1lXVxuICAgICAgaWYgKGZyYW1ld29yayAmJiBmcmFtZXdvcmtbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgZnJhbWV3b3JrW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ29tcG9uZW50TWV0aG9kcyAoY29tcG9uZW50cykge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnRzKSkge1xuICAgIGNvbXBvbmVudHMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgaWYgKG5hbWUgJiYgbmFtZS50eXBlICYmIG5hbWUubWV0aG9kcykge1xuICAgICAgICByZWdpc3RlckVsZW1lbnQobmFtZS50eXBlLCBuYW1lLm1ldGhvZHMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIG1ldGhvZHMgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICovXG5mdW5jdGlvbiBnZW5JbnN0YW5jZSAobWV0aG9kTmFtZSkge1xuICBtZXRob2RzW21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBpZCA9IGFyZ3NbMF1cbiAgICBjb25zdCB0eXBlID0gZ2V0RnJhbWV3b3JrVHlwZShpZClcbiAgICBpZiAodHlwZSAmJiBmcmFtZXdvcmtzW3R5cGVdKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmcmFtZXdvcmtzW3R5cGVdW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICBjb25zdCBpbmZvID0geyBmcmFtZXdvcms6IHR5cGUgfVxuXG4gICAgICAvLyBMaWZlY3ljbGUgbWV0aG9kc1xuICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdyZWZyZXNoSW5zdGFuY2UnKSB7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmcmVzaCA9IHNlcnZpY2Uub3B0aW9ucy5yZWZyZXNoXG4gICAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgIHJlZnJlc2goaWQsIHsgaW5mbywgcnVudGltZTogcnVudGltZUNvbmZpZyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICdkZXN0cm95SW5zdGFuY2UnKSB7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgY29uc3QgZGVzdHJveSA9IHNlcnZpY2Uub3B0aW9ucy5kZXN0cm95XG4gICAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgIGRlc3Ryb3koaWQsIHsgaW5mbywgcnVudGltZTogcnVudGltZUNvbmZpZyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgZGVsZXRlIGluc3RhbmNlTWFwW2lkXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxufVxuXG4vKipcbiAqIEFkYXB0IHNvbWUgbGVnYWN5IG1ldGhvZChzKSB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBpbnN0YW5jZS4gVGhlc2VcbiAqIG1ldGhvZHMgc2hvdWxkIGJlIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQgbGF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hdGl2ZU1ldGhvZE5hbWVcbiAqL1xuZnVuY3Rpb24gYWRhcHRJbnN0YW5jZSAobWV0aG9kTmFtZSwgbmF0aXZlTWV0aG9kTmFtZSkge1xuICBtZXRob2RzW25hdGl2ZU1ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBpZCA9IGFyZ3NbMF1cbiAgICBjb25zdCB0eXBlID0gZ2V0RnJhbWV3b3JrVHlwZShpZClcbiAgICBpZiAodHlwZSAmJiBmcmFtZXdvcmtzW3R5cGVdKSB7XG4gICAgICByZXR1cm4gZnJhbWV3b3Jrc1t0eXBlXVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEVycm9yKGBpbnZhbGlkIGluc3RhbmNlIGlkIFwiJHtpZH1cImApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdCAoY29uZmlnKSB7XG4gIHJ1bnRpbWVDb25maWcgPSBjb25maWcgfHwge31cbiAgZnJhbWV3b3JrcyA9IHJ1bnRpbWVDb25maWcuZnJhbWV3b3JrcyB8fCB7fVxuICBpbml0VGFza0hhbmRsZXIoKVxuXG4gIC8vIEluaXQgZWFjaCBmcmFtZXdvcmsgYnkgYGluaXRgIG1ldGhvZCBhbmQgYGNvbmZpZ2Agd2hpY2ggY29udGFpbnMgdGhyZWVcbiAgLy8gdmlydHVhbC1ET00gQ2xhc3M6IGBEb2N1bWVudGAsIGBFbGVtZW50YCAmIGBDb21tZW50YCwgYW5kIGEgSlMgYnJpZGdlIG1ldGhvZDpcbiAgLy8gYHNlbmRUYXNrcyguLi5hcmdzKWAuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBmcmFtZXdvcmtzKSB7XG4gICAgY29uc3QgZnJhbWV3b3JrID0gZnJhbWV3b3Jrc1tuYW1lXVxuICAgIGZyYW1ld29yay5pbml0KGNvbmZpZylcbiAgfVxuXG4gIC8vIEB0b2RvOiBUaGUgbWV0aG9kIGByZWdpc3Rlck1ldGhvZHNgIHdpbGwgYmUgcmUtZGVzaWduZWQgb3IgcmVtb3ZlZCBsYXRlci5cbiAgOyBbJ3JlZ2lzdGVyQ29tcG9uZW50cycsICdyZWdpc3Rlck1vZHVsZXMnLCAncmVnaXN0ZXJNZXRob2RzJ10uZm9yRWFjaChnZW5Jbml0KVxuXG4gIDsgWydkZXN0cm95SW5zdGFuY2UnLCAncmVmcmVzaEluc3RhbmNlJywgJ3JlY2VpdmVUYXNrcycsICdnZXRSb290J10uZm9yRWFjaChnZW5JbnN0YW5jZSlcblxuICBhZGFwdEluc3RhbmNlKCdyZWNlaXZlVGFza3MnLCAnY2FsbEpTJylcblxuICByZXR1cm4gbWV0aG9kc1xufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSdcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5ub2RlVHlwZSA9IDhcbiAgICB0aGlzLm5vZGVJZCA9IHVuaXF1ZUlkKClcbiAgICB0aGlzLnJlZiA9IHRoaXMubm9kZUlkXG4gICAgdGhpcy50eXBlID0gJ2NvbW1lbnQnXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdXG4gICAgdGhpcy5wdXJlQ2hpbGRyZW4gPSBbXVxuICB9XG5cbiAgLyoqXG4gICogQ29udmVydCB0byBIVE1MIGNvbW1lbnQgc3RyaW5nLlxuICAqIEByZXR1cm4ge3N0aXJuZ30gaHRtbFxuICAqL1xuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuICc8IS0tICcgKyB0aGlzLnZhbHVlICsgJyAtLT4nXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiogQ3JlYXRlIHRoZSBhY3Rpb24gb2JqZWN0LlxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuKiBAcGFyYW0ge2FycmF5fSBhcmd1bWVudHNcbiogQHJldHVybiB7b2JqZWN0fSBhY3Rpb25cbiovXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb24gKG5hbWUsIGFyZ3MgPSBbXSkge1xuICByZXR1cm4geyBtb2R1bGU6ICdkb20nLCBtZXRob2Q6IG5hbWUsIGFyZ3M6IGFyZ3MgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0ZW5lciB7XG4gIGNvbnN0cnVjdG9yIChpZCwgaGFuZGxlcikge1xuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMuYmF0Y2hlZCA9IGZhbHNlXG4gICAgdGhpcy51cGRhdGVzID0gW11cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFuZGxlcicsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGhhbmRsZXJcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFwiY3JlYXRlRmluaXNoXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGNyZWF0ZUZpbmlzaCAoY2FsbGJhY2spIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyXG4gICAgcmV0dXJuIGhhbmRsZXIoW2NyZWF0ZUFjdGlvbignY3JlYXRlRmluaXNoJyldLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZUZpbmlzaFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICB1cGRhdGVGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlclxuICAgIHJldHVybiBoYW5kbGVyKFtjcmVhdGVBY3Rpb24oJ3VwZGF0ZUZpbmlzaCcpXSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJyZWZyZXNoRmluaXNoXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHJlZnJlc2hGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlclxuICAgIHJldHVybiBoYW5kbGVyKFtjcmVhdGVBY3Rpb24oJ3JlZnJlc2hGaW5pc2gnKV0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFwiY3JlYXRlQm9keVwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnRcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICBjcmVhdGVCb2R5IChlbGVtZW50KSB7XG4gICAgY29uc3QgYm9keSA9IGVsZW1lbnQudG9KU09OKClcbiAgICBjb25zdCBjaGlsZHJlbiA9IGJvZHkuY2hpbGRyZW5cbiAgICBkZWxldGUgYm9keS5jaGlsZHJlblxuICAgIGNvbnN0IGFjdGlvbnMgPSBbY3JlYXRlQWN0aW9uKCdjcmVhdGVCb2R5JywgW2JvZHldKV1cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGFjdGlvbnMucHVzaC5hcHBseShhY3Rpb25zLCBjaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWN0aW9uKCdhZGRFbGVtZW50JywgW2JvZHkucmVmLCBjaGlsZCwgLTFdKVxuICAgICAgfSkpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoYWN0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcImFkZEVsZW1lbnRcIiBzaWduYWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7c3Rpcm5nfSByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgYWRkRWxlbWVudCAoZWxlbWVudCwgcmVmLCBpbmRleCkge1xuICAgIGlmICghKGluZGV4ID49IDApKSB7XG4gICAgICBpbmRleCA9IC0xXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCdhZGRFbGVtZW50JywgW3JlZiwgZWxlbWVudC50b0pTT04oKSwgaW5kZXhdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInJlbW92ZUVsZW1lbnRcIiBzaWduYWwuXG4gICAqIEBwYXJhbSB7c3Rpcm5nfSByZWZlcmVuY2UgaWRcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICByZW1vdmVFbGVtZW50IChyZWYpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWYpKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gcmVmLm1hcCgocikgPT4gY3JlYXRlQWN0aW9uKCdyZW1vdmVFbGVtZW50JywgW3JdKSlcbiAgICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoYWN0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oJ3JlbW92ZUVsZW1lbnQnLCBbcmVmXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJtb3ZlRWxlbWVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHRhcmdldCByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtzdGlybmd9IHBhcmVudCByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgbW92ZUVsZW1lbnQgKHRhcmdldFJlZiwgcGFyZW50UmVmLCBpbmRleCkge1xuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCdtb3ZlRWxlbWVudCcsIFt0YXJnZXRSZWYsIHBhcmVudFJlZiwgaW5kZXhdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZUF0dHJzXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge3N0aXJuZ30gcmVmZXJlbmNlIGlkXG4gICAqIEBwYXJhbSB7c3Rpcm5nfSBrZXlcbiAgICogQHBhcmFtIHtzdGlybmd9IHZhbHVlXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgc2V0QXR0ciAocmVmLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgcmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oJ3VwZGF0ZUF0dHJzJywgW3JlZiwgcmVzdWx0XSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJ1cGRhdGVTdHlsZVwiIHNpZ25hbCwgdXBkYXRlIGEgc29sZSBzdHlsZS5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0aXJuZ30ga2V5XG4gICAqIEBwYXJhbSB7c3Rpcm5nfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHNldFN0eWxlIChyZWYsIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigndXBkYXRlU3R5bGUnLCBbcmVmLCByZXN1bHRdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZVN0eWxlXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge3N0aXJuZ30gcmVmZXJlbmNlIGlkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHNldFN0eWxlcyAocmVmLCBzdHlsZSkge1xuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCd1cGRhdGVTdHlsZScsIFtyZWYsIHN0eWxlXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJhZGRFdmVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGFkZEV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbignYWRkRXZlbnQnLCBbcmVmLCB0eXBlXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJyZW1vdmVFdmVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHJlbW92ZUV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigncmVtb3ZlRXZlbnQnLCBbcmVmLCB0eXBlXSkpXG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge29iamVjdCB8IGFycmF5fSBhY3Rpb25zXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm4ge30gYW55dGhpbmcgcmV0dXJuZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIGhhbmRsZXIgKGFjdGlvbnMsIGNiKSB7XG4gICAgcmV0dXJuIGNiICYmIGNiKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYWN0aW9ucyBpbnRvIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYXJyYXl9IGFjdGlvbnNcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICBhZGRBY3Rpb25zIChhY3Rpb25zKSB7XG4gICAgY29uc3QgdXBkYXRlcyA9IHRoaXMudXBkYXRlc1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhY3Rpb25zKSkge1xuICAgICAgYWN0aW9ucyA9IFthY3Rpb25zXVxuICAgIH1cblxuICAgIGlmICh0aGlzLmJhdGNoZWQpIHtcbiAgICAgIHVwZGF0ZXMucHVzaC5hcHBseSh1cGRhdGVzLCBhY3Rpb25zKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKGFjdGlvbnMpXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBUYXNrIGhhbmRsZXIgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBqYXZhc2NyaXB0IGFuZCBuYXRpdmUuXG4gKi9cblxuY29uc3QgaGFuZGxlck1hcCA9IHtcbiAgY3JlYXRlQm9keTogJ2NhbGxDcmVhdGVCb2R5JyxcbiAgYWRkRWxlbWVudDogJ2NhbGxBZGRFbGVtZW50JyxcbiAgcmVtb3ZlRWxlbWVudDogJ2NhbGxSZW1vdmVFbGVtZW50JyxcbiAgbW92ZUVsZW1lbnQ6ICdjYWxsTW92ZUVsZW1lbnQnLFxuICB1cGRhdGVBdHRyczogJ2NhbGxVcGRhdGVBdHRycycsXG4gIHVwZGF0ZVN0eWxlOiAnY2FsbFVwZGF0ZVN0eWxlJyxcbiAgYWRkRXZlbnQ6ICdjYWxsQWRkRXZlbnQnLFxuICByZW1vdmVFdmVudDogJ2NhbGxSZW1vdmVFdmVudCdcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSB0YXNrIGhhbmRsZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXJcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSB0YXNrSGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlciAoaWQsIGhhbmRsZXIpIHtcbiAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyIHx8IGdsb2JhbC5jYWxsTmF0aXZlXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgZGVmYXVsdEhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyJylcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB0YXNrSGFuZGxlciAodGFza3MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgICB0YXNrcyA9IFt0YXNrc11cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBkaXNwYXRjaFRhc2soaWQsIHRhc2tzW2ldLCBkZWZhdWx0SGFuZGxlcilcbiAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIGF2YWlsYWJsZSBoYW5kbGVyIGluIHRoZSBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc0F2YWlsYWJsZUhhbmRsZXIgKG1vZHVsZSwgbWV0aG9kKSB7XG4gIHJldHVybiBtb2R1bGUgPT09ICdkb20nXG4gICAgJiYgaGFuZGxlck1hcFttZXRob2RdXG4gICAgJiYgdHlwZW9mIGdsb2JhbFtoYW5kbGVyTWFwW21ldGhvZF1dID09PSAnZnVuY3Rpb24nXG59XG5cbi8qKlxuICogRGlzcGF0Y2ggdGhlIHRhc2sgdG8gdGhlIHNwZWNpZmllZCBoYW5kbGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge29iamVjdH0gdGFza1xuICogQHBhcmFtIHtmdW5jdGlvbn0gZGVmYXVsdEhhbmRsZXJcbiAqIEByZXR1cm4ge251bWJlcn0gc2lnbmFsIHJldHVybmVkIGZyb20gbmF0aXZlXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoVGFzayAoaWQsIHRhc2ssIGRlZmF1bHRIYW5kbGVyKSB7XG4gIGNvbnN0IHsgbW9kdWxlLCBtZXRob2QsIGFyZ3MgfSA9IHRhc2tcblxuICBpZiAoaGFzQXZhaWxhYmxlSGFuZGxlcihtb2R1bGUsIG1ldGhvZCkpIHtcbiAgICByZXR1cm4gZ2xvYmFsW2hhbmRsZXJNYXBbbWV0aG9kXV0oaWQsIC4uLmFyZ3MsICctMScpXG4gIH1cblxuICByZXR1cm4gZGVmYXVsdEhhbmRsZXIoaWQsIFt0YXNrXSwgJy0xJylcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgQ29tbWVudCBmcm9tICcuL0NvbW1lbnQnXG5pbXBvcnQgRWxlbWVudCBmcm9tICcuL0VsZW1lbnQnXG5pbXBvcnQgTGlzdGVuZXIgZnJvbSAnLi4vYnJpZGdlL0xpc3RlbmVyJ1xuaW1wb3J0IHsgVGFza0NlbnRlciB9IGZyb20gJy4uL2JyaWRnZS9UYXNrQ2VudGVyJ1xuaW1wb3J0IHsgY3JlYXRlSGFuZGxlciB9IGZyb20gJy4uL2JyaWRnZS9IYW5kbGVyJ1xuaW1wb3J0IHsgYWRkRG9jLCByZW1vdmVEb2MsIGFwcGVuZEJvZHksIHNldEJvZHkgfSBmcm9tICcuL29wZXJhdGlvbidcblxuLyoqXG4gKiBVcGRhdGUgYWxsIGNoYW5nZXMgZm9yIGFuIGVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtvYmplY3R9IGNoYW5nZXNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlRWxlbWVudCAoZWwsIGNoYW5nZXMpIHtcbiAgY29uc3QgYXR0cnMgPSBjaGFuZ2VzLmF0dHJzIHx8IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBhdHRycykge1xuICAgIGVsLnNldEF0dHIobmFtZSwgYXR0cnNbbmFtZV0sIHRydWUpXG4gIH1cbiAgY29uc3Qgc3R5bGUgPSBjaGFuZ2VzLnN0eWxlIHx8IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZSkge1xuICAgIGVsLnNldFN0eWxlKG5hbWUsIHN0eWxlW25hbWVdLCB0cnVlKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvY3VtZW50IHtcbiAgY29uc3RydWN0b3IgKGlkLCB1cmwsIGhhbmRsZXIpIHtcbiAgICBpZCA9IGlkID8gaWQudG9TdHJpbmcoKSA6ICcnXG4gICAgdGhpcy5pZCA9IGlkXG4gICAgdGhpcy5VUkwgPSB1cmxcblxuICAgIGFkZERvYyhpZCwgdGhpcylcbiAgICB0aGlzLm5vZGVNYXAgPSB7fVxuICAgIGNvbnN0IEwgPSBEb2N1bWVudC5MaXN0ZW5lciB8fCBMaXN0ZW5lclxuICAgIHRoaXMubGlzdGVuZXIgPSBuZXcgTChpZCwgaGFuZGxlciB8fCBjcmVhdGVIYW5kbGVyKGlkLCBEb2N1bWVudC5oYW5kbGVyKSkgLy8gZGVwcmVjYXRlZFxuICAgIHRoaXMudGFza0NlbnRlciA9IG5ldyBUYXNrQ2VudGVyKGlkLCBoYW5kbGVyID8gKGlkLCAuLi5hcmdzKSA9PiBoYW5kbGVyKC4uLmFyZ3MpIDogRG9jdW1lbnQuaGFuZGxlcilcbiAgICB0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpXG4gIH1cblxuICAvKipcbiAgKiBHZXQgdGhlIG5vZGUgZnJvbSBub2RlTWFwLlxuICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2UgaWRcbiAgKiBAcmV0dXJuIHtvYmplY3R9IG5vZGVcbiAgKi9cbiAgZ2V0UmVmIChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlTWFwW3JlZl1cbiAgfVxuXG4gIC8qKlxuICAqIFR1cm4gb24gYmF0Y2hlZCB1cGRhdGVzLlxuICAqL1xuICBvcGVuICgpIHtcbiAgICB0aGlzLmxpc3RlbmVyLmJhdGNoZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICogVHVybiBvZmYgYmF0Y2hlZCB1cGRhdGVzLlxuICAqL1xuICBjbG9zZSAoKSB7XG4gICAgdGhpcy5saXN0ZW5lci5iYXRjaGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICogQ3JlYXRlIHRoZSBkb2N1bWVudCBlbGVtZW50LlxuICAqIEByZXR1cm4ge29iamVjdH0gZG9jdW1lbnRFbGVtZW50XG4gICovXG4gIGNyZWF0ZURvY3VtZW50RWxlbWVudCAoKSB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29uc3QgZWwgPSBuZXcgRWxlbWVudCgnZG9jdW1lbnQnKVxuICAgICAgZWwuZG9jSWQgPSB0aGlzLmlkXG4gICAgICBlbC5vd25lckRvY3VtZW50ID0gdGhpc1xuICAgICAgZWwucm9sZSA9ICdkb2N1bWVudEVsZW1lbnQnXG4gICAgICBlbC5kZXB0aCA9IDBcbiAgICAgIGVsLnJlZiA9ICdfZG9jdW1lbnRFbGVtZW50J1xuICAgICAgdGhpcy5ub2RlTWFwLl9kb2N1bWVudEVsZW1lbnQgPSBlbFxuICAgICAgdGhpcy5kb2N1bWVudEVsZW1lbnQgPSBlbFxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdhcHBlbmRDaGlsZCcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChub2RlKSA9PiB7XG4gICAgICAgICAgYXBwZW5kQm9keSh0aGlzLCBub2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdpbnNlcnRCZWZvcmUnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobm9kZSwgYmVmb3JlKSA9PiB7XG4gICAgICAgICAgYXBwZW5kQm9keSh0aGlzLCBub2RlLCBiZWZvcmUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50XG4gIH1cblxuICAvKipcbiAgKiBDcmVhdGUgdGhlIGJvZHkgZWxlbWVudC5cbiAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAqIEBwYXJhbSB7b2JqY3R9IHByb3BzXG4gICogQHJldHVybiB7b2JqZWN0fSBib2R5IGVsZW1lbnRcbiAgKi9cbiAgY3JlYXRlQm9keSAodHlwZSwgcHJvcHMpIHtcbiAgICBpZiAoIXRoaXMuYm9keSkge1xuICAgICAgY29uc3QgZWwgPSBuZXcgRWxlbWVudCh0eXBlLCBwcm9wcylcbiAgICAgIHNldEJvZHkodGhpcywgZWwpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYm9keVxuICB9XG5cbiAgLyoqXG4gICogQ3JlYXRlIGFuIGVsZW1lbnQuXG4gICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWVcbiAgKiBAcGFyYW0ge29iamN0fSBwcm9wc1xuICAqIEByZXR1cm4ge29iamVjdH0gZWxlbWVudFxuICAqL1xuICBjcmVhdGVFbGVtZW50ICh0YWdOYW1lLCBwcm9wcykge1xuICAgIHJldHVybiBuZXcgRWxlbWVudCh0YWdOYW1lLCBwcm9wcylcbiAgfVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhbiBjb21tZW50LlxuICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICogQHJldHVybiB7b2JqZWN0fSBjb21tZW50XG4gICovXG4gIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHtcbiAgICByZXR1cm4gbmV3IENvbW1lbnQodGV4dClcbiAgfVxuXG4gIC8qKlxuICAqIEZpcmUgYW4gZXZlbnQgb24gc3BlY2lmaWVkIGVsZW1lbnQgbWFudWFsbHkuXG4gICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnRcbiAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBvYmplY3RcbiAgKiBAcGFyYW0ge29iamVjdH0gZG9tIGNoYW5nZXNcbiAgKiBAcmV0dXJuIHt9IGFueXRoaW5nIHJldHVybmVkIGJ5IGhhbmRsZXIgZnVuY3Rpb25cbiAgKi9cbiAgZmlyZUV2ZW50IChlbCwgdHlwZSwgZSwgZG9tQ2hhbmdlcykge1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBlID0gZSB8fCB7fVxuICAgIGUudHlwZSA9IHR5cGVcbiAgICBlLnRhcmdldCA9IGVsXG4gICAgZS5jdXJyZW50VGFyZ2V0ID0gZWxcbiAgICBlLnRpbWVzdGFtcCA9IERhdGUubm93KClcbiAgICBpZiAoZG9tQ2hhbmdlcykge1xuICAgICAgdXBkYXRlRWxlbWVudChlbCwgZG9tQ2hhbmdlcylcbiAgICB9XG4gICAgY29uc3QgaXNCdWJibGUgPSB0aGlzLmdldFJlZignX3Jvb3QnKS5hdHRyWydidWJibGUnXSA9PT0gJ3RydWUnXG4gICAgcmV0dXJuIGVsLmZpcmVFdmVudCh0eXBlLCBlLCBpc0J1YmJsZSlcbiAgfVxuXG4gIC8qKlxuICAqIERlc3Ryb3kgY3VycmVudCBkb2N1bWVudCwgYW5kIHJlbW92ZSBpdHNlbGYgZm9ybSBkb2NNYXAuXG4gICovXG4gIGRlc3Ryb3kgKCkge1xuICAgIHRoaXMudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKVxuICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyXG4gICAgZGVsZXRlIHRoaXMubm9kZU1hcFxuICAgIGRlbGV0ZSB0aGlzLnRhc2tDZW50ZXJcbiAgICByZW1vdmVEb2ModGhpcy5pZClcbiAgfVxufVxuXG4vLyBkZWZhdWx0IHRhc2sgaGFuZGxlclxuRG9jdW1lbnQuaGFuZGxlciA9IG51bGxcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTm9kZSBmcm9tICcuL05vZGUnXG5pbXBvcnQgRWxlbWVudCBmcm9tICcuL0VsZW1lbnQnXG5pbXBvcnQgQ29tbWVudCBmcm9tICcuL0NvbW1lbnQnXG5pbXBvcnQgRG9jdW1lbnQgZnJvbSAnLi9Eb2N1bWVudCdcblxuZXhwb3J0IHtcbiAgcmVnaXN0ZXJFbGVtZW50LFxuICB1bnJlZ2lzdGVyRWxlbWVudCxcbiAgaXNXZWV4RWxlbWVudCxcbiAgY2xlYXJXZWV4RWxlbWVudHNcbn0gZnJvbSAnLi9XZWV4RWxlbWVudCdcblxuZXhwb3J0IHtcbiAgRG9jdW1lbnQsXG4gIE5vZGUsXG4gIEVsZW1lbnQsXG4gIENvbW1lbnRcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRG9jdW1lbnQsIEVsZW1lbnQsIENvbW1lbnQgfSBmcm9tICcuLi92ZG9tJ1xuaW1wb3J0IExpc3RlbmVyIGZyb20gJy4uL2JyaWRnZS9MaXN0ZW5lcidcbmltcG9ydCB7IFRhc2tDZW50ZXIgfSBmcm9tICcuLi9icmlkZ2UvVGFza0NlbnRlcidcblxuY29uc3QgY29uZmlnID0ge1xuICBEb2N1bWVudCwgRWxlbWVudCwgQ29tbWVudCwgTGlzdGVuZXIsXG4gIFRhc2tDZW50ZXIsXG4gIHNlbmRUYXNrcyAoLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgY2FsbE5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNhbGxOYXRpdmUoLi4uYXJncylcbiAgICB9XG4gICAgcmV0dXJuIChnbG9iYWwuY2FsbE5hdGl2ZSB8fCAoKCkgPT4ge30pKSguLi5hcmdzKVxuICB9XG59XG5cbkRvY3VtZW50LmhhbmRsZXIgPSBjb25maWcuc2VuZFRhc2tzXG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogUmVnaXN0ZXIgZnJhbWV3b3JrKHMpIGluIEpTIHJ1bnRpbWUuIFdlZXggc3VwcGx5IHR3byBsYXllcnMgZm9yIDNyZC1wYXJ0eVxuICogZnJhbWV3b3JrKHMpOiBvbmUgaXMgdGhlIGluc3RhbmNlIG1hbmFnZW1lbnQgbGF5ZXIsIGFub3RoZXIgaXMgdGhlXG4gKiB2aXJ0dWFsLURPTSBsYXllci5cbiAqL1xuXG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnLi4vc2hhcmVkJ1xuXG5pbXBvcnQgaW5pdCBmcm9tICcuL2FwaS9pbml0J1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2FwaS9jb25maWcnXG5pbXBvcnQgeyByZWdpc3RlciwgdW5yZWdpc3RlciwgaGFzIH0gZnJvbSAnLi9hcGkvc2VydmljZSdcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGZyZWV6ZVByb3RvdHlwZSAoKSB7XG4gIHNoYXJlZC5mcmVlemVQcm90b3R5cGUoKVxuXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkVsZW1lbnQpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyKVxuICBPYmplY3QuZnJlZXplKGNvbmZpZy5Eb2N1bWVudC5wcm90b3R5cGUpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkVsZW1lbnQucHJvdG90eXBlKVxuICBPYmplY3QuZnJlZXplKGNvbmZpZy5Db21tZW50LnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShjb25maWcuTGlzdGVuZXIucHJvdG90eXBlKVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNldE5hdGl2ZUNvbnNvbGU6IHNoYXJlZC5zZXROYXRpdmVDb25zb2xlLFxuICByZXNldE5hdGl2ZUNvbnNvbGU6IHNoYXJlZC5yZXNldE5hdGl2ZUNvbnNvbGUsXG4gIHNldE5hdGl2ZVRpbWVyOiBzaGFyZWQuc2V0TmF0aXZlVGltZXIsXG4gIHJlc2V0TmF0aXZlVGltZXI6IHNoYXJlZC5yZXNldE5hdGl2ZVRpbWVyLFxuICBzZXJ2aWNlOiB7IHJlZ2lzdGVyLCB1bnJlZ2lzdGVyLCBoYXMgfSxcbiAgZnJlZXplUHJvdG90eXBlLFxuICBpbml0LFxuICBjb25maWdcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgY29uZmlnID0ge31cblxuY29uc3QgaW5zdGFuY2VNYXAgPSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAoY2ZnKSB7XG4gIGNvbmZpZy5Eb2N1bWVudCA9IGNmZy5Eb2N1bWVudFxuICBjb25maWcuRWxlbWVudCA9IGNmZy5FbGVtZW50XG4gIGNvbmZpZy5Db21tZW50ID0gY2ZnLkNvbW1lbnRcbiAgY29uZmlnLnNlbmRUYXNrcyA9IGNmZy5zZW5kVGFza3Ncbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlIChpZCwgY29kZSwgb3B0aW9ucyA9IHt9LCBkYXRhID0ge30sIHNlcnZpY2VPYmplY3RzID0ge30pIHtcbiAgY29uc3QgZG9jdW1lbnQgPSBuZXcgY29uZmlnLkRvY3VtZW50KGlkLCBvcHRpb25zLmJ1bmRsZVVybClcbiAgY29uc3QgY2FsbGJhY2tzID0ge31cbiAgY29uc3QgaW5zdGFuY2UgPSB7IGlkLCBkYXRhLCBkb2N1bWVudCwgY2FsbGJhY2tzIH1cblxuICBsZXQgbGFzdENhbGxiYWNrSWQgPSAwXG4gIGRvY3VtZW50LmFkZENhbGxiYWNrID0gZnVuYyA9PiB7XG4gICAgbGFzdENhbGxiYWNrSWQrK1xuICAgIGNhbGxiYWNrc1tsYXN0Q2FsbGJhY2tJZF0gPSBmdW5jXG4gICAgcmV0dXJuIGxhc3RDYWxsYmFja0lkXG4gIH1cbiAgZG9jdW1lbnQuaGFuZGxlQ2FsbGJhY2sgPSAoZnVuY0lkLCBkYXRhLCBpZkxhc3QpID0+IHtcbiAgICBjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1tmdW5jSWRdXG4gICAgaWYgKGlmTGFzdCkge1xuICAgICAgZGVsZXRlIGNhbGxiYWNrc1tmdW5jSWRdXG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjayhkYXRhKVxuICB9XG4gIGluc3RhbmNlTWFwW2lkXSA9IGluc3RhbmNlXG5cbiAgY29uc3QgZ2xvYmFsT2JqZWN0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIERvY3VtZW50OiBjb25maWcuRG9jdW1lbnQsXG4gICAgRWxlbWVudDogY29uZmlnLkVsZW1lbnQsXG4gICAgQ29tbWVudDogY29uZmlnLkNvbW1lbnQsXG4gICAgc2VuZFRhc2tzOiB0YXNrcyA9PiBjb25maWcuc2VuZFRhc2tzKGlkLCB0YXNrcywgLTEpLFxuICAgIG9wdGlvbnMsXG4gICAgZG9jdW1lbnRcbiAgfSwgc2VydmljZU9iamVjdHMpXG5cbiAgY29uc3QgZ2xvYmFsS2V5cyA9IFtdXG4gIGNvbnN0IGdsb2JhbFZhbHVlcyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIGdsb2JhbE9iamVjdHMpIHtcbiAgICBnbG9iYWxLZXlzLnB1c2goa2V5KVxuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSlcbiAgfVxuICBnbG9iYWxLZXlzLnB1c2goY29kZSlcblxuICBjb25zdCByZXN1bHQgPSBuZXcgRnVuY3Rpb24oLi4uZ2xvYmFsS2V5cylcbiAgcmVzdWx0KC4uLmdsb2JhbFZhbHVlcylcblxuICBjb25maWcuc2VuZFRhc2tzKGlkLCBbeyBtb2R1bGU6ICdkb20nLCBtZXRob2Q6ICdjcmVhdGVGaW5pc2gnLCBhcmdzOiBbXSB9XSwgLTEpXG5cbiAgcmV0dXJuIGluc3RhbmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGlkKSB7XG4gIGRlbGV0ZSBpbnN0YW5jZU1hcFtpZF1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3QgKGlkKSB7XG4gIHJldHVybiBpbnN0YW5jZU1hcFtpZF0uZG9jdW1lbnQuYm9keS50b0pTT04oKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZVRhc2tzIChpZCwgdGFza3MpIHtcbiAgY29uc3QganNIYW5kbGVycyA9IHtcbiAgICBmaXJlRXZlbnQ6IChpZCwgcmVmLCB0eXBlLCBkYXRhLCBkb21DaGFuZ2VzKSA9PiB7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF1cbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0UmVmKHJlZilcbiAgICAgIHJldHVybiBkb2N1bWVudC5maXJlRXZlbnQoZWwsIHR5cGUsIGRhdGEsIGRvbUNoYW5nZXMpXG4gICAgfSxcblxuICAgIGNhbGxiYWNrOiAoaWQsIGZ1bmNJZCwgZGF0YSwgaWZMYXN0KSA9PiB7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF1cbiAgICAgIHJldHVybiBkb2N1bWVudC5oYW5kbGVDYWxsYmFjayhmdW5jSWQsIGRhdGEsIGlmTGFzdClcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF0gfHwge31cbiAgaWYgKGRvY3VtZW50ICYmIEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdXG4gICAgdGFza3MuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGpzSGFuZGxlcnNbdGFzay5tZXRob2RdXG4gICAgICBjb25zdCBhcmdzID0gWy4uLnRhc2suYXJnc11cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhcmdzLnVuc2hpZnQoaWQpXG4gICAgICAgIHJlc3VsdHMucHVzaChoYW5kbGVyKC4uLmFyZ3MpKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdlZXhGYWN0b3J5IChleHBvcnRzLCByZW5kZXJlcikge1xuXG4vKiAgKi9cblxuLy8gdGhlc2UgaGVscGVycyBwcm9kdWNlcyBiZXR0ZXIgdm0gY29kZSBpbiBKUyBlbmdpbmVzIGR1ZSB0byB0aGVpclxuLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZ1xuZnVuY3Rpb24gaXNVbmRlZiAodikge1xuICByZXR1cm4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNEZWYgKHYpIHtcbiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzVHJ1ZSAodikge1xuICByZXR1cm4gdiA9PT0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpc0ZhbHNlICh2KSB7XG4gIHJldHVybiB2ID09PSBmYWxzZVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZVxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nXG4gIClcbn1cblxuLyoqXG4gKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGxcbiAqIE9iamVjdHMgZnJvbSBwcmltaXRpdmUgdmFsdWVzIHdoZW4gd2Uga25vdyB0aGUgdmFsdWVcbiAqIGlzIGEgSlNPTi1jb21wbGlhbnQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbnZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWVcbiAqIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikge1xuICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAgKHYpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBSZWdFeHBdJ1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LlxuICovXG5mdW5jdGlvbiBpc1ZhbGlkQXJyYXlJbmRleCAodmFsKSB7XG4gIHZhciBuID0gcGFyc2VGbG9hdCh2YWwpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLlxuICovXG5mdW5jdGlvbiB0b1N0cmluZyAodmFsKSB7XG4gIHJldHVybiB2YWwgPT0gbnVsbFxuICAgID8gJydcbiAgICA6IHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMilcbiAgICAgIDogU3RyaW5nKHZhbClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgYXR0cmlidXRlIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuICovXG52YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxpcycpO1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXlcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHtcbiAgaWYgKGFyci5sZW5ndGgpIHtcbiAgICB2YXIgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcmV0dXJuIGFyci5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkuXG4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxuICovXG52YXIgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KVxufSk7XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhIHN0cmluZy5cbiAqL1xudmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KTtcblxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG52YXIgaHlwaGVuYXRlUkUgPSAvKFteLV0pKFtBLVpdKS9nO1xudmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJylcbiAgICAucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJylcbiAgICAudG9Mb3dlckNhc2UoKVxufSk7XG5cbi8qKlxuICogU2ltcGxlIGJpbmQsIGZhc3RlciB0aGFuIG5hdGl2ZVxuICovXG5mdW5jdGlvbiBiaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cbiAgLy8gcmVjb3JkIG9yaWdpbmFsIGZuIGxlbmd0aFxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbi8qKlxuICogQ29udmVydCBhbiBBcnJheS1saWtlIG9iamVjdCB0byBhIHJlYWwgQXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgdmFyIGkgPSBsaXN0Lmxlbmd0aCAtIHN0YXJ0O1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgcmV0W2ldID0gbGlzdFtpICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXRcbn1cblxuLyoqXG4gKiBNaXggcHJvcGVydGllcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZCAodG8sIF9mcm9tKSB7XG4gIGZvciAodmFyIGtleSBpbiBfZnJvbSkge1xuICAgIHRvW2tleV0gPSBfZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHRvT2JqZWN0IChhcnIpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJbaV0pIHtcbiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyoqXG4gKiBQZXJmb3JtIG5vIG9wZXJhdGlvbi5cbiAqIFN0dWJiaW5nIGFyZ3MgdG8gbWFrZSBGbG93IGhhcHB5IHdpdGhvdXQgbGVhdmluZyB1c2VsZXNzIHRyYW5zcGlsZWQgY29kZVxuICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKipcbiAqIFJldHVybiBzYW1lIHZhbHVlXG4gKi9cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy5cbiAqL1xuXG5cbi8qKlxuICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsXG4gKiBpZiB0aGV5IGFyZSBwbGFpbiBvYmplY3RzLCBkbyB0aGV5IGhhdmUgdGhlIHNhbWUgc2hhcGU/XG4gKi9cbmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHsgcmV0dXJuIHRydWUgfVxuICB2YXIgaXNPYmplY3RBID0gaXNPYmplY3QoYSk7XG4gIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTtcbiAgaWYgKGlzT2JqZWN0QSAmJiBpc09iamVjdEIpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICAgIHZhciBpc0FycmF5QiA9IEFycmF5LmlzQXJyYXkoYik7XG4gICAgICBpZiAoaXNBcnJheUEgJiYgaXNBcnJheUIpIHtcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3NlRXF1YWwoZSwgYltpXSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5Qikge1xuICAgICAgICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3NlRXF1YWwoYVtrZXldLCBiW2tleV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9IGVsc2UgaWYgKCFpc09iamVjdEEgJiYgIWlzT2JqZWN0Qikge1xuICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBTU1JfQVRUUiA9ICdkYXRhLXNlcnZlci1yZW5kZXJlZCc7XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJ1xuXTtcblxuLyogICovXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3VwcHJlc3Mgd2FybmluZ3MuXG4gICAqL1xuICBzaWxlbnQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290P1xuICAgKi9cbiAgcHJvZHVjdGlvblRpcDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHNcbiAgICovXG4gIGRldnRvb2xzOiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmXG4gICAqL1xuICBwZXJmb3JtYW5jZTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEVycm9yIGhhbmRsZXIgZm9yIHdhdGNoZXIgZXJyb3JzXG4gICAqL1xuICBlcnJvckhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIFdhcm4gaGFuZGxlciBmb3Igd2F0Y2hlciB3YXJuc1xuICAgKi9cbiAgd2FybkhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50c1xuICAgKi9cbiAgaWdub3JlZEVsZW1lbnRzOiBbXSxcblxuICAvKipcbiAgICogQ3VzdG9tIHVzZXIga2V5IGFsaWFzZXMgZm9yIHYtb25cbiAgICovXG4gIGtleUNvZGVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHRhZyBpcyByZXNlcnZlZCBzbyB0aGF0IGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkIGFzIGFcbiAgICogY29tcG9uZW50LiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgaXNSZXNlcnZlZFRhZzogbm8sXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBzbyB0aGF0IGl0IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29tcG9uZW50XG4gICAqIHByb3AuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkQXR0cjogbm8sXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIGFuIHVua25vd24gZWxlbWVudC5cbiAgICogUGxhdGZvcm0tZGVwZW5kZW50LlxuICAgKi9cbiAgaXNVbmtub3duRWxlbWVudDogbm8sXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZXNwYWNlIG9mIGFuIGVsZW1lbnRcbiAgICovXG4gIGdldFRhZ05hbWVzcGFjZTogbm9vcCxcblxuICAvKipcbiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS5cbiAgICovXG4gIHBhcnNlUGxhdGZvcm1UYWdOYW1lOiBpZGVudGl0eSxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIG11c3QgYmUgYm91bmQgdXNpbmcgcHJvcGVydHksIGUuZy4gdmFsdWVcbiAgICogUGxhdGZvcm0tZGVwZW5kZW50LlxuICAgKi9cbiAgbXVzdFVzZVByb3A6IG5vLFxuXG4gIC8qKlxuICAgKiBFeHBvc2VkIGZvciBsZWdhY3kgcmVhc29uc1xuICAgKi9cbiAgX2xpZmVjeWNsZUhvb2tzOiBMSUZFQ1lDTEVfSE9PS1Ncbn0pO1xuXG4vKiAgKi9cblxudmFyIGVtcHR5T2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfXG4gKi9cbmZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTtcbiAgcmV0dXJuIGMgPT09IDB4MjQgfHwgYyA9PT0gMHg1RlxufVxuXG4vKipcbiAqIERlZmluZSBhIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBkZWYgKG9iaiwga2V5LCB2YWwsIGVudW1lcmFibGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgdmFsdWU6IHZhbCxcbiAgICBlbnVtZXJhYmxlOiAhIWVudW1lcmFibGUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIHNpbXBsZSBwYXRoLlxuICovXG52YXIgYmFpbFJFID0gL1teXFx3LiRdLztcbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkge1xuICBpZiAoYmFpbFJFLnRlc3QocGF0aCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFvYmopIHsgcmV0dXJuIH1cbiAgICAgIG9iaiA9IG9ialtzZWdtZW50c1tpXV07XG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHdhcm4gPSBub29wO1xudmFyIHRpcCA9IG5vb3A7XG52YXIgZm9ybWF0Q29tcG9uZW50TmFtZSA9IChudWxsKTsgLy8gd29yayBhcm91bmQgZmxvdyBjaGVja1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgaGFzQ29uc29sZSA9IHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG4gIHZhciBjbGFzc2lmeSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGNsYXNzaWZ5UkUsIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRvVXBwZXJDYXNlKCk7IH0pXG4gICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9O1xuXG4gIHdhcm4gPSBmdW5jdGlvbiAobXNnLCB2bSkge1xuICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJztcblxuICAgIGlmIChjb25maWcud2FybkhhbmRsZXIpIHtcbiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbVnVlIHdhcm5dOiBcIiArIG1zZyArIHRyYWNlKSk7XG4gICAgfVxuICB9O1xuXG4gIHRpcCA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKFwiW1Z1ZSB0aXBdOiBcIiArIG1zZyArIChcbiAgICAgICAgdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnXG4gICAgICApKTtcbiAgICB9XG4gIH07XG5cbiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHtcbiAgICBpZiAodm0uJHJvb3QgPT09IHZtKSB7XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG5hbWUgPSB0eXBlb2Ygdm0gPT09ICdzdHJpbmcnXG4gICAgICA/IHZtXG4gICAgICA6IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5vcHRpb25zXG4gICAgICAgID8gdm0ub3B0aW9ucy5uYW1lXG4gICAgICAgIDogdm0uX2lzVnVlXG4gICAgICAgICAgPyB2bS4kb3B0aW9ucy5uYW1lIHx8IHZtLiRvcHRpb25zLl9jb21wb25lbnRUYWdcbiAgICAgICAgICA6IHZtLm5hbWU7XG5cbiAgICB2YXIgZmlsZSA9IHZtLl9pc1Z1ZSAmJiB2bS4kb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICB2YXIgZ2VuZXJhdGVDb21wb25lbnRUcmFjZSA9IGZ1bmN0aW9uICh2bSkge1xuICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkge1xuICAgICAgdmFyIHRyZWUgPSBbXTtcbiAgICAgIHZhciBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPSAwO1xuICAgICAgd2hpbGUgKHZtKSB7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbGFzdCA9IHRyZWVbdHJlZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSsrO1xuICAgICAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA+IDApIHtcbiAgICAgICAgICAgIHRyZWVbdHJlZS5sZW5ndGggLSAxXSA9IFtsYXN0LCBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2VdO1xuICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJlZS5wdXNoKHZtKTtcbiAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuICdcXG5cXG5mb3VuZCBpblxcblxcbicgKyB0cmVlXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHZtLCBpKSB7IHJldHVybiAoXCJcIiArIChpID09PSAwID8gJy0tLT4gJyA6IHJlcGVhdCgnICcsIDUgKyBpICogMikpICsgKEFycmF5LmlzQXJyYXkodm0pXG4gICAgICAgICAgICA/ICgoZm9ybWF0Q29tcG9uZW50TmFtZSh2bVswXSkpICsgXCIuLi4gKFwiICsgKHZtWzFdKSArIFwiIHJlY3Vyc2l2ZSBjYWxscylcIilcbiAgICAgICAgICAgIDogZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpKTsgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXCJcXG5cXG4oZm91bmQgaW4gXCIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgXCIpXCIpXG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKGNvbmZpZy5lcnJvckhhbmRsZXIpIHtcbiAgICBjb25maWcuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCwgZXJyLCB2bSwgaW5mbyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oKFwiRXJyb3IgaW4gXCIgKyBpbmZvICsgXCI6IFxcXCJcIiArIChlcnIudG9TdHJpbmcoKSkgKyBcIlxcXCJcIiksIHZtKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaW5Ccm93c2VyICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG4vKiBnbG9iYWxzIE11dGF0aW9uT2JzZXJ2ZXIgKi9cblxuLy8gY2FuIHdlIHVzZSBfX3Byb3RvX18/XG52YXIgaGFzUHJvdG8gPSAnX19wcm90b19fJyBpbiB7fTtcblxuLy8gQnJvd3NlciBlbnZpcm9ubWVudCBzbmlmZmluZ1xudmFyIGluQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xudmFyIFVBID0gaW5Ccm93c2VyICYmIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG52YXIgaXNJRSA9IFVBICYmIC9tc2llfHRyaWRlbnQvLnRlc3QoVUEpO1xudmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7XG52YXIgaXNFZGdlID0gVUEgJiYgVUEuaW5kZXhPZignZWRnZS8nKSA+IDA7XG52YXIgaXNBbmRyb2lkID0gVUEgJiYgVUEuaW5kZXhPZignYW5kcm9pZCcpID4gMDtcbnZhciBpc0lPUyA9IFVBICYmIC9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChVQSk7XG52YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXFwvXFxkKy8udGVzdChVQSkgJiYgIWlzRWRnZTtcblxuLy8gRmlyZWZpeCBoYXMgYSBcIndhdGNoXCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLlxudmFyIG5hdGl2ZVdhdGNoID0gKHt9KS53YXRjaDtcblxudmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuaWYgKGluQnJvd3Nlcikge1xuICB0cnkge1xuICAgIHZhciBvcHRzID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdHMsICdwYXNzaXZlJywgKHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgc3VwcG9ydHNQYXNzaXZlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdC1wYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbi8vIHRoaXMgbmVlZHMgdG8gYmUgbGF6eS1ldmFsZWQgYmVjYXVzZSB2dWUgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZVxuLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlZcbnZhciBfaXNTZXJ2ZXI7XG52YXIgaXNTZXJ2ZXJSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghaW5Ccm93c2VyICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBkZXRlY3QgcHJlc2VuY2Ugb2YgdnVlLXNlcnZlci1yZW5kZXJlciBhbmQgYXZvaWRcbiAgICAgIC8vIFdlYnBhY2sgc2hpbW1pbmcgdGhlIHByb2Nlc3NcbiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJztcbiAgICB9IGVsc2Uge1xuICAgICAgX2lzU2VydmVyID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBfaXNTZXJ2ZXJcbn07XG5cbi8vIGRldGVjdCBkZXZ0b29sc1xudmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChDdG9yLnRvU3RyaW5nKCkpXG59XG5cbnZhciBoYXNTeW1ib2wgPVxuICB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShTeW1ib2wpICYmXG4gIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpO1xuXG4vKipcbiAqIERlZmVyIGEgdGFzayB0byBleGVjdXRlIGl0IGFzeW5jaHJvbm91c2x5LlxuICovXG52YXIgbmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGJhY2tzID0gW107XG4gIHZhciBwZW5kaW5nID0gZmFsc2U7XG4gIHZhciB0aW1lckZ1bmM7XG5cbiAgZnVuY3Rpb24gbmV4dFRpY2tIYW5kbGVyICgpIHtcbiAgICBwZW5kaW5nID0gZmFsc2U7XG4gICAgdmFyIGNvcGllcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICBjYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29waWVzW2ldKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhlIG5leHRUaWNrIGJlaGF2aW9yIGxldmVyYWdlcyB0aGUgbWljcm90YXNrIHF1ZXVlLCB3aGljaCBjYW4gYmUgYWNjZXNzZWRcbiAgLy8gdmlhIGVpdGhlciBuYXRpdmUgUHJvbWlzZS50aGVuIG9yIE11dGF0aW9uT2JzZXJ2ZXIuXG4gIC8vIE11dGF0aW9uT2JzZXJ2ZXIgaGFzIHdpZGVyIHN1cHBvcnQsIGhvd2V2ZXIgaXQgaXMgc2VyaW91c2x5IGJ1Z2dlZCBpblxuICAvLyBVSVdlYlZpZXcgaW4gaU9TID49IDkuMy4zIHdoZW4gdHJpZ2dlcmVkIGluIHRvdWNoIGV2ZW50IGhhbmRsZXJzLiBJdFxuICAvLyBjb21wbGV0ZWx5IHN0b3BzIHdvcmtpbmcgYWZ0ZXIgdHJpZ2dlcmluZyBhIGZldyB0aW1lcy4uLiBzbywgaWYgbmF0aXZlXG4gIC8vIFByb21pc2UgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIHVzZSBpdDpcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHtcbiAgICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHZhciBsb2dFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB9O1xuICAgIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHAudGhlbihuZXh0VGlja0hhbmRsZXIpLmNhdGNoKGxvZ0Vycm9yKTtcbiAgICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dFxuICAgICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlXG4gICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlclxuICAgICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuXG4gICAgICAvLyBcImZvcmNlXCIgdGhlIG1pY3JvdGFzayBxdWV1ZSB0byBiZSBmbHVzaGVkIGJ5IGFkZGluZyBhbiBlbXB0eSB0aW1lci5cbiAgICAgIGlmIChpc0lPUykgeyBzZXRUaW1lb3V0KG5vb3ApOyB9XG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgKFxuICAgIGlzTmF0aXZlKE11dGF0aW9uT2JzZXJ2ZXIpIHx8XG4gICAgLy8gUGhhbnRvbUpTIGFuZCBpT1MgNy54XG4gICAgTXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpID09PSAnW29iamVjdCBNdXRhdGlvbk9ic2VydmVyQ29uc3RydWN0b3JdJ1xuICApKSB7XG4gICAgLy8gdXNlIE11dGF0aW9uT2JzZXJ2ZXIgd2hlcmUgbmF0aXZlIFByb21pc2UgaXMgbm90IGF2YWlsYWJsZSxcbiAgICAvLyBlLmcuIFBoYW50b21KUyBJRTExLCBpT1M3LCBBbmRyb2lkIDQuNFxuICAgIHZhciBjb3VudGVyID0gMTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihuZXh0VGlja0hhbmRsZXIpO1xuICAgIHZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjb3VudGVyKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0ZXh0Tm9kZSwge1xuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgIH0pO1xuICAgIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvdW50ZXIgPSAoY291bnRlciArIDEpICUgMjtcbiAgICAgIHRleHROb2RlLmRhdGEgPSBTdHJpbmcoY291bnRlcik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBmYWxsYmFjayB0byBzZXRUaW1lb3V0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRUaW1lb3V0KG5leHRUaWNrSGFuZGxlciwgMCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBxdWV1ZU5leHRUaWNrIChjYiwgY3R4KSB7XG4gICAgdmFyIF9yZXNvbHZlO1xuICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjYikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNiLmNhbGwoY3R4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGN0eCwgJ25leHRUaWNrJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoX3Jlc29sdmUpIHtcbiAgICAgICAgX3Jlc29sdmUoY3R4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSB0cnVlO1xuICAgICAgdGltZXJGdW5jKCk7XG4gICAgfVxuICAgIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KVxuICAgIH1cbiAgfVxufSkoKTtcblxudmFyIF9TZXQ7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmICh0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShTZXQpKSB7XG4gIC8vIHVzZSBuYXRpdmUgU2V0IHdoZW4gYXZhaWxhYmxlLlxuICBfU2V0ID0gU2V0O1xufSBlbHNlIHtcbiAgLy8gYSBub24tc3RhbmRhcmQgU2V0IHBvbHlmaWxsIHRoYXQgb25seSB3b3JrcyB3aXRoIHByaW1pdGl2ZSBrZXlzLlxuICBfU2V0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXQgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRba2V5XSA9PT0gdHJ1ZVxuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGtleSkge1xuICAgICAgdGhpcy5zZXRba2V5XSA9IHRydWU7XG4gICAgfTtcbiAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2V0O1xuICB9KCkpO1xufVxuXG4vKiAgKi9cblxuXG52YXIgdWlkJDEgPSAwO1xuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqL1xudmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7XG4gIHRoaXMuaWQgPSB1aWQkMSsrO1xuICB0aGlzLnN1YnMgPSBbXTtcbn07XG5cbkRlcC5wcm90b3R5cGUuYWRkU3ViID0gZnVuY3Rpb24gYWRkU3ViIChzdWIpIHtcbiAgdGhpcy5zdWJzLnB1c2goc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUucmVtb3ZlU3ViID0gZnVuY3Rpb24gcmVtb3ZlU3ViIChzdWIpIHtcbiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgaWYgKERlcC50YXJnZXQpIHtcbiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKTtcbiAgfVxufTtcblxuRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkge1xuICAvLyBzdGFiaWxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICB2YXIgc3VicyA9IHRoaXMuc3Vicy5zbGljZSgpO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgc3Vic1tpXS51cGRhdGUoKTtcbiAgfVxufTtcblxuLy8gdGhlIGN1cnJlbnQgdGFyZ2V0IHdhdGNoZXIgYmVpbmcgZXZhbHVhdGVkLlxuLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZVxuLy8gd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQgYXQgYW55IHRpbWUuXG5EZXAudGFyZ2V0ID0gbnVsbDtcbnZhciB0YXJnZXRTdGFjayA9IFtdO1xuXG5mdW5jdGlvbiBwdXNoVGFyZ2V0IChfdGFyZ2V0KSB7XG4gIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH1cbiAgRGVwLnRhcmdldCA9IF90YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIHBvcFRhcmdldCAoKSB7XG4gIERlcC50YXJnZXQgPSB0YXJnZXRTdGFjay5wb3AoKTtcbn1cblxuLypcbiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aFxuICogZHluYW1pY2FsbHkgYWNjZXNzaW5nIG1ldGhvZHMgb24gQXJyYXkgcHJvdG90eXBlXG4gKi9cblxudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG52YXIgYXJyYXlNZXRob2RzID0gT2JqZWN0LmNyZWF0ZShhcnJheVByb3RvKTtbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnXG5dXG4uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZFxuICB2YXIgb3JpZ2luYWwgPSBhcnJheVByb3RvW21ldGhvZF07XG4gIGRlZihhcnJheU1ldGhvZHMsIG1ldGhvZCwgZnVuY3Rpb24gbXV0YXRvciAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHZhciBvYiA9IHRoaXMuX19vYl9fO1xuICAgIHZhciBpbnNlcnRlZDtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncHVzaCc6XG4gICAgICBjYXNlICd1bnNoaWZ0JzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc3BsaWNlJzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpO1xuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfVxuICAgIC8vIG5vdGlmeSBjaGFuZ2VcbiAgICBvYi5kZXAubm90aWZ5KCk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KTtcbn0pO1xuXG4vKiAgKi9cblxudmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgd2hlbiBhIHJlYWN0aXZlIHByb3BlcnR5IGlzIHNldCwgdGhlIG5ldyB2YWx1ZSBpc1xuICogYWxzbyBjb252ZXJ0ZWQgdG8gYmVjb21lIHJlYWN0aXZlLiBIb3dldmVyIHdoZW4gcGFzc2luZyBkb3duIHByb3BzLFxuICogd2UgZG9uJ3Qgd2FudCB0byBmb3JjZSBjb252ZXJzaW9uIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBhIG5lc3RlZCB2YWx1ZVxuICogdW5kZXIgYSBmcm96ZW4gZGF0YSBzdHJ1Y3R1cmUuIENvbnZlcnRpbmcgaXQgd291bGQgZGVmZWF0IHRoZSBvcHRpbWl6YXRpb24uXG4gKi9cbnZhciBvYnNlcnZlclN0YXRlID0ge1xuICBzaG91bGRDb252ZXJ0OiB0cnVlXG59O1xuXG4vKipcbiAqIE9ic2VydmVyIGNsYXNzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRhcmdldFxuICogb2JqZWN0J3MgcHJvcGVydHkga2V5cyBpbnRvIGdldHRlci9zZXR0ZXJzIHRoYXRcbiAqIGNvbGxlY3QgZGVwZW5kZW5jaWVzIGFuZCBkaXNwYXRjaGVzIHVwZGF0ZXMuXG4gKi9cbnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkge1xuICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMuZGVwID0gbmV3IERlcCgpO1xuICB0aGlzLnZtQ291bnQgPSAwO1xuICBkZWYodmFsdWUsICdfX29iX18nLCB0aGlzKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90b1xuICAgICAgPyBwcm90b0F1Z21lbnRcbiAgICAgIDogY29weUF1Z21lbnQ7XG4gICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpO1xuICAgIHRoaXMub2JzZXJ2ZUFycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndhbGsodmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFdhbGsgdGhyb3VnaCBlYWNoIHByb3BlcnR5IGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMShvYmosIGtleXNbaV0sIG9ialtrZXlzW2ldXSk7XG4gIH1cbn07XG5cbi8qKlxuICogT2JzZXJ2ZSBhIGxpc3Qgb2YgQXJyYXkgaXRlbXMuXG4gKi9cbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgb2JzZXJ2ZShpdGVtc1tpXSk7XG4gIH1cbn07XG5cbi8vIGhlbHBlcnNcblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgZGVmaW5pbmdcbiAqIGhpZGRlbiBwcm9wZXJ0aWVzLlxuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gY29weUF1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBkZWYodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gY3JlYXRlIGFuIG9ic2VydmVyIGluc3RhbmNlIGZvciBhIHZhbHVlLFxuICogcmV0dXJucyB0aGUgbmV3IG9ic2VydmVyIGlmIHN1Y2Nlc3NmdWxseSBvYnNlcnZlZCxcbiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLlxuICovXG5mdW5jdGlvbiBvYnNlcnZlICh2YWx1ZSwgYXNSb290RGF0YSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYjtcbiAgaWYgKGhhc093bih2YWx1ZSwgJ19fb2JfXycpICYmIHZhbHVlLl9fb2JfXyBpbnN0YW5jZW9mIE9ic2VydmVyKSB7XG4gICAgb2IgPSB2YWx1ZS5fX29iX187XG4gIH0gZWxzZSBpZiAoXG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ICYmXG4gICAgIWlzU2VydmVyUmVuZGVyaW5nKCkgJiZcbiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmXG4gICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWx1ZSkgJiZcbiAgICAhdmFsdWUuX2lzVnVlXG4gICkge1xuICAgIG9iID0gbmV3IE9ic2VydmVyKHZhbHVlKTtcbiAgfVxuICBpZiAoYXNSb290RGF0YSAmJiBvYikge1xuICAgIG9iLnZtQ291bnQrKztcbiAgfVxuICByZXR1cm4gb2Jcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiBhbiBPYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlJCQxIChcbiAgb2JqLFxuICBrZXksXG4gIHZhbCxcbiAgY3VzdG9tU2V0dGVyLFxuICBzaGFsbG93XG4pIHtcbiAgdmFyIGRlcCA9IG5ldyBEZXAoKTtcblxuICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcbiAgaWYgKHByb3BlcnR5ICYmIHByb3BlcnR5LmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGNhdGVyIGZvciBwcmUtZGVmaW5lZCBnZXR0ZXIvc2V0dGVyc1xuICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0O1xuICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0O1xuXG4gIHZhciBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7XG4gICAgICBpZiAoRGVwLnRhcmdldCkge1xuICAgICAgICBkZXAuZGVwZW5kKCk7XG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZGVwZW5kQXJyYXkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gcmVhY3RpdmVTZXR0ZXIgKG5ld1ZhbCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICYmIHZhbHVlICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7XG4gICAgICAgIGN1c3RvbVNldHRlcigpO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRlcikge1xuICAgICAgICBzZXR0ZXIuY2FsbChvYmosIG5ld1ZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBuZXdWYWw7XG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZShuZXdWYWwpO1xuICAgICAgZGVwLm5vdGlmeSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0Lmxlbmd0aCA9IE1hdGgubWF4KHRhcmdldC5sZW5ndGgsIGtleSk7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGlmIChoYXNPd24odGFyZ2V0LCBrZXkpKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGFkZGluZyByZWFjdGl2ZSBwcm9wZXJ0aWVzIHRvIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgK1xuICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLidcbiAgICApO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBpZiAoIW9iKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGRlZmluZVJlYWN0aXZlJCQxKG9iLnZhbHVlLCBrZXksIHZhbCk7XG4gIG9iLmRlcC5ub3RpZnkoKTtcbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKi9cbmZ1bmN0aW9uIGRlbCAodGFyZ2V0LCBrZXkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEpO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArXG4gICAgICAnLSBqdXN0IHNldCBpdCB0byBudWxsLidcbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICghaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgIHJldHVyblxuICB9XG4gIGRlbGV0ZSB0YXJnZXRba2V5XTtcbiAgaWYgKCFvYikge1xuICAgIHJldHVyblxuICB9XG4gIG9iLmRlcC5ub3RpZnkoKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGRlcGVuZGVuY2llcyBvbiBhcnJheSBlbGVtZW50cyB3aGVuIHRoZSBhcnJheSBpcyB0b3VjaGVkLCBzaW5jZVxuICogd2UgY2Fubm90IGludGVyY2VwdCBhcnJheSBlbGVtZW50IGFjY2VzcyBsaWtlIHByb3BlcnR5IGdldHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGRlcGVuZEFycmF5ICh2YWx1ZSkge1xuICBmb3IgKHZhciBlID0gKHZvaWQgMCksIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZSA9IHZhbHVlW2ldO1xuICAgIGUgJiYgZS5fX29iX18gJiYgZS5fX29iX18uZGVwLmRlcGVuZCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBkZXBlbmRBcnJheShlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogT3B0aW9uIG92ZXJ3cml0aW5nIHN0cmF0ZWdpZXMgYXJlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZVxuICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb25cbiAqIHZhbHVlIGludG8gdGhlIGZpbmFsIHZhbHVlLlxuICovXG52YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztcblxuLyoqXG4gKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zXG4gKi9cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHN0cmF0cy5lbCA9IHN0cmF0cy5wcm9wc0RhdGEgPSBmdW5jdGlvbiAocGFyZW50LCBjaGlsZCwgdm0sIGtleSkge1xuICAgIGlmICghdm0pIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwib3B0aW9uIFxcXCJcIiArIGtleSArIFwiXFxcIiBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBpbnN0YW5jZSBcIiArXG4gICAgICAgICdjcmVhdGlvbiB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0U3RyYXQocGFyZW50LCBjaGlsZClcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhICh0bywgZnJvbSkge1xuICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH1cbiAgdmFyIGtleSwgdG9WYWwsIGZyb21WYWw7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJvbSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgdG9WYWwgPSB0b1trZXldO1xuICAgIGZyb21WYWwgPSBmcm9tW2tleV07XG4gICAgaWYgKCFoYXNPd24odG8sIGtleSkpIHtcbiAgICAgIHNldCh0bywga2V5LCBmcm9tVmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHtcbiAgICAgIG1lcmdlRGF0YSh0b1ZhbCwgZnJvbVZhbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIERhdGFcbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhT3JGbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIC8vIGluIGEgVnVlLmV4dGVuZCBtZXJnZSwgYm90aCBzaG91bGQgYmUgZnVuY3Rpb25zXG4gICAgaWYgKCFjaGlsZFZhbCkge1xuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICBpZiAoIXBhcmVudFZhbCkge1xuICAgICAgcmV0dXJuIGNoaWxkVmFsXG4gICAgfVxuICAgIC8vIHdoZW4gcGFyZW50VmFsICYgY2hpbGRWYWwgYXJlIGJvdGggcHJlc2VudCxcbiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgICAvLyBtZXJnZWQgcmVzdWx0IG9mIGJvdGggZnVuY3Rpb25zLi4uIG5vIG5lZWQgdG9cbiAgICAvLyBjaGVjayBpZiBwYXJlbnRWYWwgaXMgYSBmdW5jdGlvbiBoZXJlIGJlY2F1c2VcbiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkRGF0YUZuICgpIHtcbiAgICAgIHJldHVybiBtZXJnZURhdGEoXG4gICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcykgOiBjaGlsZFZhbCxcbiAgICAgICAgdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcmVudFZhbC5jYWxsKHRoaXMpIDogcGFyZW50VmFsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhcmVudFZhbCB8fCBjaGlsZFZhbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRJbnN0YW5jZURhdGFGbiAoKSB7XG4gICAgICAvLyBpbnN0YW5jZSBtZXJnZVxuICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGNoaWxkVmFsLmNhbGwodm0pXG4gICAgICAgIDogY2hpbGRWYWw7XG4gICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gcGFyZW50VmFsLmNhbGwodm0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGluc3RhbmNlRGF0YSkge1xuICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmYXVsdERhdGFcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuc3RyYXRzLmRhdGEgPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIGlmIChjaGlsZFZhbCAmJiB0eXBlb2YgY2hpbGRWYWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ1RoZSBcImRhdGFcIiBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gJyArXG4gICAgICAgICd0aGF0IHJldHVybnMgYSBwZXItaW5zdGFuY2UgdmFsdWUgaW4gY29tcG9uZW50ICcgK1xuICAgICAgICAnZGVmaW5pdGlvbnMuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBwYXJlbnRWYWxcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4uY2FsbCh0aGlzLCBwYXJlbnRWYWwsIGNoaWxkVmFsKVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCwgdm0pXG59O1xuXG4vKipcbiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VIb29rIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbFxuKSB7XG4gIHJldHVybiBjaGlsZFZhbFxuICAgID8gcGFyZW50VmFsXG4gICAgICA/IHBhcmVudFZhbC5jb25jYXQoY2hpbGRWYWwpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpXG4gICAgICAgID8gY2hpbGRWYWxcbiAgICAgICAgOiBbY2hpbGRWYWxdXG4gICAgOiBwYXJlbnRWYWxcbn1cblxuTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgc3RyYXRzW2hvb2tdID0gbWVyZ2VIb29rO1xufSk7XG5cbi8qKlxuICogQXNzZXRzXG4gKlxuICogV2hlbiBhIHZtIGlzIHByZXNlbnQgKGluc3RhbmNlIGNyZWF0aW9uKSwgd2UgbmVlZCB0byBkb1xuICogYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiBjb25zdHJ1Y3RvciBvcHRpb25zLCBpbnN0YW5jZVxuICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQXNzZXRzIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG4gIHZhciByZXMgPSBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKTtcbiAgcmV0dXJuIGNoaWxkVmFsXG4gICAgPyBleHRlbmQocmVzLCBjaGlsZFZhbClcbiAgICA6IHJlc1xufVxuXG5BU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gIHN0cmF0c1t0eXBlICsgJ3MnXSA9IG1lcmdlQXNzZXRzO1xufSk7XG5cbi8qKlxuICogV2F0Y2hlcnMuXG4gKlxuICogV2F0Y2hlcnMgaGFzaGVzIHNob3VsZCBub3Qgb3ZlcndyaXRlIG9uZVxuICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuXG4gKi9cbnN0cmF0cy53YXRjaCA9IGZ1bmN0aW9uIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG4gIC8vIHdvcmsgYXJvdW5kIEZpcmVmb3gncyBPYmplY3QucHJvdG90eXBlLndhdGNoLi4uXG4gIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfVxuICBpZiAoY2hpbGRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IGNoaWxkVmFsID0gdW5kZWZpbmVkOyB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSB7fTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgZm9yICh2YXIga2V5IGluIGNoaWxkVmFsKSB7XG4gICAgdmFyIHBhcmVudCA9IHJldFtrZXldO1xuICAgIHZhciBjaGlsZCA9IGNoaWxkVmFsW2tleV07XG4gICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnQgPSBbcGFyZW50XTtcbiAgICB9XG4gICAgcmV0W2tleV0gPSBwYXJlbnRcbiAgICAgID8gcGFyZW50LmNvbmNhdChjaGlsZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07XG4gIH1cbiAgcmV0dXJuIHJldFxufTtcblxuLyoqXG4gKiBPdGhlciBvYmplY3QgaGFzaGVzLlxuICovXG5zdHJhdHMucHJvcHMgPVxuc3RyYXRzLm1ldGhvZHMgPVxuc3RyYXRzLmluamVjdCA9XG5zdHJhdHMuY29tcHV0ZWQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICBpZiAoIXBhcmVudFZhbCkgeyByZXR1cm4gY2hpbGRWYWwgfVxuICB2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgaWYgKGNoaWxkVmFsKSB7IGV4dGVuZChyZXQsIGNoaWxkVmFsKTsgfVxuICByZXR1cm4gcmV0XG59O1xuc3RyYXRzLnByb3ZpZGUgPSBtZXJnZURhdGFPckZuO1xuXG4vKipcbiAqIERlZmF1bHQgc3RyYXRlZ3kuXG4gKi9cbnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICByZXR1cm4gY2hpbGRWYWwgPT09IHVuZGVmaW5lZFxuICAgID8gcGFyZW50VmFsXG4gICAgOiBjaGlsZFZhbFxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBjb21wb25lbnQgbmFtZXNcbiAqL1xuZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zLmNvbXBvbmVudHMpIHtcbiAgICB2YXIgbG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoaXNCdWlsdEluVGFnKGxvd2VyKSB8fCBjb25maWcuaXNSZXNlcnZlZFRhZyhsb3dlcikpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgICAnaWQ6ICcgKyBrZXlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIGFsbCBwcm9wcyBvcHRpb24gc3ludGF4IGFyZSBub3JtYWxpemVkIGludG8gdGhlXG4gKiBPYmplY3QtYmFzZWQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQcm9wcyAob3B0aW9ucykge1xuICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoIXByb3BzKSB7IHJldHVybiB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGksIHZhbCwgbmFtZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YWwgPSBwcm9wc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTtcbiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigncHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgIG5hbWUgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpXG4gICAgICAgID8gdmFsXG4gICAgICAgIDogeyB0eXBlOiB2YWwgfTtcbiAgICB9XG4gIH1cbiAgb3B0aW9ucy5wcm9wcyA9IHJlcztcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYWxsIGluamVjdGlvbnMgaW50byBPYmplY3QtYmFzZWQgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucykge1xuICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7XG4gIGlmIChBcnJheS5pc0FycmF5KGluamVjdCkpIHtcbiAgICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRbaW5qZWN0W2ldXSA9IGluamVjdFtpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGZ1bmN0aW9uIGRpcmVjdGl2ZXMgaW50byBvYmplY3QgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7XG4gIHZhciBkaXJzID0gb3B0aW9ucy5kaXJlY3RpdmVzO1xuICBpZiAoZGlycykge1xuICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7XG4gICAgICB2YXIgZGVmID0gZGlyc1trZXldO1xuICAgICAgaWYgKHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLlxuICogQ29yZSB1dGlsaXR5IHVzZWQgaW4gYm90aCBpbnN0YW50aWF0aW9uIGFuZCBpbmhlcml0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPcHRpb25zIChcbiAgcGFyZW50LFxuICBjaGlsZCxcbiAgdm1cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNoZWNrQ29tcG9uZW50cyhjaGlsZCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hpbGQgPSBjaGlsZC5vcHRpb25zO1xuICB9XG5cbiAgbm9ybWFsaXplUHJvcHMoY2hpbGQpO1xuICBub3JtYWxpemVJbmplY3QoY2hpbGQpO1xuICBub3JtYWxpemVEaXJlY3RpdmVzKGNoaWxkKTtcbiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kcztcbiAgaWYgKGV4dGVuZHNGcm9tKSB7XG4gICAgcGFyZW50ID0gbWVyZ2VPcHRpb25zKHBhcmVudCwgZXh0ZW5kc0Zyb20sIHZtKTtcbiAgfVxuICBpZiAoY2hpbGQubWl4aW5zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZC5taXhpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTtcbiAgICB9XG4gIH1cbiAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gcGFyZW50KSB7XG4gICAgbWVyZ2VGaWVsZChrZXkpO1xuICB9XG4gIGZvciAoa2V5IGluIGNoaWxkKSB7XG4gICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7XG4gICAgICBtZXJnZUZpZWxkKGtleSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG1lcmdlRmllbGQgKGtleSkge1xuICAgIHZhciBzdHJhdCA9IHN0cmF0c1trZXldIHx8IGRlZmF1bHRTdHJhdDtcbiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGFzc2V0LlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJlY2F1c2UgY2hpbGQgaW5zdGFuY2VzIG5lZWQgYWNjZXNzXG4gKiB0byBhc3NldHMgZGVmaW5lZCBpbiBpdHMgYW5jZXN0b3IgY2hhaW4uXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBc3NldCAoXG4gIG9wdGlvbnMsXG4gIHR5cGUsXG4gIGlkLFxuICB3YXJuTWlzc2luZ1xuKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBhc3NldHMgPSBvcHRpb25zW3R5cGVdO1xuICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdFxuICBpZiAoaGFzT3duKGFzc2V0cywgaWQpKSB7IHJldHVybiBhc3NldHNbaWRdIH1cbiAgdmFyIGNhbWVsaXplZElkID0gY2FtZWxpemUoaWQpO1xuICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH1cbiAgdmFyIFBhc2NhbENhc2VJZCA9IGNhcGl0YWxpemUoY2FtZWxpemVkSWQpO1xuICBpZiAoaGFzT3duKGFzc2V0cywgUGFzY2FsQ2FzZUlkKSkgeyByZXR1cm4gYXNzZXRzW1Bhc2NhbENhc2VJZF0gfVxuICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW5cbiAgdmFyIHJlcyA9IGFzc2V0c1tpZF0gfHwgYXNzZXRzW2NhbWVsaXplZElkXSB8fCBhc3NldHNbUGFzY2FsQ2FzZUlkXTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykge1xuICAgIHdhcm4oXG4gICAgICAnRmFpbGVkIHRvIHJlc29sdmUgJyArIHR5cGUuc2xpY2UoMCwgLTEpICsgJzogJyArIGlkLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wIChcbiAga2V5LFxuICBwcm9wT3B0aW9ucyxcbiAgcHJvcHNEYXRhLFxuICB2bVxuKSB7XG4gIHZhciBwcm9wID0gcHJvcE9wdGlvbnNba2V5XTtcbiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpO1xuICB2YXIgdmFsdWUgPSBwcm9wc0RhdGFba2V5XTtcbiAgLy8gaGFuZGxlIGJvb2xlYW4gcHJvcHNcbiAgaWYgKGlzVHlwZShCb29sZWFuLCBwcm9wLnR5cGUpKSB7XG4gICAgaWYgKGFic2VudCAmJiAhaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghaXNUeXBlKFN0cmluZywgcHJvcC50eXBlKSAmJiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkpIHtcbiAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgLy8gY2hlY2sgZGVmYXVsdCB2YWx1ZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gZ2V0UHJvcERlZmF1bHRWYWx1ZSh2bSwgcHJvcCwga2V5KTtcbiAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhIGZyZXNoIGNvcHksXG4gICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuXG4gICAgdmFyIHByZXZTaG91bGRDb252ZXJ0ID0gb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0O1xuICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IHRydWU7XG4gICAgb2JzZXJ2ZSh2YWx1ZSk7XG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gcHJldlNob3VsZENvbnZlcnQ7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3BEZWZhdWx0VmFsdWUgKHZtLCBwcm9wLCBrZXkpIHtcbiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAoIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIHZhciBkZWYgPSBwcm9wLmRlZmF1bHQ7XG4gIC8vIHdhcm4gYWdhaW5zdCBub24tZmFjdG9yeSBkZWZhdWx0cyBmb3IgT2JqZWN0ICYgQXJyYXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNPYmplY3QoZGVmKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wIFwiJyArIGtleSArICdcIjogJyArXG4gICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArXG4gICAgICAndG8gcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLicsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbiAgLy8gdGhlIHJhdyBwcm9wIHZhbHVlIHdhcyBhbHNvIHVuZGVmaW5lZCBmcm9tIHByZXZpb3VzIHJlbmRlcixcbiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyXG4gIGlmICh2bSAmJiB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgJiZcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGFba2V5XSA9PT0gdW5kZWZpbmVkICYmXG4gICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm4gdm0uX3Byb3BzW2tleV1cbiAgfVxuICAvLyBjYWxsIGZhY3RvcnkgZnVuY3Rpb24gZm9yIG5vbi1GdW5jdGlvbiB0eXBlc1xuICAvLyBhIHZhbHVlIGlzIEZ1bmN0aW9uIGlmIGl0cyBwcm90b3R5cGUgaXMgZnVuY3Rpb24gZXZlbiBhY3Jvc3MgZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJ1xuICAgID8gZGVmLmNhbGwodm0pXG4gICAgOiBkZWZcbn1cblxuLyoqXG4gKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFByb3AgKFxuICBwcm9wLFxuICBuYW1lLFxuICB2YWx1ZSxcbiAgdm0sXG4gIGFic2VudFxuKSB7XG4gIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkge1xuICAgIHdhcm4oXG4gICAgICAnTWlzc2luZyByZXF1aXJlZCBwcm9wOiBcIicgKyBuYW1lICsgJ1wiJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICB2YXIgdmFsaWQgPSAhdHlwZSB8fCB0eXBlID09PSB0cnVlO1xuICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICBpZiAodHlwZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZSA9IFt0eXBlXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aCAmJiAhdmFsaWQ7IGkrKykge1xuICAgICAgdmFyIGFzc2VydGVkVHlwZSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpO1xuICAgICAgdmFsaWQgPSBhc3NlcnRlZFR5cGUudmFsaWQ7XG4gICAgfVxuICB9XG4gIGlmICghdmFsaWQpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCInICsgbmFtZSArICdcIi4nICtcbiAgICAgICcgRXhwZWN0ZWQgJyArIGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykgK1xuICAgICAgJywgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSArICcuJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgdmFsaWRhdG9yID0gcHJvcC52YWxpZGF0b3I7XG4gIGlmICh2YWxpZGF0b3IpIHtcbiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJyArIG5hbWUgKyAnXCIuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbnZhciBzaW1wbGVDaGVja1JFID0gL14oU3RyaW5nfE51bWJlcnxCb29sZWFufEZ1bmN0aW9ufFN5bWJvbCkkLztcblxuZnVuY3Rpb24gYXNzZXJ0VHlwZSAodmFsdWUsIHR5cGUpIHtcbiAgdmFyIHZhbGlkO1xuICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgaWYgKHNpbXBsZUNoZWNrUkUudGVzdChleHBlY3RlZFR5cGUpKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgdmFsdWUgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICB2YWxpZCA9IGlzUGxhaW5PYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogdmFsaWQsXG4gICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGVcbiAgfVxufVxuXG4vKipcbiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcyxcbiAqIGJlY2F1c2UgYSBzaW1wbGUgZXF1YWxpdHkgY2hlY2sgd2lsbCBmYWlsIHdoZW4gcnVubmluZ1xuICogYWNyb3NzIGRpZmZlcmVudCB2bXMgLyBpZnJhbWVzLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlIChmbikge1xuICB2YXIgbWF0Y2ggPSBmbiAmJiBmbi50b1N0cmluZygpLm1hdGNoKC9eXFxzKmZ1bmN0aW9uIChcXHcrKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnXG59XG5cbmZ1bmN0aW9uIGlzVHlwZSAodHlwZSwgZm4pIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGZuKSkge1xuICAgIHJldHVybiBnZXRUeXBlKGZuKSA9PT0gZ2V0VHlwZSh0eXBlKVxuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBmbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChnZXRUeXBlKGZuW2ldKSA9PT0gZ2V0VHlwZSh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qICAqL1xuXG4vKiBub3QgdHlwZSBjaGVja2luZyB0aGlzIGZpbGUgYmVjYXVzZSBmbG93IGRvZXNuJ3QgcGxheSB3ZWxsIHdpdGggUHJveHkgKi9cblxudmFyIGluaXRQcm94eTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGFsbG93ZWRHbG9iYWxzID0gbWFrZU1hcChcbiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICtcbiAgICAncGFyc2VGbG9hdCxwYXJzZUludCxkZWNvZGVVUkksZGVjb2RlVVJJQ29tcG9uZW50LGVuY29kZVVSSSxlbmNvZGVVUklDb21wb25lbnQsJyArXG4gICAgJ01hdGgsTnVtYmVyLERhdGUsQXJyYXksT2JqZWN0LEJvb2xlYW4sU3RyaW5nLFJlZ0V4cCxNYXAsU2V0LEpTT04sSW50bCwnICtcbiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeVxuICApO1xuXG4gIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHdhcm4oXG4gICAgICBcIlByb3BlcnR5IG9yIG1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCBcIiArXG4gICAgICBcInJlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRvIGRlY2xhcmUgcmVhY3RpdmUgZGF0YSBcIiArXG4gICAgICBcInByb3BlcnRpZXMgaW4gdGhlIGRhdGEgb3B0aW9uLlwiLFxuICAgICAgdGFyZ2V0XG4gICAgKTtcbiAgfTtcblxuICB2YXIgaGFzUHJveHkgPVxuICAgIHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBQcm94eS50b1N0cmluZygpLm1hdGNoKC9uYXRpdmUgY29kZS8pO1xuXG4gIGlmIChoYXNQcm94eSkge1xuICAgIHZhciBpc0J1aWx0SW5Nb2RpZmllciA9IG1ha2VNYXAoJ3N0b3AscHJldmVudCxzZWxmLGN0cmwsc2hpZnQsYWx0LG1ldGEnKTtcbiAgICBjb25maWcua2V5Q29kZXMgPSBuZXcgUHJveHkoY29uZmlnLmtleUNvZGVzLCB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0J1aWx0SW5Nb2RpZmllcihrZXkpKSB7XG4gICAgICAgICAgd2FybigoXCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC5cIiArIGtleSkpO1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIGhhc0hhbmRsZXIgPSB7XG4gICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7XG4gICAgICB2YXIgaGFzID0ga2V5IGluIHRhcmdldDtcbiAgICAgIHZhciBpc0FsbG93ZWQgPSBhbGxvd2VkR2xvYmFscyhrZXkpIHx8IGtleS5jaGFyQXQoMCkgPT09ICdfJztcbiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHtcbiAgICAgICAgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkXG4gICAgfVxuICB9O1xuXG4gIHZhciBnZXRIYW5kbGVyID0ge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICh0YXJnZXQsIGtleSkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHtcbiAgICAgICAgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgfVxuICB9O1xuXG4gIGluaXRQcm94eSA9IGZ1bmN0aW9uIGluaXRQcm94eSAodm0pIHtcbiAgICBpZiAoaGFzUHJveHkpIHtcbiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZVxuICAgICAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcbiAgICAgIHZhciBoYW5kbGVycyA9IG9wdGlvbnMucmVuZGVyICYmIG9wdGlvbnMucmVuZGVyLl93aXRoU3RyaXBwZWRcbiAgICAgICAgPyBnZXRIYW5kbGVyXG4gICAgICAgIDogaGFzSGFuZGxlcjtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IG5ldyBQcm94eSh2bSwgaGFuZGxlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBtYXJrO1xudmFyIG1lYXN1cmU7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChcbiAgICBwZXJmICYmXG4gICAgcGVyZi5tYXJrICYmXG4gICAgcGVyZi5tZWFzdXJlICYmXG4gICAgcGVyZi5jbGVhck1hcmtzICYmXG4gICAgcGVyZi5jbGVhck1lYXN1cmVzXG4gICkge1xuICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTtcbiAgICBtZWFzdXJlID0gZnVuY3Rpb24gKG5hbWUsIHN0YXJ0VGFnLCBlbmRUYWcpIHtcbiAgICAgIHBlcmYubWVhc3VyZShuYW1lLCBzdGFydFRhZywgZW5kVGFnKTtcbiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7XG4gICAgICBwZXJmLmNsZWFyTWFya3MoZW5kVGFnKTtcbiAgICAgIHBlcmYuY2xlYXJNZWFzdXJlcyhuYW1lKTtcbiAgICB9O1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgVk5vZGUgPSBmdW5jdGlvbiBWTm9kZSAoXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIHRleHQsXG4gIGVsbSxcbiAgY29udGV4dCxcbiAgY29tcG9uZW50T3B0aW9ucyxcbiAgYXN5bmNGYWN0b3J5XG4pIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgdGhpcy5lbG0gPSBlbG07XG4gIHRoaXMubnMgPSB1bmRlZmluZWQ7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuZnVuY3Rpb25hbENvbnRleHQgPSB1bmRlZmluZWQ7XG4gIHRoaXMua2V5ID0gZGF0YSAmJiBkYXRhLmtleTtcbiAgdGhpcy5jb21wb25lbnRPcHRpb25zID0gY29tcG9uZW50T3B0aW9ucztcbiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gIHRoaXMucmF3ID0gZmFsc2U7XG4gIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTtcbiAgdGhpcy5pc1Jvb3RJbnNlcnQgPSB0cnVlO1xuICB0aGlzLmlzQ29tbWVudCA9IGZhbHNlO1xuICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7XG4gIHRoaXMuaXNPbmNlID0gZmFsc2U7XG4gIHRoaXMuYXN5bmNGYWN0b3J5ID0gYXN5bmNGYWN0b3J5O1xuICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXIgPSBmYWxzZTtcbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGNoaWxkOiB7fSB9O1xuXG4vLyBERVBSRUNBVEVEOiBhbGlhcyBmb3IgY29tcG9uZW50SW5zdGFuY2UgZm9yIGJhY2t3YXJkcyBjb21wYXQuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2Vcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWTm9kZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIGlmICggdGV4dCA9PT0gdm9pZCAwICkgdGV4dCA9ICcnO1xuXG4gIHZhciBub2RlID0gbmV3IFZOb2RlKCk7XG4gIG5vZGUudGV4dCA9IHRleHQ7XG4gIG5vZGUuaXNDb21tZW50ID0gdHJ1ZTtcbiAgcmV0dXJuIG5vZGVcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7XG4gIHJldHVybiBuZXcgVk5vZGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgU3RyaW5nKHZhbCkpXG59XG5cbi8vIG9wdGltaXplZCBzaGFsbG93IGNsb25lXG4vLyB1c2VkIGZvciBzdGF0aWMgbm9kZXMgYW5kIHNsb3Qgbm9kZXMgYmVjYXVzZSB0aGV5IG1heSBiZSByZXVzZWQgYWNyb3NzXG4vLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHlcbi8vIG9uIHRoZWlyIGVsbSByZWZlcmVuY2UuXG5mdW5jdGlvbiBjbG9uZVZOb2RlICh2bm9kZSkge1xuICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKFxuICAgIHZub2RlLnRhZyxcbiAgICB2bm9kZS5kYXRhLFxuICAgIHZub2RlLmNoaWxkcmVuLFxuICAgIHZub2RlLnRleHQsXG4gICAgdm5vZGUuZWxtLFxuICAgIHZub2RlLmNvbnRleHQsXG4gICAgdm5vZGUuY29tcG9uZW50T3B0aW9ucyxcbiAgICB2bm9kZS5hc3luY0ZhY3RvcnlcbiAgKTtcbiAgY2xvbmVkLm5zID0gdm5vZGUubnM7XG4gIGNsb25lZC5pc1N0YXRpYyA9IHZub2RlLmlzU3RhdGljO1xuICBjbG9uZWQua2V5ID0gdm5vZGUua2V5O1xuICBjbG9uZWQuaXNDb21tZW50ID0gdm5vZGUuaXNDb21tZW50O1xuICBjbG9uZWQuaXNDbG9uZWQgPSB0cnVlO1xuICByZXR1cm4gY2xvbmVkXG59XG5cbmZ1bmN0aW9uIGNsb25lVk5vZGVzICh2bm9kZXMpIHtcbiAgdmFyIGxlbiA9IHZub2Rlcy5sZW5ndGg7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc1tpXSA9IGNsb25lVk5vZGUodm5vZGVzW2ldKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplRXZlbnQgPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHBhc3NpdmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyYnO1xuICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICB2YXIgb25jZSQkMSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3RcbiAgbmFtZSA9IG9uY2UkJDEgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnO1xuICBuYW1lID0gY2FwdHVyZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgb25jZTogb25jZSQkMSxcbiAgICBjYXB0dXJlOiBjYXB0dXJlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZuSW52b2tlciAoZm5zKSB7XG4gIGZ1bmN0aW9uIGludm9rZXIgKCkge1xuICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgIHZhciBmbnMgPSBpbnZva2VyLmZucztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7XG4gICAgICB2YXIgY2xvbmVkID0gZm5zLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVyc1xuICAgICAgcmV0dXJuIGZucy5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgfVxuICB9XG4gIGludm9rZXIuZm5zID0gZm5zO1xuICByZXR1cm4gaW52b2tlclxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaXN0ZW5lcnMgKFxuICBvbixcbiAgb2xkT24sXG4gIGFkZCxcbiAgcmVtb3ZlJCQxLFxuICB2bVxuKSB7XG4gIHZhciBuYW1lLCBjdXIsIG9sZCwgZXZlbnQ7XG4gIGZvciAobmFtZSBpbiBvbikge1xuICAgIGN1ciA9IG9uW25hbWVdO1xuICAgIG9sZCA9IG9sZE9uW25hbWVdO1xuICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgaWYgKGlzVW5kZWYoY3VyKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkludmFsaWQgaGFuZGxlciBmb3IgZXZlbnQgXFxcIlwiICsgKGV2ZW50Lm5hbWUpICsgXCJcXFwiOiBnb3QgXCIgKyBTdHJpbmcoY3VyKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHtcbiAgICAgIGlmIChpc1VuZGVmKGN1ci5mbnMpKSB7XG4gICAgICAgIGN1ciA9IG9uW25hbWVdID0gY3JlYXRlRm5JbnZva2VyKGN1cik7XG4gICAgICB9XG4gICAgICBhZGQoZXZlbnQubmFtZSwgY3VyLCBldmVudC5vbmNlLCBldmVudC5jYXB0dXJlLCBldmVudC5wYXNzaXZlKTtcbiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7XG4gICAgICBvbGQuZm5zID0gY3VyO1xuICAgICAgb25bbmFtZV0gPSBvbGQ7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBvbGRPbikge1xuICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkge1xuICAgICAgZXZlbnQgPSBub3JtYWxpemVFdmVudChuYW1lKTtcbiAgICAgIHJlbW92ZSQkMShldmVudC5uYW1lLCBvbGRPbltuYW1lXSwgZXZlbnQuY2FwdHVyZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7XG4gIHZhciBpbnZva2VyO1xuICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTtcblxuICBmdW5jdGlvbiB3cmFwcGVkSG9vayAoKSB7XG4gICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIC8vIGltcG9ydGFudDogcmVtb3ZlIG1lcmdlZCBob29rIHRvIGVuc3VyZSBpdCdzIGNhbGxlZCBvbmx5IG9uY2VcbiAgICAvLyBhbmQgcHJldmVudCBtZW1vcnkgbGVha1xuICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spO1xuICB9XG5cbiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHtcbiAgICAvLyBubyBleGlzdGluZyBob29rXG4gICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbd3JhcHBlZEhvb2tdKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNEZWYob2xkSG9vay5mbnMpICYmIGlzVHJ1ZShvbGRIb29rLm1lcmdlZCkpIHtcbiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlclxuICAgICAgaW52b2tlciA9IG9sZEhvb2s7XG4gICAgICBpbnZva2VyLmZucy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXhpc3RpbmcgcGxhaW4gaG9va1xuICAgICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbb2xkSG9vaywgd3JhcHBlZEhvb2tdKTtcbiAgICB9XG4gIH1cblxuICBpbnZva2VyLm1lcmdlZCA9IHRydWU7XG4gIGRlZltob29rS2V5XSA9IGludm9rZXI7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhIChcbiAgZGF0YSxcbiAgQ3RvcixcbiAgdGFnXG4pIHtcbiAgLy8gd2UgYXJlIG9ubHkgZXh0cmFjdGluZyByYXcgdmFsdWVzIGhlcmUuXG4gIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZFxuICAvLyBjb21wb25lbnQgaXRzZWxmLlxuICB2YXIgcHJvcE9wdGlvbnMgPSBDdG9yLm9wdGlvbnMucHJvcHM7XG4gIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGF0dHJzID0gZGF0YS5hdHRycztcbiAgdmFyIHByb3BzID0gZGF0YS5wcm9wcztcbiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHZhciBhbHRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBrZXlJbkxvd2VyQ2FzZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ICE9PSBrZXlJbkxvd2VyQ2FzZSAmJlxuICAgICAgICAgIGF0dHJzICYmIGhhc093bihhdHRycywga2V5SW5Mb3dlckNhc2UpXG4gICAgICAgICkge1xuICAgICAgICAgIHRpcChcbiAgICAgICAgICAgIFwiUHJvcCBcXFwiXCIgKyBrZXlJbkxvd2VyQ2FzZSArIFwiXFxcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHRhZyB8fCBDdG9yKSkgKyBcIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXNcIiArXG4gICAgICAgICAgICBcIiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICAgIFwiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCBcIiArXG4gICAgICAgICAgICBcInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gXCIgK1xuICAgICAgICAgICAgXCJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFxcXCJcIiArIGFsdEtleSArIFwiXFxcIiBpbnN0ZWFkIG9mIFxcXCJcIiArIGtleSArIFwiXFxcIi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcCAoXG4gIHJlcyxcbiAgaGFzaCxcbiAga2V5LFxuICBhbHRLZXksXG4gIHByZXNlcnZlXG4pIHtcbiAgaWYgKGlzRGVmKGhhc2gpKSB7XG4gICAgaWYgKGhhc093bihoYXNoLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGhhc2hba2V5XTtcbiAgICAgIGlmICghcHJlc2VydmUpIHtcbiAgICAgICAgZGVsZXRlIGhhc2hba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChoYXNPd24oaGFzaCwgYWx0S2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2FsdEtleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogICovXG5cbi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieVxuLy8gc3RhdGljYWxseSBhbmFseXppbmcgdGhlIHRlbXBsYXRlIGF0IGNvbXBpbGUgdGltZS5cbi8vXG4vLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZVxuLy8gZ2VuZXJhdGVkIHJlbmRlciBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBBcnJheTxWTm9kZT4uIFRoZXJlIGFyZVxuLy8gdHdvIGNhc2VzIHdoZXJlIGV4dHJhIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkOlxuXG4vLyAxLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb21wb25lbnRzIC0gYmVjYXVzZSBhIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4vLyBtYXkgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBqdXN0IGEgc2ltcGxlXG4vLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGVcbi8vIHRoaW5nIHdpdGggQXJyYXkucHJvdG90eXBlLmNvbmNhdC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmx5IDEtbGV2ZWwgZGVlcFxuLy8gYmVjYXVzZSBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYWxyZWFkeSBub3JtYWxpemUgdGhlaXIgb3duIGNoaWxkcmVuLlxuZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbltpXSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsXG4vLyBlLmcuIDx0ZW1wbGF0ZT4sIDxzbG90Piwgdi1mb3IsIG9yIHdoZW4gdGhlIGNoaWxkcmVuIGlzIHByb3ZpZGVkIGJ5IHVzZXJcbi8vIHdpdGggaGFuZC13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMgLyBKU1guIEluIHN1Y2ggY2FzZXMgYSBmdWxsIG5vcm1hbGl6YXRpb25cbi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIHJldHVybiBpc1ByaW1pdGl2ZShjaGlsZHJlbilcbiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXVxuICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgID8gbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjaGlsZHJlbilcbiAgICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHtcbiAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlDaGlsZHJlbiAoY2hpbGRyZW4sIG5lc3RlZEluZGV4KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGksIGMsIGxhc3Q7XG4gIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGMgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoaXNVbmRlZihjKSB8fCB0eXBlb2YgYyA9PT0gJ2Jvb2xlYW4nKSB7IGNvbnRpbnVlIH1cbiAgICBsYXN0ID0gcmVzW3Jlcy5sZW5ndGggLSAxXTtcbiAgICAvLyAgbmVzdGVkXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjLCAoKG5lc3RlZEluZGV4IHx8ICcnKSArIFwiX1wiICsgaSkpKTtcbiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKGMpKSB7XG4gICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBTU1IgaHlkcmF0aW9uIGJlY2F1c2UgdGV4dCBub2RlcyBhcmVcbiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzXG4gICAgICAgIChsYXN0KS50ZXh0ICs9IFN0cmluZyhjKTtcbiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHtcbiAgICAgICAgLy8gY29udmVydCBwcmltaXRpdmUgdG8gdm5vZGVcbiAgICAgICAgcmVzLnB1c2goY3JlYXRlVGV4dFZOb2RlKGMpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzVGV4dE5vZGUoYykgJiYgaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIHJlc1tyZXMubGVuZ3RoIC0gMV0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlZmF1bHQga2V5IGZvciBuZXN0ZWQgYXJyYXkgY2hpbGRyZW4gKGxpa2VseSBnZW5lcmF0ZWQgYnkgdi1mb3IpXG4gICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmXG4gICAgICAgICAgaXNEZWYoYy50YWcpICYmXG4gICAgICAgICAgaXNVbmRlZihjLmtleSkgJiZcbiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHtcbiAgICAgICAgICBjLmtleSA9IFwiX192bGlzdFwiICsgbmVzdGVkSW5kZXggKyBcIl9cIiArIGkgKyBcIl9fXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHtcbiAgaWYgKGNvbXAuX19lc01vZHVsZSAmJiBjb21wLmRlZmF1bHQpIHtcbiAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICB9XG4gIHJldHVybiBpc09iamVjdChjb21wKVxuICAgID8gYmFzZS5leHRlbmQoY29tcClcbiAgICA6IGNvbXBcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXN5bmNQbGFjZWhvbGRlciAoXG4gIGZhY3RvcnksXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTtcbiAgbm9kZS5hc3luY0ZhY3RvcnkgPSBmYWN0b3J5O1xuICBub2RlLmFzeW5jTWV0YSA9IHsgZGF0YTogZGF0YSwgY29udGV4dDogY29udGV4dCwgY2hpbGRyZW46IGNoaWxkcmVuLCB0YWc6IHRhZyB9O1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKFxuICBmYWN0b3J5LFxuICBiYXNlQ3RvcixcbiAgY29udGV4dFxuKSB7XG4gIGlmIChpc1RydWUoZmFjdG9yeS5lcnJvcikgJiYgaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7XG4gICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wXG4gIH1cblxuICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5yZXNvbHZlZFxuICB9XG5cbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmxvYWRpbmcpICYmIGlzRGVmKGZhY3RvcnkubG9hZGluZ0NvbXApKSB7XG4gICAgcmV0dXJuIGZhY3RvcnkubG9hZGluZ0NvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LmNvbnRleHRzKSkge1xuICAgIC8vIGFscmVhZHkgcGVuZGluZ1xuICAgIGZhY3RvcnkuY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcblxuICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY29udGV4dHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnRleHRzW2ldLiRmb3JjZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykge1xuICAgICAgLy8gY2FjaGUgcmVzb2x2ZWRcbiAgICAgIGZhY3RvcnkucmVzb2x2ZWQgPSBlbnN1cmVDdG9yKHJlcywgYmFzZUN0b3IpO1xuICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZVxuICAgICAgLy8gKGFzeW5jIHJlc29sdmVzIGFyZSBzaGltbWVkIGFzIHN5bmNocm9ub3VzIGR1cmluZyBTU1IpXG4gICAgICBpZiAoIXN5bmMpIHtcbiAgICAgICAgZm9yY2VSZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciByZWplY3QgPSBvbmNlKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQ6IFwiICsgKFN0cmluZyhmYWN0b3J5KSkgK1xuICAgICAgICAocmVhc29uID8gKFwiXFxuUmVhc29uOiBcIiArIHJlYXNvbikgOiAnJylcbiAgICAgICk7XG4gICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7XG4gICAgICAgIGZhY3RvcnkuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmb3JjZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vICgpID0+IFByb21pc2VcbiAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKHJlcy5jb21wb25lbnQpICYmIHR5cGVvZiByZXMuY29tcG9uZW50LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5lcnJvcikpIHtcbiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7XG4gICAgICAgICAgZmFjdG9yeS5sb2FkaW5nQ29tcCA9IGVuc3VyZUN0b3IocmVzLmxvYWRpbmcsIGJhc2VDdG9yKTtcbiAgICAgICAgICBpZiAocmVzLmRlbGF5ID09PSAwKSB7XG4gICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkge1xuICAgICAgICAgICAgICAgIGZhY3RvcnkubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yY2VSZW5kZXIoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgICAgICAgICAgID8gKFwidGltZW91dCAoXCIgKyAocmVzLnRpbWVvdXQpICsgXCJtcylcIilcbiAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHJlcy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN5bmMgPSBmYWxzZTtcbiAgICAvLyByZXR1cm4gaW4gY2FzZSByZXNvbHZlZCBzeW5jaHJvbm91c2x5XG4gICAgcmV0dXJuIGZhY3RvcnkubG9hZGluZ1xuICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wXG4gICAgICA6IGZhY3RvcnkucmVzb2x2ZWRcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZCAoY2hpbGRyZW4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjKSAmJiBpc0RlZihjLmNvbXBvbmVudE9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBjXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEV2ZW50cyAodm0pIHtcbiAgdm0uX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTtcbiAgLy8gaW5pdCBwYXJlbnQgYXR0YWNoZWQgZXZlbnRzXG4gIHZhciBsaXN0ZW5lcnMgPSB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICBpZiAobGlzdGVuZXJzKSB7XG4gICAgdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzKHZtLCBsaXN0ZW5lcnMpO1xuICB9XG59XG5cbnZhciB0YXJnZXQ7XG5cbmZ1bmN0aW9uIGFkZCAoZXZlbnQsIGZuLCBvbmNlJCQxKSB7XG4gIGlmIChvbmNlJCQxKSB7XG4gICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LiRvbihldmVudCwgZm4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgdm0pO1xufVxuXG5mdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7XG4gIHZhciBob29rUkUgPSAvXmhvb2s6LztcbiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBldmVudC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcyQxLiRvbihldmVudFtpXSwgZm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTtcbiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgaGFzaCBsb29rdXBcbiAgICAgIGlmIChob29rUkUudGVzdChldmVudCkpIHtcbiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBmdW5jdGlvbiBvbiAoKSB7XG4gICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7XG4gICAgICBmbi5hcHBseSh2bSwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgb24uZm4gPSBmbjtcbiAgICB2bS4kb24oZXZlbnQsIG9uKTtcbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIC8vIGFsbFxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdm0uX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gYXJyYXkgb2YgZXZlbnRzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICBmb3IgKHZhciBpJDEgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpJDEgPCBsOyBpJDErKykge1xuICAgICAgICB0aGlzJDEuJG9mZihldmVudFtpJDFdLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIHNwZWNpZmljIGhhbmRsZXJcbiAgICB2YXIgY2I7XG4gICAgdmFyIGkgPSBjYnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNiID0gY2JzW2ldO1xuICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcbiAgICAgICAgY2JzLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7XG4gICAgICAgIHRpcChcbiAgICAgICAgICBcIkV2ZW50IFxcXCJcIiArIGxvd2VyQ2FzZUV2ZW50ICsgXCJcXFwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgXCIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiLiBcIiArXG4gICAgICAgICAgXCJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSBcIiArXG4gICAgICAgICAgXCJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gXCIgK1xuICAgICAgICAgIFwiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXFxcIlwiICsgKGh5cGhlbmF0ZShldmVudCkpICsgXCJcXFwiIGluc3RlYWQgb2YgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNicyA9IHZtLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmIChjYnMpIHtcbiAgICAgIGNicyA9IGNicy5sZW5ndGggPiAxID8gdG9BcnJheShjYnMpIDogY2JzO1xuICAgICAgdmFyIGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cywgMSk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYnNbaV0uYXBwbHkodm0sIGFyZ3MpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIChcImV2ZW50IGhhbmRsZXIgZm9yIFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNsb3RzIChcbiAgY2hpbGRyZW4sXG4gIGNvbnRleHRcbikge1xuICB2YXIgc2xvdHMgPSB7fTtcbiAgaWYgKCFjaGlsZHJlbikge1xuICAgIHJldHVybiBzbG90c1xuICB9XG4gIHZhciBkZWZhdWx0U2xvdCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZVxuICAgIC8vIHNhbWUgY29udGV4dC5cbiAgICBpZiAoKGNoaWxkLmNvbnRleHQgPT09IGNvbnRleHQgfHwgY2hpbGQuZnVuY3Rpb25hbENvbnRleHQgPT09IGNvbnRleHQpICYmXG4gICAgICBjaGlsZC5kYXRhICYmIGNoaWxkLmRhdGEuc2xvdCAhPSBudWxsXG4gICAgKSB7XG4gICAgICB2YXIgbmFtZSA9IGNoaWxkLmRhdGEuc2xvdDtcbiAgICAgIHZhciBzbG90ID0gKHNsb3RzW25hbWVdIHx8IChzbG90c1tuYW1lXSA9IFtdKSk7XG4gICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgIHNsb3QucHVzaC5hcHBseShzbG90LCBjaGlsZC5jaGlsZHJlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbG90LnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWZhdWx0U2xvdC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cbiAgLy8gaWdub3JlIHdoaXRlc3BhY2VcbiAgaWYgKCFkZWZhdWx0U2xvdC5ldmVyeShpc1doaXRlc3BhY2UpKSB7XG4gICAgc2xvdHMuZGVmYXVsdCA9IGRlZmF1bHRTbG90O1xuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuaXNDb21tZW50IHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzXG4pIHtcbiAgcmVzID0gcmVzIHx8IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZuc1tpXSkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1tmbnNbaV0ua2V5XSA9IGZuc1tpXS5mbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxudmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgfVxuICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7XG4gICAgdmFyIHByZXZWbm9kZSA9IHZtLl92bm9kZTtcbiAgICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSB2bTtcbiAgICB2bS5fdm5vZGUgPSB2bm9kZTtcbiAgICAvLyBWdWUucHJvdG90eXBlLl9fcGF0Y2hfXyBpcyBpbmplY3RlZCBpbiBlbnRyeSBwb2ludHNcbiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC5cbiAgICBpZiAoIXByZXZWbm9kZSkge1xuICAgICAgLy8gaW5pdGlhbCByZW5kZXJcbiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhcbiAgICAgICAgdm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovLFxuICAgICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtLFxuICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtXG4gICAgICApO1xuICAgICAgLy8gbm8gbmVlZCBmb3IgdGhlIHJlZiBub2RlcyBhZnRlciBpbml0aWFsIHBhdGNoXG4gICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKVxuICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSA9IHZtLiRvcHRpb25zLl9yZWZFbG0gPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1cGRhdGVzXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18ocHJldlZub2RlLCB2bm9kZSk7XG4gICAgfVxuICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlO1xuICAgIC8vIHVwZGF0ZSBfX3Z1ZV9fIHJlZmVyZW5jZVxuICAgIGlmIChwcmV2RWwpIHtcbiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHZtLiRlbCkge1xuICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTtcbiAgICB9XG4gICAgLy8gaWYgcGFyZW50IGlzIGFuIEhPQywgdXBkYXRlIGl0cyAkZWwgYXMgd2VsbFxuICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7XG4gICAgICB2bS4kcGFyZW50LiRlbCA9IHZtLiRlbDtcbiAgICB9XG4gICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZVxuICAgIC8vIHVwZGF0ZWQgaW4gYSBwYXJlbnQncyB1cGRhdGVkIGhvb2suXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAodm0uX3dhdGNoZXIpIHtcbiAgICAgIHZtLl93YXRjaGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRkZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdiZWZvcmVEZXN0cm95Jyk7XG4gICAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50XG4gICAgdmFyIHBhcmVudCA9IHZtLiRwYXJlbnQ7XG4gICAgaWYgKHBhcmVudCAmJiAhcGFyZW50Ll9pc0JlaW5nRGVzdHJveWVkICYmICF2bS4kb3B0aW9ucy5hYnN0cmFjdCkge1xuICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTtcbiAgICB9XG4gICAgLy8gdGVhcmRvd24gd2F0Y2hlcnNcbiAgICBpZiAodm0uX3dhdGNoZXIpIHtcbiAgICAgIHZtLl93YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2bS5fd2F0Y2hlcnNbaV0udGVhcmRvd24oKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSBmcm9tIGRhdGEgb2JcbiAgICAvLyBmcm96ZW4gb2JqZWN0IG1heSBub3QgaGF2ZSBvYnNlcnZlci5cbiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7XG4gICAgICB2bS5fZGF0YS5fX29iX18udm1Db3VudC0tO1xuICAgIH1cbiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi5cbiAgICB2bS5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIGludm9rZSBkZXN0cm95IGhvb2tzIG9uIGN1cnJlbnQgcmVuZGVyZWQgdHJlZVxuICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpO1xuICAgIC8vIGZpcmUgZGVzdHJveWVkIGhvb2tcbiAgICBjYWxsSG9vayh2bSwgJ2Rlc3Ryb3llZCcpO1xuICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuXG4gICAgdm0uJG9mZigpO1xuICAgIC8vIHJlbW92ZSBfX3Z1ZV9fIHJlZmVyZW5jZVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50IChcbiAgdm0sXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICB2bS4kZWwgPSBlbDtcbiAgaWYgKCF2bS4kb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICgodm0uJG9wdGlvbnMudGVtcGxhdGUgJiYgdm0uJG9wdGlvbnMudGVtcGxhdGUuY2hhckF0KDApICE9PSAnIycpIHx8XG4gICAgICAgIHZtLiRvcHRpb25zLmVsIHx8IGVsKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlICcgK1xuICAgICAgICAgICdjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgcHJlLWNvbXBpbGUgdGhlIHRlbXBsYXRlcyBpbnRvICcgK1xuICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBtb3VudCBjb21wb25lbnQ6IHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbiBub3QgZGVmaW5lZC4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50O1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lO1xuICAgICAgdmFyIGlkID0gdm0uX3VpZDtcbiAgICAgIHZhciBzdGFydFRhZyA9IFwidnVlLXBlcmYtc3RhcnQ6XCIgKyBpZDtcbiAgICAgIHZhciBlbmRUYWcgPSBcInZ1ZS1wZXJmLWVuZDpcIiArIGlkO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZhciB2bm9kZSA9IHZtLl9yZW5kZXIoKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKG5hbWUgKyBcIiByZW5kZXJcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZtLl91cGRhdGUodm5vZGUsIGh5ZHJhdGluZyk7XG4gICAgICBtYXJrKGVuZFRhZyk7XG4gICAgICBtZWFzdXJlKChuYW1lICsgXCIgcGF0Y2hcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdm0uX3VwZGF0ZSh2bS5fcmVuZGVyKCksIGh5ZHJhdGluZyk7XG4gICAgfTtcbiAgfVxuXG4gIHZtLl93YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIHVwZGF0ZUNvbXBvbmVudCwgbm9vcCk7XG4gIGh5ZHJhdGluZyA9IGZhbHNlO1xuXG4gIC8vIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UsIGNhbGwgbW91bnRlZCBvbiBzZWxmXG4gIC8vIG1vdW50ZWQgaXMgY2FsbGVkIGZvciByZW5kZXItY3JlYXRlZCBjaGlsZCBjb21wb25lbnRzIGluIGl0cyBpbnNlcnRlZCBob29rXG4gIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkge1xuICAgIHZtLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgIGNhbGxIb29rKHZtLCAnbW91bnRlZCcpO1xuICB9XG4gIHJldHVybiB2bVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGlsZENvbXBvbmVudCAoXG4gIHZtLFxuICBwcm9wc0RhdGEsXG4gIGxpc3RlbmVycyxcbiAgcGFyZW50Vm5vZGUsXG4gIHJlbmRlckNoaWxkcmVuXG4pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSB0cnVlO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgY29tcG9uZW50IGhhcyBzbG90IGNoaWxkcmVuXG4gIC8vIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgb3ZlcndyaXRpbmcgJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuXG4gIHZhciBoYXNDaGlsZHJlbiA9ICEhKFxuICAgIHJlbmRlckNoaWxkcmVuIHx8ICAgICAgICAgICAgICAgLy8gaGFzIG5ldyBzdGF0aWMgc2xvdHNcbiAgICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gfHwgIC8vIGhhcyBvbGQgc3RhdGljIHNsb3RzXG4gICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90c1xuICAgIHZtLiRzY29wZWRTbG90cyAhPT0gZW1wdHlPYmplY3QgLy8gaGFzIG9sZCBzY29wZWQgc2xvdHNcbiAgKTtcblxuICB2bS4kb3B0aW9ucy5fcGFyZW50Vm5vZGUgPSBwYXJlbnRWbm9kZTtcbiAgdm0uJHZub2RlID0gcGFyZW50Vm5vZGU7IC8vIHVwZGF0ZSB2bSdzIHBsYWNlaG9sZGVyIG5vZGUgd2l0aG91dCByZS1yZW5kZXJcblxuICBpZiAodm0uX3Zub2RlKSB7IC8vIHVwZGF0ZSBjaGlsZCB0cmVlJ3MgcGFyZW50XG4gICAgdm0uX3Zub2RlLnBhcmVudCA9IHBhcmVudFZub2RlO1xuICB9XG4gIHZtLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiA9IHJlbmRlckNoaWxkcmVuO1xuXG4gIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5zZXJzIGhhc2hcbiAgLy8gdGhlc2UgYXJlIGFsc28gcmVhY3RpdmUgc28gdGhleSBtYXkgdHJpZ2dlciBjaGlsZCB1cGRhdGUgaWYgdGhlIGNoaWxkXG4gIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyXG4gIHZtLiRhdHRycyA9IHBhcmVudFZub2RlLmRhdGEgJiYgcGFyZW50Vm5vZGUuZGF0YS5hdHRycztcbiAgdm0uJGxpc3RlbmVycyA9IGxpc3RlbmVycztcblxuICAvLyB1cGRhdGUgcHJvcHNcbiAgaWYgKHByb3BzRGF0YSAmJiB2bS4kb3B0aW9ucy5wcm9wcykge1xuICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IGZhbHNlO1xuICAgIHZhciBwcm9wcyA9IHZtLl9wcm9wcztcbiAgICB2YXIgcHJvcEtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHByb3BLZXlzW2ldO1xuICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHZtLiRvcHRpb25zLnByb3BzLCBwcm9wc0RhdGEsIHZtKTtcbiAgICB9XG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gdHJ1ZTtcbiAgICAvLyBrZWVwIGEgY29weSBvZiByYXcgcHJvcHNEYXRhXG4gICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhID0gcHJvcHNEYXRhO1xuICB9XG5cbiAgLy8gdXBkYXRlIGxpc3RlbmVyc1xuICBpZiAobGlzdGVuZXJzKSB7XG4gICAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gICAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVycztcbiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTtcbiAgfVxuICAvLyByZXNvbHZlIHNsb3RzICsgZm9yY2UgdXBkYXRlIGlmIGhhcyBjaGlsZHJlblxuICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMocmVuZGVyQ2hpbGRyZW4sIHBhcmVudFZub2RlLmNvbnRleHQpO1xuICAgIHZtLiRmb3JjZVVwZGF0ZSgpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luSW5hY3RpdmVUcmVlICh2bSkge1xuICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHtcbiAgICBpZiAodm0uX2luYWN0aXZlKSB7IHJldHVybiB0cnVlIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkge1xuICBpZiAoZGlyZWN0KSB7XG4gICAgdm0uX2RpcmVjdEluYWN0aXZlID0gZmFsc2U7XG4gICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHtcbiAgICB2bS5faW5hY3RpdmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZtLiRjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICBjYWxsSG9vayh2bSwgJ2FjdGl2YXRlZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkge1xuICBpZiAoZGlyZWN0KSB7XG4gICAgdm0uX2RpcmVjdEluYWN0aXZlID0gdHJ1ZTtcbiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuICBpZiAoIXZtLl9pbmFjdGl2ZSkge1xuICAgIHZtLl9pbmFjdGl2ZSA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbEhvb2sgKHZtLCBob29rKSB7XG4gIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdO1xuICBpZiAoaGFuZGxlcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcnNbaV0uY2FsbCh2bSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArIFwiIGhvb2tcIikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodm0uX2hhc0hvb2tFdmVudCkge1xuICAgIHZtLiRlbWl0KCdob29rOicgKyBob29rKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuXG52YXIgTUFYX1VQREFURV9DT1VOVCA9IDEwMDtcblxudmFyIHF1ZXVlID0gW107XG52YXIgYWN0aXZhdGVkQ2hpbGRyZW4gPSBbXTtcbnZhciBoYXMgPSB7fTtcbnZhciBjaXJjdWxhciA9IHt9O1xudmFyIHdhaXRpbmcgPSBmYWxzZTtcbnZhciBmbHVzaGluZyA9IGZhbHNlO1xudmFyIGluZGV4ID0gMDtcblxuLyoqXG4gKiBSZXNldCB0aGUgc2NoZWR1bGVyJ3Mgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkge1xuICBpbmRleCA9IHF1ZXVlLmxlbmd0aCA9IGFjdGl2YXRlZENoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIGhhcyA9IHt9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNpcmN1bGFyID0ge307XG4gIH1cbiAgd2FpdGluZyA9IGZsdXNoaW5nID0gZmFsc2U7XG59XG5cbi8qKlxuICogRmx1c2ggYm90aCBxdWV1ZXMgYW5kIHJ1biB0aGUgd2F0Y2hlcnMuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoU2NoZWR1bGVyUXVldWUgKCkge1xuICBmbHVzaGluZyA9IHRydWU7XG4gIHZhciB3YXRjaGVyLCBpZDtcblxuICAvLyBTb3J0IHF1ZXVlIGJlZm9yZSBmbHVzaC5cbiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6XG4gIC8vIDEuIENvbXBvbmVudHMgYXJlIHVwZGF0ZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuIChiZWNhdXNlIHBhcmVudCBpcyBhbHdheXNcbiAgLy8gICAgY3JlYXRlZCBiZWZvcmUgdGhlIGNoaWxkKVxuICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlXG4gIC8vICAgIHVzZXIgd2F0Y2hlcnMgYXJlIGNyZWF0ZWQgYmVmb3JlIHRoZSByZW5kZXIgd2F0Y2hlcilcbiAgLy8gMy4gSWYgYSBjb21wb25lbnQgaXMgZGVzdHJveWVkIGR1cmluZyBhIHBhcmVudCBjb21wb25lbnQncyB3YXRjaGVyIHJ1bixcbiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLlxuICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmlkIC0gYi5pZDsgfSk7XG5cbiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkXG4gIC8vIGFzIHdlIHJ1biBleGlzdGluZyB3YXRjaGVyc1xuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBxdWV1ZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdO1xuICAgIGlkID0gd2F0Y2hlci5pZDtcbiAgICBoYXNbaWRdID0gbnVsbDtcbiAgICB3YXRjaGVyLnJ1bigpO1xuICAgIC8vIGluIGRldiBidWlsZCwgY2hlY2sgYW5kIHN0b3AgY2lyY3VsYXIgdXBkYXRlcy5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHtcbiAgICAgIGNpcmN1bGFyW2lkXSA9IChjaXJjdWxhcltpZF0gfHwgMCkgKyAxO1xuICAgICAgaWYgKGNpcmN1bGFyW2lkXSA+IE1BWF9VUERBVEVfQ09VTlQpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IG1heSBoYXZlIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wICcgKyAoXG4gICAgICAgICAgICB3YXRjaGVyLnVzZXJcbiAgICAgICAgICAgICAgPyAoXCJpbiB3YXRjaGVyIHdpdGggZXhwcmVzc2lvbiBcXFwiXCIgKyAod2F0Y2hlci5leHByZXNzaW9uKSArIFwiXFxcIlwiKVxuICAgICAgICAgICAgICA6IFwiaW4gYSBjb21wb25lbnQgcmVuZGVyIGZ1bmN0aW9uLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3YXRjaGVyLnZtXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8ga2VlcCBjb3BpZXMgb2YgcG9zdCBxdWV1ZXMgYmVmb3JlIHJlc2V0dGluZyBzdGF0ZVxuICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpO1xuICB2YXIgdXBkYXRlZFF1ZXVlID0gcXVldWUuc2xpY2UoKTtcblxuICByZXNldFNjaGVkdWxlclN0YXRlKCk7XG5cbiAgLy8gY2FsbCBjb21wb25lbnQgdXBkYXRlZCBhbmQgYWN0aXZhdGVkIGhvb2tzXG4gIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7XG4gIGNhbGxVcGRhdGVkSG9va3ModXBkYXRlZFF1ZXVlKTtcblxuICAvLyBkZXZ0b29sIGhvb2tcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChkZXZ0b29scyAmJiBjb25maWcuZGV2dG9vbHMpIHtcbiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxVcGRhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIHZhciBpID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdmFyIHdhdGNoZXIgPSBxdWV1ZVtpXTtcbiAgICB2YXIgdm0gPSB3YXRjaGVyLnZtO1xuICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7XG4gICAgICBjYWxsSG9vayh2bSwgJ3VwZGF0ZWQnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBRdWV1ZSBhIGtlcHQtYWxpdmUgY29tcG9uZW50IHRoYXQgd2FzIGFjdGl2YXRlZCBkdXJpbmcgcGF0Y2guXG4gKiBUaGUgcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIGVudGlyZSB0cmVlIGhhcyBiZWVuIHBhdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50ICh2bSkge1xuICAvLyBzZXR0aW5nIF9pbmFjdGl2ZSB0byBmYWxzZSBoZXJlIHNvIHRoYXQgYSByZW5kZXIgZnVuY3Rpb24gY2FuXG4gIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpXG4gIHZtLl9pbmFjdGl2ZSA9IGZhbHNlO1xuICBhY3RpdmF0ZWRDaGlsZHJlbi5wdXNoKHZtKTtcbn1cblxuZnVuY3Rpb24gY2FsbEFjdGl2YXRlZEhvb2tzIChxdWV1ZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgcXVldWVbaV0uX2luYWN0aXZlID0gdHJ1ZTtcbiAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHF1ZXVlW2ldLCB0cnVlIC8qIHRydWUgKi8pO1xuICB9XG59XG5cbi8qKlxuICogUHVzaCBhIHdhdGNoZXIgaW50byB0aGUgd2F0Y2hlciBxdWV1ZS5cbiAqIEpvYnMgd2l0aCBkdXBsaWNhdGUgSURzIHdpbGwgYmUgc2tpcHBlZCB1bmxlc3MgaXQnc1xuICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlV2F0Y2hlciAod2F0Y2hlcikge1xuICB2YXIgaWQgPSB3YXRjaGVyLmlkO1xuICBpZiAoaGFzW2lkXSA9PSBudWxsKSB7XG4gICAgaGFzW2lkXSA9IHRydWU7XG4gICAgaWYgKCFmbHVzaGluZykge1xuICAgICAgcXVldWUucHVzaCh3YXRjaGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZFxuICAgICAgLy8gaWYgYWxyZWFkeSBwYXN0IGl0cyBpZCwgaXQgd2lsbCBiZSBydW4gbmV4dCBpbW1lZGlhdGVseS5cbiAgICAgIHZhciBpID0gcXVldWUubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7XG4gICAgfVxuICAgIC8vIHF1ZXVlIHRoZSBmbHVzaFxuICAgIGlmICghd2FpdGluZykge1xuICAgICAgd2FpdGluZyA9IHRydWU7XG4gICAgICBuZXh0VGljayhmbHVzaFNjaGVkdWxlclF1ZXVlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbnZhciB1aWQkMiA9IDA7XG5cbi8qKlxuICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsXG4gKiBhbmQgZmlyZXMgY2FsbGJhY2sgd2hlbiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBjaGFuZ2VzLlxuICogVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAkd2F0Y2goKSBhcGkgYW5kIGRpcmVjdGl2ZXMuXG4gKi9cbnZhciBXYXRjaGVyID0gZnVuY3Rpb24gV2F0Y2hlciAoXG4gIHZtLFxuICBleHBPckZuLFxuICBjYixcbiAgb3B0aW9uc1xuKSB7XG4gIHRoaXMudm0gPSB2bTtcbiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7XG4gIC8vIG9wdGlvbnNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlZXAgPSAhIW9wdGlvbnMuZGVlcDtcbiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjtcbiAgICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTtcbiAgICB0aGlzLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRlZXAgPSB0aGlzLnVzZXIgPSB0aGlzLmxhenkgPSB0aGlzLnN5bmMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLmNiID0gY2I7XG4gIHRoaXMuaWQgPSArK3VpZCQyOyAvLyB1aWQgZm9yIGJhdGNoaW5nXG4gIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnNcbiAgdGhpcy5kZXBzID0gW107XG4gIHRoaXMubmV3RGVwcyA9IFtdO1xuICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7XG4gIHRoaXMubmV3RGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5leHByZXNzaW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgID8gZXhwT3JGbi50b1N0cmluZygpXG4gICAgOiAnJztcbiAgLy8gcGFyc2UgZXhwcmVzc2lvbiBmb3IgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZXhwT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmdldHRlciA9IHBhcnNlUGF0aChleHBPckZuKTtcbiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7XG4gICAgICB0aGlzLmdldHRlciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB3YXRjaGluZyBwYXRoOiBcXFwiXCIgKyBleHBPckZuICsgXCJcXFwiIFwiICtcbiAgICAgICAgJ1dhdGNoZXIgb25seSBhY2NlcHRzIHNpbXBsZSBkb3QtZGVsaW1pdGVkIHBhdGhzLiAnICtcbiAgICAgICAgJ0ZvciBmdWxsIGNvbnRyb2wsIHVzZSBhIGZ1bmN0aW9uIGluc3RlYWQuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHRoaXMudmFsdWUgPSB0aGlzLmxhenlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogdGhpcy5nZXQoKTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgdGhlIGdldHRlciwgYW5kIHJlLWNvbGxlY3QgZGVwZW5kZW5jaWVzLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkge1xuICBwdXNoVGFyZ2V0KHRoaXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciB2bSA9IHRoaXMudm07XG4gIHRyeSB7XG4gICAgdmFsdWUgPSB0aGlzLmdldHRlci5jYWxsKHZtLCB2bSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKFwiZ2V0dGVyIGZvciB3YXRjaGVyIFxcXCJcIiArICh0aGlzLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBcInRvdWNoXCIgZXZlcnkgcHJvcGVydHkgc28gdGhleSBhcmUgYWxsIHRyYWNrZWQgYXNcbiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmdcbiAgICBpZiAodGhpcy5kZWVwKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIHBvcFRhcmdldCgpO1xuICAgIHRoaXMuY2xlYW51cERlcHMoKTtcbiAgfVxuICByZXR1cm4gdmFsdWVcbn07XG5cbi8qKlxuICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gYWRkRGVwIChkZXApIHtcbiAgdmFyIGlkID0gZGVwLmlkO1xuICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHtcbiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpO1xuICAgIHRoaXMubmV3RGVwcy5wdXNoKGRlcCk7XG4gICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7XG4gICAgICBkZXAuYWRkU3ViKHRoaXMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDbGVhbiB1cCBmb3IgZGVwZW5kZW5jeSBjb2xsZWN0aW9uLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgZGVwID0gdGhpcyQxLmRlcHNbaV07XG4gICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7XG4gICAgICBkZXAucmVtb3ZlU3ViKHRoaXMkMSk7XG4gICAgfVxuICB9XG4gIHZhciB0bXAgPSB0aGlzLmRlcElkcztcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkcztcbiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwSWRzLmNsZWFyKCk7XG4gIHRtcCA9IHRoaXMuZGVwcztcbiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzO1xuICB0aGlzLm5ld0RlcHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwO1xufTtcblxuLyoqXG4gKiBTdWJzY3JpYmVyIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0aGlzLnN5bmMpIHtcbiAgICB0aGlzLnJ1bigpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlV2F0Y2hlcih0aGlzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7XG4gIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT09IHRoaXMudmFsdWUgfHxcbiAgICAgIC8vIERlZXAgd2F0Y2hlcnMgYW5kIHdhdGNoZXJzIG9uIE9iamVjdC9BcnJheXMgc2hvdWxkIGZpcmUgZXZlblxuICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heVxuICAgICAgLy8gaGF2ZSBtdXRhdGVkLlxuICAgICAgaXNPYmplY3QodmFsdWUpIHx8XG4gICAgICB0aGlzLmRlZXBcbiAgICApIHtcbiAgICAgIC8vIHNldCBuZXcgdmFsdWVcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoXCJjYWxsYmFjayBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuXG4gKiBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgZm9yIGxhenkgd2F0Y2hlcnMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkge1xuICB0aGlzLnZhbHVlID0gdGhpcy5nZXQoKTtcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB0aGlzJDEuZGVwc1tpXS5kZXBlbmQoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUudGVhcmRvd24gPSBmdW5jdGlvbiB0ZWFyZG93biAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKTtcbiAgICB9XG4gICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMkMS5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzJDEpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFuIG9iamVjdCB0byBldm9rZSBhbGwgY29udmVydGVkXG4gKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdFxuICogaXMgY29sbGVjdGVkIGFzIGEgXCJkZWVwXCIgZGVwZW5kZW5jeS5cbiAqL1xudmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTtcbmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHtcbiAgc2Vlbk9iamVjdHMuY2xlYXIoKTtcbiAgX3RyYXZlcnNlKHZhbCwgc2Vlbk9iamVjdHMpO1xufVxuXG5mdW5jdGlvbiBfdHJhdmVyc2UgKHZhbCwgc2Vlbikge1xuICB2YXIgaSwga2V5cztcbiAgdmFyIGlzQSA9IEFycmF5LmlzQXJyYXkodmFsKTtcbiAgaWYgKCghaXNBICYmICFpc09iamVjdCh2YWwpKSB8fCAhT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWwpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZhbC5fX29iX18pIHtcbiAgICB2YXIgZGVwSWQgPSB2YWwuX19vYl9fLmRlcC5pZDtcbiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2Vlbi5hZGQoZGVwSWQpO1xuICB9XG4gIGlmIChpc0EpIHtcbiAgICBpID0gdmFsLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxbaV0sIHNlZW4pOyB9XG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgaSA9IGtleXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2Vlbik7IH1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbiA9IHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IG5vb3AsXG4gIHNldDogbm9vcFxufTtcblxuZnVuY3Rpb24gcHJveHkgKHRhcmdldCwgc291cmNlS2V5LCBrZXkpIHtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHtcbiAgICByZXR1cm4gdGhpc1tzb3VyY2VLZXldW2tleV1cbiAgfTtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHtcbiAgICB0aGlzW3NvdXJjZUtleV1ba2V5XSA9IHZhbDtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7XG4gIHZtLl93YXRjaGVycyA9IFtdO1xuICB2YXIgb3B0cyA9IHZtLiRvcHRpb25zO1xuICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9XG4gIGlmIChvcHRzLm1ldGhvZHMpIHsgaW5pdE1ldGhvZHModm0sIG9wdHMubWV0aG9kcyk7IH1cbiAgaWYgKG9wdHMuZGF0YSkge1xuICAgIGluaXREYXRhKHZtKTtcbiAgfSBlbHNlIHtcbiAgICBvYnNlcnZlKHZtLl9kYXRhID0ge30sIHRydWUgLyogYXNSb290RGF0YSAqLyk7XG4gIH1cbiAgaWYgKG9wdHMuY29tcHV0ZWQpIHsgaW5pdENvbXB1dGVkKHZtLCBvcHRzLmNvbXB1dGVkKTsgfVxuICBpZiAob3B0cy53YXRjaCAmJiBvcHRzLndhdGNoICE9PSBuYXRpdmVXYXRjaCkge1xuICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tPcHRpb25UeXBlICh2bSwgbmFtZSkge1xuICB2YXIgb3B0aW9uID0gdm0uJG9wdGlvbnNbbmFtZV07XG4gIGlmICghaXNQbGFpbk9iamVjdChvcHRpb24pKSB7XG4gICAgd2FybihcbiAgICAgIChcImNvbXBvbmVudCBvcHRpb24gXFxcIlwiICsgbmFtZSArIFwiXFxcIiBzaG91bGQgYmUgYW4gb2JqZWN0LlwiKSxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHtcbiAgdmFyIHByb3BzRGF0YSA9IHZtLiRvcHRpb25zLnByb3BzRGF0YSB8fCB7fTtcbiAgdmFyIHByb3BzID0gdm0uX3Byb3BzID0ge307XG4gIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5XG4gIC8vIGluc3RlYWQgb2YgZHluYW1pYyBvYmplY3Qga2V5IGVudW1lcmF0aW9uLlxuICB2YXIga2V5cyA9IHZtLiRvcHRpb25zLl9wcm9wS2V5cyA9IFtdO1xuICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7XG4gIC8vIHJvb3QgaW5zdGFuY2UgcHJvcHMgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSBpc1Jvb3Q7XG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gICAgdmFyIHZhbHVlID0gdmFsaWRhdGVQcm9wKGtleSwgcHJvcHNPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpIHx8IGNvbmZpZy5pc1Jlc2VydmVkQXR0cihrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBjb21wb25lbnQgcHJvcC5cIiksXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHByb3BzLCBrZXksIHZhbHVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh2bS4kcGFyZW50ICYmICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJBdm9pZCBtdXRhdGluZyBhIHByb3AgZGlyZWN0bHkgc2luY2UgdGhlIHZhbHVlIHdpbGwgYmUgXCIgK1xuICAgICAgICAgICAgXCJvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcGFyZW50IGNvbXBvbmVudCByZS1yZW5kZXJzLiBcIiArXG4gICAgICAgICAgICBcIkluc3RlYWQsIHVzZSBhIGRhdGEgb3IgY29tcHV0ZWQgcHJvcGVydHkgYmFzZWQgb24gdGhlIHByb3AncyBcIiArXG4gICAgICAgICAgICBcInZhbHVlLiBQcm9wIGJlaW5nIG11dGF0ZWQ6IFxcXCJcIiArIGtleSArIFwiXFxcIlwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmaW5lUmVhY3RpdmUkJDEocHJvcHMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvLyBzdGF0aWMgcHJvcHMgYXJlIGFscmVhZHkgcHJveGllZCBvbiB0aGUgY29tcG9uZW50J3MgcHJvdG90eXBlXG4gICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXRcbiAgICAvLyBpbnN0YW50aWF0aW9uIGhlcmUuXG4gICAgaWYgKCEoa2V5IGluIHZtKSkge1xuICAgICAgcHJveHkodm0sIFwiX3Byb3BzXCIsIGtleSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApO1xuICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpbml0RGF0YSAodm0pIHtcbiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhO1xuICBkYXRhID0gdm0uX2RhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZ2V0RGF0YShkYXRhLCB2bSlcbiAgICA6IGRhdGEgfHwge307XG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGRhdGEgPSB7fTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnZGF0YSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBvYmplY3Q6XFxuJyArXG4gICAgICAnaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy5odG1sI2RhdGEtTXVzdC1CZS1hLUZ1bmN0aW9uJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyBwcm94eSBkYXRhIG9uIGluc3RhbmNlXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzO1xuICB2YXIgbWV0aG9kcyA9IHZtLiRvcHRpb25zLm1ldGhvZHM7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKG1ldGhvZHMgJiYgaGFzT3duKG1ldGhvZHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJtZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIGRhdGEgcHJvcGVydHkuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJUaGUgZGF0YSBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuIFwiICtcbiAgICAgICAgXCJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXCIsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQoa2V5KSkge1xuICAgICAgcHJveHkodm0sIFwiX2RhdGFcIiwga2V5KTtcbiAgICB9XG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YSAoZGF0YSwgdm0pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGF0YS5jYWxsKHZtKVxuICB9IGNhdGNoIChlKSB7XG4gICAgaGFuZGxlRXJyb3IoZSwgdm0sIFwiZGF0YSgpXCIpO1xuICAgIHJldHVybiB7fVxuICB9XG59XG5cbnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07XG5cbmZ1bmN0aW9uIGluaXRDb21wdXRlZCAodm0sIGNvbXB1dGVkKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hlY2tPcHRpb25UeXBlKHZtLCAnY29tcHV0ZWQnKTtcbiAgdmFyIHdhdGNoZXJzID0gdm0uX2NvbXB1dGVkV2F0Y2hlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkge1xuICAgIHZhciB1c2VyRGVmID0gY29tcHV0ZWRba2V5XTtcbiAgICB2YXIgZ2V0dGVyID0gdHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicgPyB1c2VyRGVmIDogdXNlckRlZi5nZXQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZ2V0dGVyID09IG51bGwpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkdldHRlciBpcyBtaXNzaW5nIGZvciBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuXCIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS5cbiAgICB3YXRjaGVyc1trZXldID0gbmV3IFdhdGNoZXIodm0sIGdldHRlciB8fCBub29wLCBub29wLCBjb21wdXRlZFdhdGNoZXJPcHRpb25zKTtcblxuICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGVcbiAgICAvLyBjb21wb25lbnQgcHJvdG90eXBlLiBXZSBvbmx5IG5lZWQgdG8gZGVmaW5lIGNvbXB1dGVkIHByb3BlcnRpZXMgZGVmaW5lZFxuICAgIC8vIGF0IGluc3RhbnRpYXRpb24gaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gdm0pKSB7XG4gICAgICBkZWZpbmVDb21wdXRlZCh2bSwga2V5LCB1c2VyRGVmKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChrZXkgaW4gdm0uJGRhdGEpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLlwiKSwgdm0pO1xuICAgICAgfSBlbHNlIGlmICh2bS4kb3B0aW9ucy5wcm9wcyAmJiBrZXkgaW4gdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIHByb3AuXCIpLCB2bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUNvbXB1dGVkICh0YXJnZXQsIGtleSwgdXNlckRlZikge1xuICBpZiAodHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KTtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDtcbiAgfSBlbHNlIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gdXNlckRlZi5nZXRcbiAgICAgID8gdXNlckRlZi5jYWNoZSAhPT0gZmFsc2VcbiAgICAgICAgPyBjcmVhdGVDb21wdXRlZEdldHRlcihrZXkpXG4gICAgICAgIDogdXNlckRlZi5nZXRcbiAgICAgIDogbm9vcDtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gdXNlckRlZi5zZXRcbiAgICAgID8gdXNlckRlZi5zZXRcbiAgICAgIDogbm9vcDtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9PT0gbm9vcCkge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJDb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIGFzc2lnbmVkIHRvIGJ1dCBpdCBoYXMgbm8gc2V0dGVyLlwiKSxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIgKGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkge1xuICAgIHZhciB3YXRjaGVyID0gdGhpcy5fY29tcHV0ZWRXYXRjaGVycyAmJiB0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2tleV07XG4gICAgaWYgKHdhdGNoZXIpIHtcbiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7XG4gICAgICAgIHdhdGNoZXIuZXZhbHVhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGVja09wdGlvblR5cGUodm0sICdtZXRob2RzJyk7XG4gIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzO1xuICBmb3IgKHZhciBrZXkgaW4gbWV0aG9kcykge1xuICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAobWV0aG9kc1trZXldID09IG51bGwpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIm1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaGFzIGFuIHVuZGVmaW5lZCB2YWx1ZSBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIFwiICtcbiAgICAgICAgICBcIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/XCIsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJtZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRXYXRjaCAodm0sIHdhdGNoKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hlY2tPcHRpb25UeXBlKHZtLCAnd2F0Y2gnKTtcbiAgZm9yICh2YXIga2V5IGluIHdhdGNoKSB7XG4gICAgdmFyIGhhbmRsZXIgPSB3YXRjaFtrZXldO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY3JlYXRlV2F0Y2hlcih2bSwga2V5LCBoYW5kbGVyW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3JlYXRlV2F0Y2hlcih2bSwga2V5LCBoYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlV2F0Y2hlciAoXG4gIHZtLFxuICBrZXlPckZuLFxuICBoYW5kbGVyLFxuICBvcHRpb25zXG4pIHtcbiAgaWYgKGlzUGxhaW5PYmplY3QoaGFuZGxlcikpIHtcbiAgICBvcHRpb25zID0gaGFuZGxlcjtcbiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyO1xuICB9XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZycpIHtcbiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07XG4gIH1cbiAgcmV0dXJuIHZtLiR3YXRjaChrZXlPckZuLCBoYW5kbGVyLCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBzdGF0ZU1peGluIChWdWUpIHtcbiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0XG4gIC8vIHdoZW4gdXNpbmcgT2JqZWN0LmRlZmluZVByb3BlcnR5LCBzbyB3ZSBoYXZlIHRvIHByb2NlZHVyYWxseSBidWlsZCB1cFxuICAvLyB0aGUgb2JqZWN0IGhlcmUuXG4gIHZhciBkYXRhRGVmID0ge307XG4gIGRhdGFEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YSB9O1xuICB2YXIgcHJvcHNEZWYgPSB7fTtcbiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgcmVwbGFjaW5nIGluc3RhbmNlIHJvb3QgJGRhdGEuICcgK1xuICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH07XG4gICAgcHJvcHNEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcIiRwcm9wcyBpcyByZWFkb25seS5cIiwgdGhpcyk7XG4gICAgfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRkYXRhJywgZGF0YURlZik7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHByb3BzJywgcHJvcHNEZWYpO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHNldCA9IHNldDtcbiAgVnVlLnByb3RvdHlwZS4kZGVsZXRlID0gZGVsO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHdhdGNoID0gZnVuY3Rpb24gKFxuICAgIGV4cE9yRm4sXG4gICAgY2IsXG4gICAgb3B0aW9uc1xuICApIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmIChpc1BsYWluT2JqZWN0KGNiKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKVxuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnVzZXIgPSB0cnVlO1xuICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5pbW1lZGlhdGUpIHtcbiAgICAgIGNiLmNhbGwodm0sIHdhdGNoZXIudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gdW53YXRjaEZuICgpIHtcbiAgICAgIHdhdGNoZXIudGVhcmRvd24oKTtcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHtcbiAgdmFyIHByb3ZpZGUgPSB2bS4kb3B0aW9ucy5wcm92aWRlO1xuICBpZiAocHJvdmlkZSkge1xuICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHByb3ZpZGUuY2FsbCh2bSlcbiAgICAgIDogcHJvdmlkZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHtcbiAgdmFyIHJlc3VsdCA9IHJlc29sdmVJbmplY3Qodm0uJG9wdGlvbnMuaW5qZWN0LCB2bSk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBcIiArXG4gICAgICAgICAgICBcIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXFxcIlwiICsga2V5ICsgXCJcXFwiXCIsXG4gICAgICAgICAgICB2bVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sIGtleSwgcmVzdWx0W2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkge1xuICBpZiAoaW5qZWN0KSB7XG4gICAgLy8gaW5qZWN0IGlzIDphbnkgYmVjYXVzZSBmbG93IGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gZmlndXJlIG91dCBjYWNoZWRcbiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIga2V5cyA9IGhhc1N5bWJvbFxuICAgICAgICA/IFJlZmxlY3Qub3duS2V5cyhpbmplY3QpXG4gICAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgcHJvdmlkZUtleSA9IGluamVjdFtrZXldO1xuICAgICAgdmFyIHNvdXJjZSA9IHZtO1xuICAgICAgd2hpbGUgKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLl9wcm92aWRlZCAmJiBwcm92aWRlS2V5IGluIHNvdXJjZS5fcHJvdmlkZWQpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFzb3VyY2UpIHtcbiAgICAgICAgd2FybigoXCJJbmplY3Rpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIG5vdCBmb3VuZFwiKSwgdm0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuXG4pIHtcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IEN0b3Iub3B0aW9ucy5wcm9wcztcbiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykge1xuICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEgfHwge30pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNEZWYoZGF0YS5hdHRycykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5hdHRycyk7IH1cbiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH1cbiAgfVxuICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gIC8vIGdldHMgYSB1bmlxdWUgY29udGV4dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IG5hbWVkIHNsb3QgY2hlY2tcbiAgdmFyIF9jb250ZXh0ID0gT2JqZWN0LmNyZWF0ZShjb250ZXh0KTtcbiAgdmFyIGggPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudChfY29udGV4dCwgYSwgYiwgYywgZCwgdHJ1ZSk7IH07XG4gIHZhciB2bm9kZSA9IEN0b3Iub3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCBoLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBwcm9wczogcHJvcHMsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIHBhcmVudDogY29udGV4dCxcbiAgICBsaXN0ZW5lcnM6IGRhdGEub24gfHwge30sXG4gICAgaW5qZWN0aW9uczogcmVzb2x2ZUluamVjdChDdG9yLm9wdGlvbnMuaW5qZWN0LCBjb250ZXh0KSxcbiAgICBzbG90czogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBjb250ZXh0KTsgfVxuICB9KTtcbiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICB2bm9kZS5mdW5jdGlvbmFsQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdm5vZGUuZnVuY3Rpb25hbE9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gICAgaWYgKGRhdGEuc2xvdCkge1xuICAgICAgKHZub2RlLmRhdGEgfHwgKHZub2RlLmRhdGEgPSB7fSkpLnNsb3QgPSBkYXRhLnNsb3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBtZXJnZVByb3BzICh0bywgZnJvbSkge1xuICBmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldO1xuICB9XG59XG5cbi8qICAqL1xuXG4vLyBob29rcyB0byBiZSBpbnZva2VkIG9uIGNvbXBvbmVudCBWTm9kZXMgZHVyaW5nIHBhdGNoXG52YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHtcbiAgaW5pdDogZnVuY3Rpb24gaW5pdCAoXG4gICAgdm5vZGUsXG4gICAgaHlkcmF0aW5nLFxuICAgIHBhcmVudEVsbSxcbiAgICByZWZFbG1cbiAgKSB7XG4gICAgaWYgKCF2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZShcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGFjdGl2ZUluc3RhbmNlLFxuICAgICAgICBwYXJlbnRFbG0sXG4gICAgICAgIHJlZkVsbVxuICAgICAgKTtcbiAgICAgIGNoaWxkLiRtb3VudChoeWRyYXRpbmcgPyB2bm9kZS5lbG0gOiB1bmRlZmluZWQsIGh5ZHJhdGluZyk7XG4gICAgfSBlbHNlIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgLy8ga2VwdC1hbGl2ZSBjb21wb25lbnRzLCB0cmVhdCBhcyBhIHBhdGNoXG4gICAgICB2YXIgbW91bnRlZE5vZGUgPSB2bm9kZTsgLy8gd29yayBhcm91bmQgZmxvd1xuICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpO1xuICAgIH1cbiAgfSxcblxuICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkge1xuICAgIHZhciBvcHRpb25zID0gdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgICB2YXIgY2hpbGQgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KFxuICAgICAgY2hpbGQsXG4gICAgICBvcHRpb25zLnByb3BzRGF0YSwgLy8gdXBkYXRlZCBwcm9wc1xuICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzXG4gICAgICB2bm9kZSwgLy8gbmV3IHBhcmVudCB2bm9kZVxuICAgICAgb3B0aW9ucy5jaGlsZHJlbiAvLyBuZXcgY2hpbGRyZW5cbiAgICApO1xuICB9LFxuXG4gIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkge1xuICAgIHZhciBjb250ZXh0ID0gdm5vZGUuY29udGV4dDtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHtcbiAgICAgIGNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgY2FsbEhvb2soY29tcG9uZW50SW5zdGFuY2UsICdtb3VudGVkJyk7XG4gICAgfVxuICAgIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgaWYgKGNvbnRleHQuX2lzTW91bnRlZCkge1xuICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTJcbiAgICAgICAgLy8gRHVyaW5nIHVwZGF0ZXMsIGEga2VwdC1hbGl2ZSBjb21wb25lbnQncyBjaGlsZCBjb21wb25lbnRzIG1heVxuICAgICAgICAvLyBjaGFuZ2UsIHNvIGRpcmVjdGx5IHdhbGtpbmcgdGhlIHRyZWUgaGVyZSBtYXkgY2FsbCBhY3RpdmF0ZWQgaG9va3NcbiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbFxuICAgICAgICAvLyBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHdob2xlIHBhdGNoIHByb2Nlc3MgZW5kZWQuXG4gICAgICAgIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UsIHRydWUgLyogZGlyZWN0ICovKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAoXG4gIEN0b3IsXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICBpZiAoaXNVbmRlZihDdG9yKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGJhc2VDdG9yID0gY29udGV4dC4kb3B0aW9ucy5fYmFzZTtcblxuICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3JcbiAgaWYgKGlzT2JqZWN0KEN0b3IpKSB7XG4gICAgQ3RvciA9IGJhc2VDdG9yLmV4dGVuZChDdG9yKTtcbiAgfVxuXG4gIC8vIGlmIGF0IHRoaXMgc3RhZ2UgaXQncyBub3QgYSBjb25zdHJ1Y3RvciBvciBhbiBhc3luYyBjb21wb25lbnQgZmFjdG9yeSxcbiAgLy8gcmVqZWN0LlxuICBpZiAodHlwZW9mIEN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybigoXCJJbnZhbGlkIENvbXBvbmVudCBkZWZpbml0aW9uOiBcIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gYXN5bmMgY29tcG9uZW50XG4gIHZhciBhc3luY0ZhY3Rvcnk7XG4gIGlmIChpc1VuZGVmKEN0b3IuY2lkKSkge1xuICAgIGFzeW5jRmFjdG9yeSA9IEN0b3I7XG4gICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTtcbiAgICBpZiAoQ3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciBub2RlIGZvciBhc3luYyBjb21wb25lbnQsIHdoaWNoIGlzIHJlbmRlcmVkXG4gICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS5cbiAgICAgIC8vIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGFzeW5jIHNlcnZlci1yZW5kZXJpbmcgYW5kIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyKFxuICAgICAgICBhc3luY0ZhY3RvcnksXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0YWdcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkYXRhID0gZGF0YSB8fCB7fTtcblxuICAvLyByZXNvbHZlIGNvbnN0cnVjdG9yIG9wdGlvbnMgaW4gY2FzZSBnbG9iYWwgbWl4aW5zIGFyZSBhcHBsaWVkIGFmdGVyXG4gIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvblxuICByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3IpO1xuXG4gIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHNcbiAgaWYgKGlzRGVmKGRhdGEubW9kZWwpKSB7XG4gICAgdHJhbnNmb3JtTW9kZWwoQ3Rvci5vcHRpb25zLCBkYXRhKTtcbiAgfVxuXG4gIC8vIGV4dHJhY3QgcHJvcHNcbiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTtcblxuICAvLyBmdW5jdGlvbmFsIGNvbXBvbmVudFxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkge1xuICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbmFsQ29tcG9uZW50KEN0b3IsIHByb3BzRGF0YSwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4pXG4gIH1cblxuICAvLyBleHRyYWN0IGxpc3RlbmVycywgc2luY2UgdGhlc2UgbmVlZHMgdG8gYmUgdHJlYXRlZCBhc1xuICAvLyBjaGlsZCBjb21wb25lbnQgbGlzdGVuZXJzIGluc3RlYWQgb2YgRE9NIGxpc3RlbmVyc1xuICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjtcbiAgLy8gcmVwbGFjZSB3aXRoIGxpc3RlbmVycyB3aXRoIC5uYXRpdmUgbW9kaWZpZXJcbiAgLy8gc28gaXQgZ2V0cyBwcm9jZXNzZWQgZHVyaW5nIHBhcmVudCBjb21wb25lbnQgcGF0Y2guXG4gIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uO1xuXG4gIGlmIChpc1RydWUoQ3Rvci5vcHRpb25zLmFic3RyYWN0KSkge1xuICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmdcbiAgICAvLyBvdGhlciB0aGFuIHByb3BzICYgbGlzdGVuZXJzICYgc2xvdFxuXG4gICAgLy8gd29yayBhcm91bmQgZmxvd1xuICAgIHZhciBzbG90ID0gZGF0YS5zbG90O1xuICAgIGRhdGEgPSB7fTtcbiAgICBpZiAoc2xvdCkge1xuICAgICAgZGF0YS5zbG90ID0gc2xvdDtcbiAgICB9XG4gIH1cblxuICAvLyBtZXJnZSBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlXG4gIG1lcmdlSG9va3MoZGF0YSk7XG5cbiAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgdm5vZGVcbiAgdmFyIG5hbWUgPSBDdG9yLm9wdGlvbnMubmFtZSB8fCB0YWc7XG4gIHZhciB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAoXCJ2dWUtY29tcG9uZW50LVwiICsgKEN0b3IuY2lkKSArIChuYW1lID8gKFwiLVwiICsgbmFtZSkgOiAnJykpLFxuICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsXG4gICAgeyBDdG9yOiBDdG9yLCBwcm9wc0RhdGE6IHByb3BzRGF0YSwgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsIHRhZzogdGFnLCBjaGlsZHJlbjogY2hpbGRyZW4gfSxcbiAgICBhc3luY0ZhY3RvcnlcbiAgKTtcbiAgcmV0dXJuIHZub2RlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKFxuICB2bm9kZSwgLy8gd2Uga25vdyBpdCdzIE1vdW50ZWRDb21wb25lbnRWTm9kZSBidXQgZmxvdyBkb2Vzbid0XG4gIHBhcmVudCwgLy8gYWN0aXZlSW5zdGFuY2UgaW4gbGlmZWN5Y2xlIHN0YXRlXG4gIHBhcmVudEVsbSxcbiAgcmVmRWxtXG4pIHtcbiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIF9pc0NvbXBvbmVudDogdHJ1ZSxcbiAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICBwcm9wc0RhdGE6IHZub2RlQ29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEsXG4gICAgX2NvbXBvbmVudFRhZzogdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZyxcbiAgICBfcGFyZW50Vm5vZGU6IHZub2RlLFxuICAgIF9wYXJlbnRMaXN0ZW5lcnM6IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnMsXG4gICAgX3JlbmRlckNoaWxkcmVuOiB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW4sXG4gICAgX3BhcmVudEVsbTogcGFyZW50RWxtIHx8IG51bGwsXG4gICAgX3JlZkVsbTogcmVmRWxtIHx8IG51bGxcbiAgfTtcbiAgLy8gY2hlY2sgaW5saW5lLXRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbnNcbiAgdmFyIGlubGluZVRlbXBsYXRlID0gdm5vZGUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtcbiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gaW5saW5lVGVtcGxhdGUucmVuZGVyO1xuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gaW5saW5lVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zO1xuICB9XG4gIHJldHVybiBuZXcgdm5vZGVDb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucylcbn1cblxuZnVuY3Rpb24gbWVyZ2VIb29rcyAoZGF0YSkge1xuICBpZiAoIWRhdGEuaG9vaykge1xuICAgIGRhdGEuaG9vayA9IHt9O1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3NUb01lcmdlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGhvb2tzVG9NZXJnZVtpXTtcbiAgICB2YXIgZnJvbVBhcmVudCA9IGRhdGEuaG9va1trZXldO1xuICAgIHZhciBvdXJzID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldO1xuICAgIGRhdGEuaG9va1trZXldID0gZnJvbVBhcmVudCA/IG1lcmdlSG9vayQxKG91cnMsIGZyb21QYXJlbnQpIDogb3VycztcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZUhvb2skMSAob25lLCB0d28pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7XG4gICAgb25lKGEsIGIsIGMsIGQpO1xuICAgIHR3byhhLCBiLCBjLCBkKTtcbiAgfVxufVxuXG4vLyB0cmFuc2Zvcm0gY29tcG9uZW50IHYtbW9kZWwgaW5mbyAodmFsdWUgYW5kIGNhbGxiYWNrKSBpbnRvXG4vLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS5cbmZ1bmN0aW9uIHRyYW5zZm9ybU1vZGVsIChvcHRpb25zLCBkYXRhKSB7XG4gIHZhciBwcm9wID0gKG9wdGlvbnMubW9kZWwgJiYgb3B0aW9ucy5tb2RlbC5wcm9wKSB8fCAndmFsdWUnO1xuICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7XG4gIHZhciBvbiA9IGRhdGEub24gfHwgKGRhdGEub24gPSB7fSk7XG4gIGlmIChpc0RlZihvbltldmVudF0pKSB7XG4gICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pO1xuICB9IGVsc2Uge1xuICAgIG9uW2V2ZW50XSA9IGRhdGEubW9kZWwuY2FsbGJhY2s7XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBTSU1QTEVfTk9STUFMSVpFID0gMTtcbnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjtcblxuLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgcHJvdmlkaW5nIGEgbW9yZSBmbGV4aWJsZSBpbnRlcmZhY2Vcbi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvd1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlLFxuICBhbHdheXNOb3JtYWxpemVcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIG5vcm1hbGl6YXRpb25UeXBlID0gY2hpbGRyZW47XG4gICAgY2hpbGRyZW4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzVHJ1ZShhbHdheXNOb3JtYWxpemUpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFO1xuICB9XG4gIHJldHVybiBfY3JlYXRlRWxlbWVudChjb250ZXh0LCB0YWcsIGRhdGEsIGNoaWxkcmVuLCBub3JtYWxpemF0aW9uVHlwZSlcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQgKFxuICBjb250ZXh0LFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICBub3JtYWxpemF0aW9uVHlwZVxuKSB7XG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgXCJcXG5cIiArXG4gICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyBvYmplY3Qgc3ludGF4IGluIHYtYmluZFxuICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHtcbiAgICB0YWcgPSBkYXRhLmlzO1xuICB9XG4gIGlmICghdGFnKSB7XG4gICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZVxuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyB3YXJuIGFnYWluc3Qgbm9uLXByaW1pdGl2ZSBrZXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICBpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmtleSkgJiYgIWlzUHJpbWl0aXZlKGRhdGEua2V5KVxuICApIHtcbiAgICB3YXJuKFxuICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICtcbiAgICAgICd1c2Ugc3RyaW5nL251bWJlciB2YWx1ZSBpbnN0ZWFkLicsXG4gICAgICBjb250ZXh0XG4gICAgKTtcbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IGNvbmZpZy5nZXRUYWdOYW1lc3BhY2UodGFnKTtcbiAgICBpZiAoY29uZmlnLmlzUmVzZXJ2ZWRUYWcodGFnKSkge1xuICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHNcbiAgICAgIHZub2RlID0gbmV3IFZOb2RlKFxuICAgICAgICBjb25maWcucGFyc2VQbGF0Zm9ybVRhZ05hbWUodGFnKSwgZGF0YSwgY2hpbGRyZW4sXG4gICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNEZWYoQ3RvciA9IHJlc29sdmVBc3NldChjb250ZXh0LiRvcHRpb25zLCAnY29tcG9uZW50cycsIHRhZykpKSB7XG4gICAgICAvLyBjb21wb25lbnRcbiAgICAgIHZub2RlID0gY3JlYXRlQ29tcG9uZW50KEN0b3IsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuLCB0YWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHNcbiAgICAgIC8vIGNoZWNrIGF0IHJ1bnRpbWUgYmVjYXVzZSBpdCBtYXkgZ2V0IGFzc2lnbmVkIGEgbmFtZXNwYWNlIHdoZW4gaXRzXG4gICAgICAvLyBwYXJlbnQgbm9ybWFsaXplcyBjaGlsZHJlblxuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIHRhZywgZGF0YSwgY2hpbGRyZW4sXG4gICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvclxuICAgIHZub2RlID0gY3JlYXRlQ29tcG9uZW50KHRhZywgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4pO1xuICB9XG4gIGlmIChpc0RlZih2bm9kZSkpIHtcbiAgICBpZiAobnMpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9XG4gICAgcmV0dXJuIHZub2RlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVtcHR5Vk5vZGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5TlMgKHZub2RlLCBucykge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaXNEZWYodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2bm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGlzRGVmKGNoaWxkLnRhZykgJiYgaXNVbmRlZihjaGlsZC5ucykpIHtcbiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLlxuICovXG5mdW5jdGlvbiByZW5kZXJMaXN0IChcbiAgdmFsLFxuICByZW5kZXJcbikge1xuICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkgfHwgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkodmFsLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHJlbmRlcih2YWxbaV0sIGkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB2YWw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtrZXldLCBrZXksIGkpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNEZWYocmV0KSkge1xuICAgIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgPHNsb3Q+XG4gKi9cbmZ1bmN0aW9uIHJlbmRlclNsb3QgKFxuICBuYW1lLFxuICBmYWxsYmFjayxcbiAgcHJvcHMsXG4gIGJpbmRPYmplY3Rcbikge1xuICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07XG4gIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3RcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChiaW5kT2JqZWN0KSB7XG4gICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiBzY29wZWRTbG90Rm4ocHJvcHMpIHx8IGZhbGxiYWNrXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsb3ROb2RlcyA9IHRoaXMuJHNsb3RzW25hbWVdO1xuICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2VcbiAgICBpZiAoc2xvdE5vZGVzICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHNsb3ROb2Rlcy5fcmVuZGVyZWQgJiYgd2FybihcbiAgICAgICAgXCJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcXFwiXCIgKyBuYW1lICsgXCJcXFwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlIFwiICtcbiAgICAgICAgXCItIHRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgcmVuZGVyIGVycm9ycy5cIixcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICAgIHNsb3ROb2Rlcy5fcmVuZGVyZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc2xvdE5vZGVzIHx8IGZhbGxiYWNrXG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHlcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIGNoZWNraW5nIGtleUNvZGVzIGZyb20gY29uZmlnLlxuICovXG5mdW5jdGlvbiBjaGVja0tleUNvZGVzIChcbiAgZXZlbnRLZXlDb2RlLFxuICBrZXksXG4gIGJ1aWx0SW5BbGlhc1xuKSB7XG4gIHZhciBrZXlDb2RlcyA9IGNvbmZpZy5rZXlDb2Rlc1trZXldIHx8IGJ1aWx0SW5BbGlhcztcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Q29kZXMpKSB7XG4gICAgcmV0dXJuIGtleUNvZGVzLmluZGV4T2YoZXZlbnRLZXlDb2RlKSA9PT0gLTFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ga2V5Q29kZXMgIT09IGV2ZW50S2V5Q29kZVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIHYtYmluZD1cIm9iamVjdFwiIGludG8gYSBWTm9kZSdzIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoXG4gIGRhdGEsXG4gIHRhZyxcbiAgdmFsdWUsXG4gIGFzUHJvcCxcbiAgaXNTeW5jXG4pIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdG9PYmplY3QodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIGhhc2g7XG4gICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8XG4gICAgICAgICAga2V5ID09PSAnc3R5bGUnIHx8XG4gICAgICAgICAgaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc2ggPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7XG4gICAgICAgICAgaGFzaCA9IGFzUHJvcCB8fCBjb25maWcubXVzdFVzZVByb3AodGFnLCB0eXBlLCBrZXkpXG4gICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSlcbiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShrZXkgaW4gaGFzaCkpIHtcbiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldO1xuXG4gICAgICAgICAgaWYgKGlzU3luYykge1xuICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgICAgICAgICAgIG9uWyhcInVwZGF0ZTpcIiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkge1xuICAgICAgICAgICAgICB2YWx1ZVtrZXldID0gJGV2ZW50O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgbG9vcCgga2V5ICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgc3RhdGljIHRyZWVzLlxuICovXG5mdW5jdGlvbiByZW5kZXJTdGF0aWMgKFxuICBpbmRleCxcbiAgaXNJbkZvclxuKSB7XG4gIHZhciB0cmVlID0gdGhpcy5fc3RhdGljVHJlZXNbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUgYnkgZG9pbmcgYSBzaGFsbG93IGNsb25lLlxuICBpZiAodHJlZSAmJiAhaXNJbkZvcikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRyZWUpXG4gICAgICA/IGNsb25lVk5vZGVzKHRyZWUpXG4gICAgICA6IGNsb25lVk5vZGUodHJlZSlcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSB0aGlzLl9zdGF0aWNUcmVlc1tpbmRleF0gPVxuICAgIHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKHRoaXMuX3JlbmRlclByb3h5KTtcbiAgbWFya1N0YXRpYyh0cmVlLCAoXCJfX3N0YXRpY19fXCIgKyBpbmRleCksIGZhbHNlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3Igdi1vbmNlLlxuICogRWZmZWN0aXZlbHkgaXQgbWVhbnMgbWFya2luZyB0aGUgbm9kZSBhcyBzdGF0aWMgd2l0aCBhIHVuaXF1ZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIG1hcmtPbmNlIChcbiAgdHJlZSxcbiAgaW5kZXgsXG4gIGtleVxuKSB7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19vbmNlX19cIiArIGluZGV4ICsgKGtleSA/IChcIl9cIiArIGtleSkgOiBcIlwiKSksIHRydWUpO1xuICByZXR1cm4gdHJlZVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhdGljIChcbiAgdHJlZSxcbiAga2V5LFxuICBpc09uY2Vcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRyZWVbaV0gJiYgdHlwZW9mIHRyZWVbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyBcIl9cIiArIGkpLCBpc09uY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpY05vZGUgKG5vZGUsIGtleSwgaXNPbmNlKSB7XG4gIG5vZGUuaXNTdGF0aWMgPSB0cnVlO1xuICBub2RlLmtleSA9IGtleTtcbiAgbm9kZS5pc09uY2UgPSBpc09uY2U7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkge1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgICd2LW9uIHdpdGhvdXQgYXJndW1lbnQgZXhwZWN0cyBhbiBPYmplY3QgdmFsdWUnLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICB2YXIgZXhpc3RpbmcgPSBvbltrZXldO1xuICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07XG4gICAgICAgIG9uW2tleV0gPSBleGlzdGluZyA/IFtdLmNvbmNhdChvdXJzLCBleGlzdGluZykgOiBvdXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDtcbiAgdmFyIHBhcmVudFZub2RlID0gdm0uJHZub2RlID0gdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZVxuICB2YXIgcmVuZGVyQ29udGV4dCA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmNvbnRleHQ7XG4gIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyh2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ICYmIHdhcm4oXCIkYXR0cnMgaXMgcmVhZG9ubHkuXCIsIHZtKTtcbiAgICB9LCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwgJyRsaXN0ZW5lcnMnLCB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ICYmIHdhcm4oXCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LlwiLCB2bSk7XG4gICAgfSwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMsIG51bGwsIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGxpc3RlbmVycycsIHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlck1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS4kbmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHJlZiA9IHZtLiRvcHRpb25zO1xuICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyO1xuICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zO1xuICAgIHZhciBfcGFyZW50Vm5vZGUgPSByZWYuX3BhcmVudFZub2RlO1xuXG4gICAgaWYgKHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIC8vIGNsb25lIHNsb3Qgbm9kZXMgb24gcmUtcmVuZGVyc1xuICAgICAgZm9yICh2YXIga2V5IGluIHZtLiRzbG90cykge1xuICAgICAgICB2bS4kc2xvdHNba2V5XSA9IGNsb25lVk5vZGVzKHZtLiRzbG90c1trZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2bS4kc2NvcGVkU2xvdHMgPSAoX3BhcmVudFZub2RlICYmIF9wYXJlbnRWbm9kZS5kYXRhLnNjb3BlZFNsb3RzKSB8fCBlbXB0eU9iamVjdDtcblxuICAgIGlmIChzdGF0aWNSZW5kZXJGbnMgJiYgIXZtLl9zdGF0aWNUcmVlcykge1xuICAgICAgdm0uX3N0YXRpY1RyZWVzID0gW107XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnQgdm5vZGUuIHRoaXMgYWxsb3dzIHJlbmRlciBmdW5jdGlvbnMgdG8gaGF2ZSBhY2Nlc3NcbiAgICAvLyB0byB0aGUgZGF0YSBvbiB0aGUgcGxhY2Vob2xkZXIgbm9kZS5cbiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7XG4gICAgLy8gcmVuZGVyIHNlbGZcbiAgICB2YXIgdm5vZGU7XG4gICAgdHJ5IHtcbiAgICAgIHZub2RlID0gcmVuZGVyLmNhbGwodm0uX3JlbmRlclByb3h5LCB2bS4kY3JlYXRlRWxlbWVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIFwicmVuZGVyIGZ1bmN0aW9uXCIpO1xuICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsXG4gICAgICAvLyBvciBwcmV2aW91cyB2bm9kZSB0byBwcmV2ZW50IHJlbmRlciBlcnJvciBjYXVzaW5nIGJsYW5rIGNvbXBvbmVudFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3JcbiAgICAgICAgICA/IHZtLiRvcHRpb25zLnJlbmRlckVycm9yLmNhbGwodm0uX3JlbmRlclByb3h5LCB2bS4kY3JlYXRlRWxlbWVudCwgZSlcbiAgICAgICAgICA6IHZtLl92bm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0XG4gICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ011bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiAnICtcbiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBjcmVhdGVFbXB0eVZOb2RlKCk7XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnRcbiAgICB2bm9kZS5wYXJlbnQgPSBfcGFyZW50Vm5vZGU7XG4gICAgcmV0dXJuIHZub2RlXG4gIH07XG5cbiAgLy8gaW50ZXJuYWwgcmVuZGVyIGhlbHBlcnMuXG4gIC8vIHRoZXNlIGFyZSBleHBvc2VkIG9uIHRoZSBpbnN0YW5jZSBwcm90b3R5cGUgdG8gcmVkdWNlIGdlbmVyYXRlZCByZW5kZXJcbiAgLy8gY29kZSBzaXplLlxuICBWdWUucHJvdG90eXBlLl9vID0gbWFya09uY2U7XG4gIFZ1ZS5wcm90b3R5cGUuX24gPSB0b051bWJlcjtcbiAgVnVlLnByb3RvdHlwZS5fcyA9IHRvU3RyaW5nO1xuICBWdWUucHJvdG90eXBlLl9sID0gcmVuZGVyTGlzdDtcbiAgVnVlLnByb3RvdHlwZS5fdCA9IHJlbmRlclNsb3Q7XG4gIFZ1ZS5wcm90b3R5cGUuX3EgPSBsb29zZUVxdWFsO1xuICBWdWUucHJvdG90eXBlLl9pID0gbG9vc2VJbmRleE9mO1xuICBWdWUucHJvdG90eXBlLl9tID0gcmVuZGVyU3RhdGljO1xuICBWdWUucHJvdG90eXBlLl9mID0gcmVzb2x2ZUZpbHRlcjtcbiAgVnVlLnByb3RvdHlwZS5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIFZ1ZS5wcm90b3R5cGUuX2IgPSBiaW5kT2JqZWN0UHJvcHM7XG4gIFZ1ZS5wcm90b3R5cGUuX3YgPSBjcmVhdGVUZXh0Vk5vZGU7XG4gIFZ1ZS5wcm90b3R5cGUuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICBWdWUucHJvdG90eXBlLl91ID0gcmVzb2x2ZVNjb3BlZFNsb3RzO1xuICBWdWUucHJvdG90eXBlLl9nID0gYmluZE9iamVjdExpc3RlbmVycztcbn1cblxuLyogICovXG5cbnZhciB1aWQgPSAwO1xuXG5mdW5jdGlvbiBpbml0TWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIC8vIGEgdWlkXG4gICAgdm0uX3VpZCA9IHVpZCsrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1pbml0OlwiICsgKHZtLl91aWQpO1xuICAgICAgZW5kVGFnID0gXCJ2dWUtcGVyZi1lbmQ6XCIgKyAodm0uX3VpZCk7XG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICB9XG5cbiAgICAvLyBhIGZsYWcgdG8gYXZvaWQgdGhpcyBiZWluZyBvYnNlcnZlZFxuICAgIHZtLl9pc1Z1ZSA9IHRydWU7XG4gICAgLy8gbWVyZ2Ugb3B0aW9uc1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuX2lzQ29tcG9uZW50KSB7XG4gICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvblxuICAgICAgLy8gc2luY2UgZHluYW1pYyBvcHRpb25zIG1lcmdpbmcgaXMgcHJldHR5IHNsb3csIGFuZCBub25lIG9mIHRoZVxuICAgICAgLy8gaW50ZXJuYWwgY29tcG9uZW50IG9wdGlvbnMgbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQuXG4gICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS4kb3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksXG4gICAgICAgIG9wdGlvbnMgfHwge30sXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpbml0UHJveHkodm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gICAgLy8gZXhwb3NlIHJlYWwgc2VsZlxuICAgIHZtLl9zZWxmID0gdm07XG4gICAgaW5pdExpZmVjeWNsZSh2bSk7XG4gICAgaW5pdEV2ZW50cyh2bSk7XG4gICAgaW5pdFJlbmRlcih2bSk7XG4gICAgY2FsbEhvb2sodm0sICdiZWZvcmVDcmVhdGUnKTtcbiAgICBpbml0SW5qZWN0aW9ucyh2bSk7IC8vIHJlc29sdmUgaW5qZWN0aW9ucyBiZWZvcmUgZGF0YS9wcm9wc1xuICAgIGluaXRTdGF0ZSh2bSk7XG4gICAgaW5pdFByb3ZpZGUodm0pOyAvLyByZXNvbHZlIHByb3ZpZGUgYWZ0ZXIgZGF0YS9wcm9wc1xuICAgIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHZtLl9uYW1lID0gZm9ybWF0Q29tcG9uZW50TmFtZSh2bSwgZmFsc2UpO1xuICAgICAgbWFyayhlbmRUYWcpO1xuICAgICAgbWVhc3VyZSgoKHZtLl9uYW1lKSArIFwiIGluaXRcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH1cblxuICAgIGlmICh2bS4kb3B0aW9ucy5lbCkge1xuICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRJbnRlcm5hbENvbXBvbmVudCAodm0sIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7XG4gIC8vIGRvaW5nIHRoaXMgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIGR5bmFtaWMgZW51bWVyYXRpb24uXG4gIG9wdHMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIG9wdHMucHJvcHNEYXRhID0gb3B0aW9ucy5wcm9wc0RhdGE7XG4gIG9wdHMuX3BhcmVudFZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGU7XG4gIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSBvcHRpb25zLl9yZW5kZXJDaGlsZHJlbjtcbiAgb3B0cy5fY29tcG9uZW50VGFnID0gb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICBvcHRzLl9wYXJlbnRFbG0gPSBvcHRpb25zLl9wYXJlbnRFbG07XG4gIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTtcbiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7XG4gICAgb3B0cy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlcjtcbiAgICBvcHRzLnN0YXRpY1JlbmRlckZucyA9IG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gIGlmIChDdG9yLnN1cGVyKSB7XG4gICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7XG4gICAgdmFyIGNhY2hlZFN1cGVyT3B0aW9ucyA9IEN0b3Iuc3VwZXJPcHRpb25zO1xuICAgIGlmIChzdXBlck9wdGlvbnMgIT09IGNhY2hlZFN1cGVyT3B0aW9ucykge1xuICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsXG4gICAgICAvLyBuZWVkIHRvIHJlc29sdmUgbmV3IG9wdGlvbnMuXG4gICAgICBDdG9yLnN1cGVyT3B0aW9ucyA9IHN1cGVyT3B0aW9ucztcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NilcbiAgICAgIHZhciBtb2RpZmllZE9wdGlvbnMgPSByZXNvbHZlTW9kaWZpZWRPcHRpb25zKEN0b3IpO1xuICAgICAgLy8gdXBkYXRlIGJhc2UgZXh0ZW5kIG9wdGlvbnNcbiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHtcbiAgICAgICAgZXh0ZW5kKEN0b3IuZXh0ZW5kT3B0aW9ucywgbW9kaWZpZWRPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMubmFtZSkge1xuICAgICAgICBvcHRpb25zLmNvbXBvbmVudHNbb3B0aW9ucy5uYW1lXSA9IEN0b3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG1vZGlmaWVkO1xuICB2YXIgbGF0ZXN0ID0gQ3Rvci5vcHRpb25zO1xuICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7XG4gIHZhciBzZWFsZWQgPSBDdG9yLnNlYWxlZE9wdGlvbnM7XG4gIGZvciAodmFyIGtleSBpbiBsYXRlc3QpIHtcbiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7XG4gICAgICBpZiAoIW1vZGlmaWVkKSB7IG1vZGlmaWVkID0ge307IH1cbiAgICAgIG1vZGlmaWVkW2tleV0gPSBkZWR1cGUobGF0ZXN0W2tleV0sIGV4dGVuZGVkW2tleV0sIHNlYWxlZFtrZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1vZGlmaWVkXG59XG5cbmZ1bmN0aW9uIGRlZHVwZSAobGF0ZXN0LCBleHRlbmRlZCwgc2VhbGVkKSB7XG4gIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkXG4gIC8vIGJldHdlZW4gbWVyZ2VzXG4gIGlmIChBcnJheS5pc0FycmF5KGxhdGVzdCkpIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgc2VhbGVkID0gQXJyYXkuaXNBcnJheShzZWFsZWQpID8gc2VhbGVkIDogW3NlYWxlZF07XG4gICAgZXh0ZW5kZWQgPSBBcnJheS5pc0FycmF5KGV4dGVuZGVkKSA/IGV4dGVuZGVkIDogW2V4dGVuZGVkXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gcHVzaCBvcmlnaW5hbCBvcHRpb25zIGFuZCBub3Qgc2VhbGVkIG9wdGlvbnMgdG8gZXhjbHVkZSBkdXBsaWNhdGVkIG9wdGlvbnNcbiAgICAgIGlmIChleHRlbmRlZC5pbmRleE9mKGxhdGVzdFtpXSkgPj0gMCB8fCBzZWFsZWQuaW5kZXhPZihsYXRlc3RbaV0pIDwgMCkge1xuICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxhdGVzdFxuICB9XG59XG5cbmZ1bmN0aW9uIFZ1ZSQyIChvcHRpb25zKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgISh0aGlzIGluc3RhbmNlb2YgVnVlJDIpXG4gICkge1xuICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTtcbiAgfVxuICB0aGlzLl9pbml0KG9wdGlvbnMpO1xufVxuXG5pbml0TWl4aW4oVnVlJDIpO1xuc3RhdGVNaXhpbihWdWUkMik7XG5ldmVudHNNaXhpbihWdWUkMik7XG5saWZlY3ljbGVNaXhpbihWdWUkMik7XG5yZW5kZXJNaXhpbihWdWUkMik7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0VXNlIChWdWUpIHtcbiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICB2YXIgaW5zdGFsbGVkUGx1Z2lucyA9ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zIHx8ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zID0gW10pKTtcbiAgICBpZiAoaW5zdGFsbGVkUGx1Z2lucy5pbmRleE9mKHBsdWdpbikgPiAtMSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmluc3RhbGwuYXBwbHkocGx1Z2luLCBhcmdzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9XG4gICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHtcbiAgVnVlLm1peGluID0gZnVuY3Rpb24gKG1peGluKSB7XG4gICAgdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgbWl4aW4pO1xuICAgIHJldHVybiB0aGlzXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHtcbiAgLyoqXG4gICAqIEVhY2ggaW5zdGFuY2UgY29uc3RydWN0b3IsIGluY2x1ZGluZyBWdWUsIGhhcyBhIHVuaXF1ZVxuICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCBcImNoaWxkXG4gICAqIGNvbnN0cnVjdG9yc1wiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLlxuICAgKi9cbiAgVnVlLmNpZCA9IDA7XG4gIHZhciBjaWQgPSAxO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgVnVlLmV4dGVuZCA9IGZ1bmN0aW9uIChleHRlbmRPcHRpb25zKSB7XG4gICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307XG4gICAgdmFyIFN1cGVyID0gdGhpcztcbiAgICB2YXIgU3VwZXJJZCA9IFN1cGVyLmNpZDtcbiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pO1xuICAgIGlmIChjYWNoZWRDdG9yc1tTdXBlcklkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlZEN0b3JzW1N1cGVySWRdXG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBleHRlbmRPcHRpb25zLm5hbWUgfHwgU3VwZXIub3B0aW9ucy5uYW1lO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIS9eW2EtekEtWl1bXFx3LV0qJC8udGVzdChuYW1lKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdJbnZhbGlkIGNvbXBvbmVudCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiLiBDb21wb25lbnQgbmFtZXMgJyArXG4gICAgICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgK1xuICAgICAgICAgICdhbmQgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgU3ViID0gZnVuY3Rpb24gVnVlQ29tcG9uZW50IChvcHRpb25zKSB7XG4gICAgICB0aGlzLl9pbml0KG9wdGlvbnMpO1xuICAgIH07XG4gICAgU3ViLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3VwZXIucHJvdG90eXBlKTtcbiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViO1xuICAgIFN1Yi5jaWQgPSBjaWQrKztcbiAgICBTdWIub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgIFN1cGVyLm9wdGlvbnMsXG4gICAgICBleHRlbmRPcHRpb25zXG4gICAgKTtcbiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjtcblxuICAgIC8vIEZvciBwcm9wcyBhbmQgY29tcHV0ZWQgcHJvcGVydGllcywgd2UgZGVmaW5lIHRoZSBwcm94eSBnZXR0ZXJzIG9uXG4gICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXNcbiAgICAvLyBhdm9pZHMgT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxzIGZvciBlYWNoIGluc3RhbmNlIGNyZWF0ZWQuXG4gICAgaWYgKFN1Yi5vcHRpb25zLnByb3BzKSB7XG4gICAgICBpbml0UHJvcHMkMShTdWIpO1xuICAgIH1cbiAgICBpZiAoU3ViLm9wdGlvbnMuY29tcHV0ZWQpIHtcbiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7XG4gICAgfVxuXG4gICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlXG4gICAgU3ViLmV4dGVuZCA9IFN1cGVyLmV4dGVuZDtcbiAgICBTdWIubWl4aW4gPSBTdXBlci5taXhpbjtcbiAgICBTdWIudXNlID0gU3VwZXIudXNlO1xuXG4gICAgLy8gY3JlYXRlIGFzc2V0IHJlZ2lzdGVycywgc28gZXh0ZW5kZWQgY2xhc3Nlc1xuICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby5cbiAgICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICBTdWJbdHlwZV0gPSBTdXBlclt0eXBlXTtcbiAgICB9KTtcbiAgICAvLyBlbmFibGUgcmVjdXJzaXZlIHNlbGYtbG9va3VwXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS5cbiAgICAvLyBsYXRlciBhdCBpbnN0YW50aWF0aW9uIHdlIGNhbiBjaGVjayBpZiBTdXBlcidzIG9wdGlvbnMgaGF2ZVxuICAgIC8vIGJlZW4gdXBkYXRlZC5cbiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9ucztcbiAgICBTdWIuZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnM7XG4gICAgU3ViLnNlYWxlZE9wdGlvbnMgPSBleHRlbmQoe30sIFN1Yi5vcHRpb25zKTtcblxuICAgIC8vIGNhY2hlIGNvbnN0cnVjdG9yXG4gICAgY2FjaGVkQ3RvcnNbU3VwZXJJZF0gPSBTdWI7XG4gICAgcmV0dXJuIFN1YlxuICB9O1xufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMkMSAoQ29tcCkge1xuICB2YXIgcHJvcHMgPSBDb21wLm9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIHByb3h5KENvbXAucHJvdG90eXBlLCBcIl9wcm9wc1wiLCBrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRDb21wdXRlZCQxIChDb21wKSB7XG4gIHZhciBjb21wdXRlZCA9IENvbXAub3B0aW9ucy5jb21wdXRlZDtcbiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgZGVmaW5lQ29tcHV0ZWQoQ29tcC5wcm90b3R5cGUsIGtleSwgY29tcHV0ZWRba2V5XSk7XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRBc3NldFJlZ2lzdGVycyAoVnVlKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKFxuICAgICAgaWQsXG4gICAgICBkZWZpbml0aW9uXG4gICAgKSB7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1t0eXBlICsgJ3MnXVtpZF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGlmICh0eXBlID09PSAnY29tcG9uZW50JyAmJiBjb25maWcuaXNSZXNlcnZlZFRhZyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgICAgICAgICAnaWQ6ICcgKyBpZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBkZWZpbml0aW9uLm5hbWUgPSBkZWZpbml0aW9uLm5hbWUgfHwgaWQ7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQoZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdkaXJlY3RpdmUnICYmIHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHsgYmluZDogZGVmaW5pdGlvbiwgdXBkYXRlOiBkZWZpbml0aW9uIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXSA9IGRlZmluaXRpb247XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qICAqL1xuXG52YXIgcGF0dGVyblR5cGVzID0gW1N0cmluZywgUmVnRXhwLCBBcnJheV07XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgJiYgKG9wdHMuQ3Rvci5vcHRpb25zLm5hbWUgfHwgb3B0cy50YWcpXG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMgKHBhdHRlcm4sIG5hbWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTFcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zcGxpdCgnLCcpLmluZGV4T2YobmFtZSkgPiAtMVxuICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChuYW1lKVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBwcnVuZUNhY2hlIChjYWNoZSwgY3VycmVudCwgZmlsdGVyKSB7XG4gIGZvciAodmFyIGtleSBpbiBjYWNoZSkge1xuICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTtcbiAgICBpZiAoY2FjaGVkTm9kZSkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNhY2hlZE5vZGUuY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7XG4gICAgICAgIGlmIChjYWNoZWROb2RlICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlW2tleV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcnVuZUNhY2hlRW50cnkgKHZub2RlKSB7XG4gIGlmICh2bm9kZSkge1xuICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7XG4gIH1cbn1cblxudmFyIEtlZXBBbGl2ZSA9IHtcbiAgbmFtZTogJ2tlZXAtYWxpdmUnLFxuICBhYnN0cmFjdDogdHJ1ZSxcblxuICBwcm9wczoge1xuICAgIGluY2x1ZGU6IHBhdHRlcm5UeXBlcyxcbiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXNcbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHtcbiAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfSxcblxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcyQxLmNhY2hlKSB7XG4gICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlW2tleV0pO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGluY2x1ZGU6IGZ1bmN0aW9uIGluY2x1ZGUgKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzLmNhY2hlLCB0aGlzLl92bm9kZSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7XG4gICAgfSxcbiAgICBleGNsdWRlOiBmdW5jdGlvbiBleGNsdWRlICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcy5jYWNoZSwgdGhpcy5fdm5vZGUsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiAhbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkge1xuICAgIHZhciB2bm9kZSA9IGdldEZpcnN0Q29tcG9uZW50Q2hpbGQodGhpcy4kc2xvdHMuZGVmYXVsdCk7XG4gICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7XG4gICAgICAvLyBjaGVjayBwYXR0ZXJuXG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICBpZiAobmFtZSAmJiAoXG4gICAgICAgICh0aGlzLmluY2x1ZGUgJiYgIW1hdGNoZXModGhpcy5pbmNsdWRlLCBuYW1lKSkgfHxcbiAgICAgICAgKHRoaXMuZXhjbHVkZSAmJiBtYXRjaGVzKHRoaXMuZXhjbHVkZSwgbmFtZSkpXG4gICAgICApKSB7XG4gICAgICAgIHJldHVybiB2bm9kZVxuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHZub2RlLmtleSA9PSBudWxsXG4gICAgICAgIC8vIHNhbWUgY29uc3RydWN0b3IgbWF5IGdldCByZWdpc3RlcmVkIGFzIGRpZmZlcmVudCBsb2NhbCBjb21wb25lbnRzXG4gICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSlcbiAgICAgICAgPyBjb21wb25lbnRPcHRpb25zLkN0b3IuY2lkICsgKGNvbXBvbmVudE9wdGlvbnMudGFnID8gKFwiOjpcIiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpXG4gICAgICAgIDogdm5vZGUua2V5O1xuICAgICAgaWYgKHRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuY2FjaGVba2V5XS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2FjaGVba2V5XSA9IHZub2RlO1xuICAgICAgfVxuICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfVxufTtcblxudmFyIGJ1aWx0SW5Db21wb25lbnRzID0ge1xuICBLZWVwQWxpdmU6IEtlZXBBbGl2ZVxufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRHbG9iYWxBUEkgKFZ1ZSkge1xuICAvLyBjb25maWdcbiAgdmFyIGNvbmZpZ0RlZiA9IHt9O1xuICBjb25maWdEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29uZmlnOyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbmZpZ0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ2NvbmZpZycsIGNvbmZpZ0RlZik7XG5cbiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuXG4gIC8vIE5PVEU6IHRoZXNlIGFyZSBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIC0gYXZvaWQgcmVseWluZyBvblxuICAvLyB0aGVtIHVubGVzcyB5b3UgYXJlIGF3YXJlIG9mIHRoZSByaXNrLlxuICBWdWUudXRpbCA9IHtcbiAgICB3YXJuOiB3YXJuLFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLFxuICAgIGRlZmluZVJlYWN0aXZlOiBkZWZpbmVSZWFjdGl2ZSQkMVxuICB9O1xuXG4gIFZ1ZS5zZXQgPSBzZXQ7XG4gIFZ1ZS5kZWxldGUgPSBkZWw7XG4gIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrO1xuXG4gIFZ1ZS5vcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIFZ1ZS5vcHRpb25zW3R5cGUgKyAncyddID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfSk7XG5cbiAgLy8gdGhpcyBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBcImJhc2VcIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdFxuICAvLyBjb21wb25lbnRzIHdpdGggaW4gV2VleCdzIG11bHRpLWluc3RhbmNlIHNjZW5hcmlvcy5cbiAgVnVlLm9wdGlvbnMuX2Jhc2UgPSBWdWU7XG5cbiAgZXh0ZW5kKFZ1ZS5vcHRpb25zLmNvbXBvbmVudHMsIGJ1aWx0SW5Db21wb25lbnRzKTtcblxuICBpbml0VXNlKFZ1ZSk7XG4gIGluaXRNaXhpbiQxKFZ1ZSk7XG4gIGluaXRFeHRlbmQoVnVlKTtcbiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7XG59XG5cbmluaXRHbG9iYWxBUEkoVnVlJDIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlJDIucHJvdG90eXBlLCAnJGlzU2VydmVyJywge1xuICBnZXQ6IGlzU2VydmVyUmVuZGVyaW5nXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSQyLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0Jywge1xuICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dFxuICB9XG59KTtcblxuVnVlJDIudmVyc2lvbiA9ICcyLjQuMic7XG5cbi8qIGdsb2JhbHMgcmVuZGVyZXIgKi9cbi8vIHJlbmRlcmVyIGlzIGluamVjdGVkIGJ5IHdlZXggZmFjdG9yeSB3cmFwcGVyXG5cbnZhciBuYW1lc3BhY2VNYXAgPSB7fTtcblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCQxICh0YWdOYW1lKSB7XG4gIHJldHVybiBuZXcgcmVuZGVyZXIuRWxlbWVudCh0YWdOYW1lKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkge1xuICByZXR1cm4gbmV3IHJlbmRlcmVyLkVsZW1lbnQobmFtZXNwYWNlICsgJzonICsgdGFnTmFtZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUgKHRleHQpIHtcbiAgcmV0dXJuIG5ldyByZW5kZXJlci5UZXh0Tm9kZSh0ZXh0KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tZW50ICh0ZXh0KSB7XG4gIHJldHVybiBuZXcgcmVuZGVyZXIuQ29tbWVudCh0ZXh0KVxufVxuXG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUgKG5vZGUsIHRhcmdldCwgYmVmb3JlKSB7XG4gIGlmICh0YXJnZXQubm9kZVR5cGUgPT09IDMpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIG5vZGUuc2V0QXR0cigndmFsdWUnLCB0YXJnZXQudGV4dCk7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0ZXh0ID0gY3JlYXRlRWxlbWVudCQxKCd0ZXh0Jyk7XG4gICAgICB0ZXh0LnNldEF0dHIoJ3ZhbHVlJywgdGFyZ2V0LnRleHQpO1xuICAgICAgbm9kZS5pbnNlcnRCZWZvcmUodGV4dCwgYmVmb3JlKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgbm9kZS5pbnNlcnRCZWZvcmUodGFyZ2V0LCBiZWZvcmUpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZCAobm9kZSwgY2hpbGQpIHtcbiAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAzKSB7XG4gICAgbm9kZS5zZXRBdHRyKCd2YWx1ZScsICcnKTtcbiAgICByZXR1cm5cbiAgfVxuICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQgKG5vZGUsIGNoaWxkKSB7XG4gIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgbm9kZS5zZXRBdHRyKCd2YWx1ZScsIGNoaWxkLnRleHQpO1xuICAgICAgY2hpbGQucGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0ZXh0ID0gY3JlYXRlRWxlbWVudCQxKCd0ZXh0Jyk7XG4gICAgICB0ZXh0LnNldEF0dHIoJ3ZhbHVlJywgY2hpbGQudGV4dCk7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHRleHQpO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuXG5mdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7XG4gIHJldHVybiBub2RlLnBhcmVudE5vZGVcbn1cblxuZnVuY3Rpb24gbmV4dFNpYmxpbmcgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmdcbn1cblxuZnVuY3Rpb24gdGFnTmFtZSAobm9kZSkge1xuICByZXR1cm4gbm9kZS50eXBlXG59XG5cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7XG4gIG5vZGUucGFyZW50Tm9kZS5zZXRBdHRyKCd2YWx1ZScsIHRleHQpO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGUgKG5vZGUsIGtleSwgdmFsKSB7XG4gIG5vZGUuc2V0QXR0cihrZXksIHZhbCk7XG59XG5cblxudmFyIG5vZGVPcHMgPSBPYmplY3QuZnJlZXplKHtcblx0bmFtZXNwYWNlTWFwOiBuYW1lc3BhY2VNYXAsXG5cdGNyZWF0ZUVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnQkMSxcblx0Y3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsXG5cdGNyZWF0ZVRleHROb2RlOiBjcmVhdGVUZXh0Tm9kZSxcblx0Y3JlYXRlQ29tbWVudDogY3JlYXRlQ29tbWVudCxcblx0aW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsXG5cdHJlbW92ZUNoaWxkOiByZW1vdmVDaGlsZCxcblx0YXBwZW5kQ2hpbGQ6IGFwcGVuZENoaWxkLFxuXHRwYXJlbnROb2RlOiBwYXJlbnROb2RlLFxuXHRuZXh0U2libGluZzogbmV4dFNpYmxpbmcsXG5cdHRhZ05hbWU6IHRhZ05hbWUsXG5cdHNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCxcblx0c2V0QXR0cmlidXRlOiBzZXRBdHRyaWJ1dGVcbn0pO1xuXG4vKiAgKi9cblxudmFyIHJlZiA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7XG4gICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgaWYgKG9sZFZub2RlLmRhdGEucmVmICE9PSB2bm9kZS5kYXRhLnJlZikge1xuICAgICAgcmVnaXN0ZXJSZWYob2xkVm5vZGUsIHRydWUpO1xuICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICAgIH1cbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICByZWdpc3RlclJlZih2bm9kZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7XG4gIHZhciBrZXkgPSB2bm9kZS5kYXRhLnJlZjtcbiAgaWYgKCFrZXkpIHsgcmV0dXJuIH1cblxuICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0O1xuICB2YXIgcmVmID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgfHwgdm5vZGUuZWxtO1xuICB2YXIgcmVmcyA9IHZtLiRyZWZzO1xuICBpZiAoaXNSZW1vdmFsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVmc1trZXldKSkge1xuICAgICAgcmVtb3ZlKHJlZnNba2V5XSwgcmVmKTtcbiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7XG4gICAgICByZWZzW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2bm9kZS5kYXRhLnJlZkluRm9yKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVmc1trZXldKSkge1xuICAgICAgICByZWZzW2tleV0gPSBbcmVmXTtcbiAgICAgIH0gZWxzZSBpZiAocmVmc1trZXldLmluZGV4T2YocmVmKSA8IDApIHtcbiAgICAgICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZnNba2V5XSA9IHJlZjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnlcbiAqIFNpbW9uIEZyaWlzIFZpbmR1bSAoQHBhbGRlcGluZClcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKlxuICogbW9kaWZpZWQgYnkgRXZhbiBZb3UgKEB5eXg5OTA4MDMpXG4gKlxuXG4vKlxuICogTm90IHR5cGUtY2hlY2tpbmcgdGhpcyBiZWNhdXNlIHRoaXMgZmlsZSBpcyBwZXJmLWNyaXRpY2FsIGFuZCB0aGUgY29zdFxuICogb2YgbWFraW5nIGZsb3cgdW5kZXJzdGFuZCBpdCBpcyBub3Qgd29ydGggaXQuXG4gKi9cblxudmFyIGVtcHR5Tm9kZSA9IG5ldyBWTm9kZSgnJywge30sIFtdKTtcblxudmFyIGhvb2tzID0gWydjcmVhdGUnLCAnYWN0aXZhdGUnLCAndXBkYXRlJywgJ3JlbW92ZScsICdkZXN0cm95J107XG5cbmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikge1xuICByZXR1cm4gKFxuICAgIGEua2V5ID09PSBiLmtleSAmJiAoXG4gICAgICAoXG4gICAgICAgIGEudGFnID09PSBiLnRhZyAmJlxuICAgICAgICBhLmlzQ29tbWVudCA9PT0gYi5pc0NvbW1lbnQgJiZcbiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJlxuICAgICAgICBzYW1lSW5wdXRUeXBlKGEsIGIpXG4gICAgICApIHx8IChcbiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJlxuICAgICAgICBhLmFzeW5jRmFjdG9yeSA9PT0gYi5hc3luY0ZhY3RvcnkgJiZcbiAgICAgICAgaXNVbmRlZihiLmFzeW5jRmFjdG9yeS5lcnJvcilcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuLy8gU29tZSBicm93c2VycyBkbyBub3Qgc3VwcG9ydCBkeW5hbWljYWxseSBjaGFuZ2luZyB0eXBlIGZvciA8aW5wdXQ+XG4vLyBzbyB0aGV5IG5lZWQgdG8gYmUgdHJlYXRlZCBhcyBkaWZmZXJlbnQgbm9kZXNcbmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHtcbiAgaWYgKGEudGFnICE9PSAnaW5wdXQnKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGk7XG4gIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHZhciB0eXBlQiA9IGlzRGVmKGkgPSBiLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHJldHVybiB0eXBlQSA9PT0gdHlwZUJcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHggKGNoaWxkcmVuLCBiZWdpbklkeCwgZW5kSWR4KSB7XG4gIHZhciBpLCBrZXk7XG4gIHZhciBtYXAgPSB7fTtcbiAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHtcbiAgICBrZXkgPSBjaGlsZHJlbltpXS5rZXk7XG4gICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9XG4gIH1cbiAgcmV0dXJuIG1hcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRjaEZ1bmN0aW9uIChiYWNrZW5kKSB7XG4gIHZhciBpLCBqO1xuICB2YXIgY2JzID0ge307XG5cbiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7XG4gIHZhciBub2RlT3BzID0gYmFja2VuZC5ub2RlT3BzO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgIGNic1tob29rc1tpXV0gPSBbXTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbW9kdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkge1xuICAgICAgICBjYnNbaG9va3NbaV1dLnB1c2gobW9kdWxlc1tqXVtob29rc1tpXV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHtcbiAgICByZXR1cm4gbmV3IFZOb2RlKG5vZGVPcHMudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCksIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSbUNiIChjaGlsZEVsbSwgbGlzdGVuZXJzKSB7XG4gICAgZnVuY3Rpb24gcmVtb3ZlJCQxICgpIHtcbiAgICAgIGlmICgtLXJlbW92ZSQkMS5saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTm9kZShjaGlsZEVsbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlbW92ZSQkMS5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gICAgcmV0dXJuIHJlbW92ZSQkMVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlTm9kZSAoZWwpIHtcbiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTtcbiAgICAvLyBlbGVtZW50IG1heSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGR1ZSB0byB2LWh0bWwgLyB2LXRleHRcbiAgICBpZiAoaXNEZWYocGFyZW50KSkge1xuICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5QcmUgPSAwO1xuICBmdW5jdGlvbiBjcmVhdGVFbG0gKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBuZXN0ZWQpIHtcbiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVja1xuICAgIGlmIChjcmVhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgdmFyIHRhZyA9IHZub2RlLnRhZztcbiAgICBpZiAoaXNEZWYodGFnKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5wcmUpIHtcbiAgICAgICAgICBpblByZSsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaW5QcmUgJiZcbiAgICAgICAgICAhdm5vZGUubnMgJiZcbiAgICAgICAgICAhKGNvbmZpZy5pZ25vcmVkRWxlbWVudHMubGVuZ3RoICYmIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMuaW5kZXhPZih0YWcpID4gLTEpICYmXG4gICAgICAgICAgY29uZmlnLmlzVW5rbm93bkVsZW1lbnQodGFnKVxuICAgICAgICApIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgJ1Vua25vd24gY3VzdG9tIGVsZW1lbnQ6IDwnICsgdGFnICsgJz4gLSBkaWQgeW91ICcgK1xuICAgICAgICAgICAgJ3JlZ2lzdGVyIHRoZSBjb21wb25lbnQgY29ycmVjdGx5PyBGb3IgcmVjdXJzaXZlIGNvbXBvbmVudHMsICcgK1xuICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSBcIm5hbWVcIiBvcHRpb24uJyxcbiAgICAgICAgICAgIHZub2RlLmNvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2bm9kZS5lbG0gPSB2bm9kZS5uc1xuICAgICAgICA/IG5vZGVPcHMuY3JlYXRlRWxlbWVudE5TKHZub2RlLm5zLCB0YWcpXG4gICAgICAgIDogbm9kZU9wcy5jcmVhdGVFbGVtZW50KHRhZywgdm5vZGUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIHtcbiAgICAgICAgLy8gaW4gV2VleCwgdGhlIGRlZmF1bHQgaW5zZXJ0aW9uIG9yZGVyIGlzIHBhcmVudC1maXJzdC5cbiAgICAgICAgLy8gTGlzdCBpdGVtcyBjYW4gYmUgb3B0aW1pemVkIHRvIHVzZSBjaGlsZHJlbi1maXJzdCBpbnNlcnRpb25cbiAgICAgICAgLy8gd2l0aCBhcHBlbmQ9XCJ0cmVlXCIuXG4gICAgICAgIHZhciBhcHBlbmRBc1RyZWUgPSBpc0RlZihkYXRhKSAmJiBpc1RydWUoZGF0YS5hcHBlbmRBc1RyZWUpO1xuICAgICAgICBpZiAoIWFwcGVuZEFzVHJlZSkge1xuICAgICAgICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIGlmIChhcHBlbmRBc1RyZWUpIHtcbiAgICAgICAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgICAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGF0YSAmJiBkYXRhLnByZSkge1xuICAgICAgICBpblByZS0tO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNUcnVlKHZub2RlLmlzQ29tbWVudCkpIHtcbiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTtcbiAgICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTtcbiAgICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7XG4gICAgdmFyIGkgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgdmFyIGlzUmVhY3RpdmF0ZWQgPSBpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkgJiYgaS5rZWVwQWxpdmU7XG4gICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHtcbiAgICAgICAgaSh2bm9kZSwgZmFsc2UgLyogaHlkcmF0aW5nICovLCBwYXJlbnRFbG0sIHJlZkVsbSk7XG4gICAgICB9XG4gICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudFxuICAgICAgLy8gaXQgc2hvdWxkJ3ZlIGNyZWF0ZWQgYSBjaGlsZCBpbnN0YW5jZSBhbmQgbW91bnRlZCBpdC4gdGhlIGNoaWxkXG4gICAgICAvLyBjb21wb25lbnQgYWxzbyBoYXMgc2V0IHRoZSBwbGFjZWhvbGRlciB2bm9kZSdzIGVsbS5cbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuXG4gICAgICBpZiAoaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpKSB7XG4gICAgICAgIGluaXRDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHtcbiAgICAgICAgICByZWFjdGl2YXRlQ29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkge1xuICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2guYXBwbHkoaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQpO1xuICAgICAgdm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gbnVsbDtcbiAgICB9XG4gICAgdm5vZGUuZWxtID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuJGVsO1xuICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC5cbiAgICAgIC8vIHNraXAgYWxsIGVsZW1lbnQtcmVsYXRlZCBtb2R1bGVzIGV4Y2VwdCBmb3IgcmVmICgjMzQ1NSlcbiAgICAgIHJlZ2lzdGVyUmVmKHZub2RlKTtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rXG4gICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhY3RpdmF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaTtcbiAgICAvLyBoYWNrIGZvciAjNDMzOTogYSByZWFjdGl2YXRlZCBjb21wb25lbnQgd2l0aCBpbm5lciB0cmFuc2l0aW9uXG4gICAgLy8gZG9lcyBub3QgdHJpZ2dlciBiZWNhdXNlIHRoZSBpbm5lciBub2RlJ3MgY3JlYXRlZCBob29rcyBhcmUgbm90IGNhbGxlZFxuICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dFxuICAgIC8vIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gaXQuXG4gICAgdmFyIGlubmVyTm9kZSA9IHZub2RlO1xuICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGlubmVyTm9kZSA9IGlubmVyTm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgICBpZiAoaXNEZWYoaSA9IGlubmVyTm9kZS5kYXRhKSAmJiBpc0RlZihpID0gaS50cmFuc2l0aW9uKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY2JzLmFjdGl2YXRlW2ldKGVtcHR5Tm9kZSwgaW5uZXJOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmxpa2UgYSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudCxcbiAgICAvLyBhIHJlYWN0aXZhdGVkIGtlZXAtYWxpdmUgY29tcG9uZW50IGRvZXNuJ3QgaW5zZXJ0IGl0c2VsZlxuICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkge1xuICAgIGlmIChpc0RlZihwYXJlbnQpKSB7XG4gICAgICBpZiAoaXNEZWYocmVmJCQxKSkge1xuICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkge1xuICAgICAgICAgIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudCwgZWxtLCByZWYkJDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHBhcmVudCwgZWxtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2bm9kZS50ZXh0KSkge1xuICAgICAgbm9kZU9wcy5hcHBlbmRDaGlsZCh2bm9kZS5lbG0sIG5vZGVPcHMuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUGF0Y2hhYmxlICh2bm9kZSkge1xuICAgIHdoaWxlICh2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkge1xuICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgfVxuICAgIHJldHVybiBpc0RlZih2bm9kZS50YWcpXG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VDcmVhdGVIb29rcyAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkge1xuICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZVxuICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgaWYgKGlzRGVmKGkuY3JlYXRlKSkgeyBpLmNyZWF0ZShlbXB0eU5vZGUsIHZub2RlKTsgfVxuICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH1cbiAgICB9XG4gIH1cblxuICAvLyBzZXQgc2NvcGUgaWQgYXR0cmlidXRlIGZvciBzY29wZWQgQ1NTLlxuICAvLyB0aGlzIGlzIGltcGxlbWVudGVkIGFzIGEgc3BlY2lhbCBjYXNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZFxuICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuXG4gIGZ1bmN0aW9uIHNldFNjb3BlICh2bm9kZSkge1xuICAgIHZhciBpO1xuICAgIHZhciBhbmNlc3RvciA9IHZub2RlO1xuICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgaWYgKGlzRGVmKGkgPSBhbmNlc3Rvci5jb250ZXh0KSAmJiBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkpIHtcbiAgICAgICAgbm9kZU9wcy5zZXRBdHRyaWJ1dGUodm5vZGUuZWxtLCBpLCAnJyk7XG4gICAgICB9XG4gICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcbiAgICB9XG4gICAgLy8gZm9yIHNsb3QgY29udGVudCB0aGV5IHNob3VsZCBhbHNvIGdldCB0aGUgc2NvcGVJZCBmcm9tIHRoZSBob3N0IGluc3RhbmNlLlxuICAgIGlmIChpc0RlZihpID0gYWN0aXZlSW5zdGFuY2UpICYmXG4gICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmXG4gICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZClcbiAgICApIHtcbiAgICAgIG5vZGVPcHMuc2V0QXR0cmlidXRlKHZub2RlLmVsbSwgaSwgJycpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgY3JlYXRlRWxtKHZub2Rlc1tzdGFydElkeF0sIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rICh2bm9kZSkge1xuICAgIHZhciBpLCBqO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7IGNicy5kZXN0cm95W2ldKHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkge1xuICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGludm9rZURlc3Ryb3lIb29rKHZub2RlLmNoaWxkcmVuW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVWbm9kZXMgKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKGlzRGVmKGNoLnRhZykpIHtcbiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTtcbiAgICAgICAgICBpbnZva2VEZXN0cm95SG9vayhjaCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIFRleHQgbm9kZVxuICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkge1xuICAgIGlmIChpc0RlZihybSkgfHwgaXNEZWYodm5vZGUuZGF0YSkpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTtcbiAgICAgIGlmIChpc0RlZihybSkpIHtcbiAgICAgICAgLy8gd2UgaGF2ZSBhIHJlY3Vyc2l2ZWx5IHBhc3NlZCBkb3duIHJtIGNhbGxiYWNrXG4gICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnRcbiAgICAgICAgcm0ubGlzdGVuZXJzICs9IGxpc3RlbmVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nXG4gICAgICAgIHJtID0gY3JlYXRlUm1DYih2bm9kZS5lbG0sIGxpc3RlbmVycyk7XG4gICAgICB9XG4gICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkgJiYgaXNEZWYoaSA9IGkuX3Zub2RlKSAmJiBpc0RlZihpLmRhdGEpKSB7XG4gICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soaSwgcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5yZW1vdmUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2JzLnJlbW92ZVtpXSh2bm9kZSwgcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnJlbW92ZSkpIHtcbiAgICAgICAgaSh2bm9kZSwgcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlTm9kZSh2bm9kZS5lbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuIChwYXJlbnRFbG0sIG9sZENoLCBuZXdDaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7XG4gICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDtcbiAgICB2YXIgbmV3U3RhcnRJZHggPSAwO1xuICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07XG4gICAgdmFyIG9sZEVuZFZub2RlID0gb2xkQ2hbb2xkRW5kSWR4XTtcbiAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdO1xuICAgIHZhciBuZXdFbmRWbm9kZSA9IG5ld0NoW25ld0VuZElkeF07XG4gICAgdmFyIG9sZEtleVRvSWR4LCBpZHhJbk9sZCwgZWxtVG9Nb3ZlLCByZWZFbG07XG5cbiAgICAvLyByZW1vdmVPbmx5IGlzIGEgc3BlY2lhbCBmbGFnIHVzZWQgb25seSBieSA8dHJhbnNpdGlvbi1ncm91cD5cbiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zXG4gICAgLy8gZHVyaW5nIGxlYXZpbmcgdHJhbnNpdGlvbnNcbiAgICB2YXIgY2FuTW92ZSA9ICFyZW1vdmVPbmx5O1xuXG4gICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHtcbiAgICAgIGlmIChpc1VuZGVmKG9sZFN0YXJ0Vm5vZGUpKSB7XG4gICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsgLy8gVm5vZGUgaGFzIGJlZW4gbW92ZWQgbGVmdFxuICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkge1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7XG4gICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSkpIHsgLy8gVm5vZGUgbW92ZWQgcmlnaHRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpO1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07XG4gICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9XG4gICAgICAgIGlkeEluT2xkID0gaXNEZWYobmV3U3RhcnRWbm9kZS5rZXkpID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldIDogbnVsbDtcbiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50XG4gICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhZWxtVG9Nb3ZlKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAnSXQgc2VlbXMgdGhlcmUgYXJlIGR1cGxpY2F0ZSBrZXlzIHRoYXQgaXMgY2F1c2luZyBhbiB1cGRhdGUgZXJyb3IuICcgK1xuICAgICAgICAgICAgICAnTWFrZSBzdXJlIGVhY2ggdi1mb3IgaXRlbSBoYXMgYSB1bmlxdWUga2V5LidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzYW1lVm5vZGUoZWxtVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICAgICAgcGF0Y2hWbm9kZShlbG1Ub01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgZWxtVG9Nb3ZlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzYW1lIGtleSBidXQgZGlmZmVyZW50IGVsZW1lbnQuIHRyZWF0IGFzIG5ldyBlbGVtZW50XG4gICAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7XG4gICAgICByZWZFbG0gPSBpc1VuZGVmKG5ld0NoW25ld0VuZElkeCArIDFdKSA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCByZWZFbG0sIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHtcbiAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0sIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkge1xuICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBlbG0gPSB2bm9kZS5lbG0gPSBvbGRWbm9kZS5lbG07XG5cbiAgICBpZiAoaXNUcnVlKG9sZFZub2RlLmlzQXN5bmNQbGFjZWhvbGRlcikpIHtcbiAgICAgIGlmIChpc0RlZih2bm9kZS5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpKSB7XG4gICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmlzQXN5bmNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyByZXVzZSBlbGVtZW50IGZvciBzdGF0aWMgdHJlZXMuXG4gICAgLy8gbm90ZSB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHZub2RlIGlzIGNsb25lZCAtXG4gICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuXG4gICAgLy8gcmVzZXQgYnkgdGhlIGhvdC1yZWxvYWQtYXBpIGFuZCB3ZSBuZWVkIHRvIGRvIGEgcHJvcGVyIHJlLXJlbmRlci5cbiAgICBpZiAoaXNUcnVlKHZub2RlLmlzU3RhdGljKSAmJlxuICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJlxuICAgICAgdm5vZGUua2V5ID09PSBvbGRWbm9kZS5rZXkgJiZcbiAgICAgIChpc1RydWUodm5vZGUuaXNDbG9uZWQpIHx8IGlzVHJ1ZSh2bm9kZS5pc09uY2UpKVxuICAgICkge1xuICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBpO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucHJlcGF0Y2gpKSB7XG4gICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIG9sZENoID0gb2xkVm5vZGUuY2hpbGRyZW47XG4gICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGlzRGVmKGRhdGEpICYmIGlzUGF0Y2hhYmxlKHZub2RlKSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy51cGRhdGUubGVuZ3RoOyArK2kpIHsgY2JzLnVwZGF0ZVtpXShvbGRWbm9kZSwgdm5vZGUpOyB9XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH1cbiAgICB9XG4gICAgaWYgKGlzVW5kZWYodm5vZGUudGV4dCkpIHtcbiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7XG4gICAgICAgIGlmIChvbGRDaCAhPT0gY2gpIHsgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSk7IH1cbiAgICAgIH0gZWxzZSBpZiAoaXNEZWYoY2gpKSB7XG4gICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9XG4gICAgICAgIGFkZFZub2RlcyhlbG0sIG51bGwsIGNoLCAwLCBjaC5sZW5ndGggLSAxLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRDaCkpIHtcbiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkge1xuICAgICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2xkVm5vZGUudGV4dCAhPT0gdm5vZGUudGV4dCkge1xuICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wb3N0cGF0Y2gpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkge1xuICAgIC8vIGRlbGF5IGluc2VydCBob29rcyBmb3IgY29tcG9uZW50IHJvb3Qgbm9kZXMsIGludm9rZSB0aGVtIGFmdGVyIHRoZVxuICAgIC8vIGVsZW1lbnQgaXMgcmVhbGx5IGluc2VydGVkXG4gICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7XG4gICAgICB2bm9kZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gcXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcXVldWVbaV0uZGF0YS5ob29rLmluc2VydChxdWV1ZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhaWxlZCA9IGZhbHNlO1xuICAvLyBsaXN0IG9mIG1vZHVsZXMgdGhhdCBjYW4gc2tpcCBjcmVhdGUgaG9vayBkdXJpbmcgaHlkcmF0aW9uIGJlY2F1c2UgdGhleVxuICAvLyBhcmUgYWxyZWFkeSByZW5kZXJlZCBvbiB0aGUgY2xpZW50IG9yIGhhcyBubyBuZWVkIGZvciBpbml0aWFsaXphdGlvblxuICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLHN0eWxlLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpO1xuXG4gIC8vIE5vdGU6IHRoaXMgaXMgYSBicm93c2VyLW9ubHkgZnVuY3Rpb24gc28gd2UgY2FuIGFzc3VtZSBlbG1zIGFyZSBET00gbm9kZXMuXG4gIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSAmJiBpc0RlZih2bm9kZS5hc3luY0ZhY3RvcnkpKSB7XG4gICAgICB2bm9kZS5lbG0gPSBlbG07XG4gICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICB2bm9kZS5lbG0gPSBlbG07XG4gICAgdmFyIHRhZyA9IHZub2RlLnRhZztcbiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsgaSh2bm9kZSwgdHJ1ZSAvKiBoeWRyYXRpbmcgKi8pOyB9XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS5cbiAgICAgICAgaW5pdENvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKHRhZykpIHtcbiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHtcbiAgICAgICAgLy8gZW1wdHkgZWxlbWVudCwgYWxsb3cgY2xpZW50IHRvIHBpY2sgdXAgYW5kIHBvcHVsYXRlIGNoaWxkcmVuXG4gICAgICAgIGlmICghZWxtLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5NYXRjaCA9IHRydWU7XG4gICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGVsbS5maXJzdENoaWxkO1xuICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgICAgIGlmICghY2hpbGROb2RlIHx8ICFoeWRyYXRlKGNoaWxkTm9kZSwgY2hpbGRyZW5baSQxXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSkge1xuICAgICAgICAgICAgICBjaGlsZHJlbk1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXNcbiAgICAgICAgICAvLyBsb25nZXIgdGhhbiB0aGUgdmlydHVhbCBjaGlsZHJlbiBsaXN0LlxuICAgICAgICAgIGlmICghY2hpbGRyZW5NYXRjaCB8fCBjaGlsZE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAhYmFpbGVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWlzbWF0Y2hpbmcgY2hpbGROb2RlcyB2cy4gVk5vZGVzOiAnLCBlbG0uY2hpbGROb2RlcywgY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBpZiAoIWlzUmVuZGVyZWRNb2R1bGUoa2V5KSkge1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHtcbiAgICAgIGVsbS5kYXRhID0gdm5vZGUudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUudGFnKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdm5vZGUudGFnLmluZGV4T2YoJ3Z1ZS1jb21wb25lbnQnKSA9PT0gMCB8fFxuICAgICAgICB2bm9kZS50YWcudG9Mb3dlckNhc2UoKSA9PT0gKG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09ICh2bm9kZS5pc0NvbW1lbnQgPyA4IDogMylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkge1xuICAgIGlmIChpc1VuZGVmKHZub2RlKSkge1xuICAgICAgaWYgKGlzRGVmKG9sZFZub2RlKSkgeyBpbnZva2VEZXN0cm95SG9vayhvbGRWbm9kZSk7IH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlO1xuICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTtcblxuICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkge1xuICAgICAgLy8gZW1wdHkgbW91bnQgKGxpa2VseSBhcyBjb21wb25lbnQpLCBjcmVhdGUgbmV3IHJvb3QgZWxlbWVudFxuICAgICAgaXNJbml0aWFsUGF0Y2ggPSB0cnVlO1xuICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlzUmVhbEVsZW1lbnQgPSBpc0RlZihvbGRWbm9kZS5ub2RlVHlwZSk7XG4gICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHtcbiAgICAgICAgLy8gcGF0Y2ggZXhpc3Rpbmcgcm9vdCBub2RlXG4gICAgICAgIHBhdGNoVm5vZGUob2xkVm5vZGUsIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHJlbW92ZU9ubHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzUmVhbEVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBtb3VudGluZyB0byBhIHJlYWwgZWxlbWVudFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtXG4gICAgICAgICAgLy8gYSBzdWNjZXNzZnVsIGh5ZHJhdGlvbi5cbiAgICAgICAgICBpZiAob2xkVm5vZGUubm9kZVR5cGUgPT09IDEgJiYgb2xkVm5vZGUuaGFzQXR0cmlidXRlKFNTUl9BVFRSKSkge1xuICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTtcbiAgICAgICAgICAgIGh5ZHJhdGluZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkge1xuICAgICAgICAgICAgaWYgKGh5ZHJhdGUob2xkVm5vZGUsIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpKSB7XG4gICAgICAgICAgICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgJ1RoZSBjbGllbnQtc2lkZSByZW5kZXJlZCB2aXJ0dWFsIERPTSB0cmVlIGlzIG5vdCBtYXRjaGluZyAnICtcbiAgICAgICAgICAgICAgICAnc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBpbmNvcnJlY3QgJyArXG4gICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICtcbiAgICAgICAgICAgICAgICAnPHA+LCBvciBtaXNzaW5nIDx0Ym9keT4uIEJhaWxpbmcgaHlkcmF0aW9uIGFuZCBwZXJmb3JtaW5nICcgK1xuICAgICAgICAgICAgICAgICdmdWxsIGNsaWVudC1zaWRlIHJlbmRlci4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLlxuICAgICAgICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBub2RlIGFuZCByZXBsYWNlIGl0XG4gICAgICAgICAgb2xkVm5vZGUgPSBlbXB0eU5vZGVBdChvbGRWbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgICAgdmFyIG9sZEVsbSA9IG9sZFZub2RlLmVsbTtcbiAgICAgICAgdmFyIHBhcmVudEVsbSQxID0gbm9kZU9wcy5wYXJlbnROb2RlKG9sZEVsbSk7XG4gICAgICAgIGNyZWF0ZUVsbShcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUsXG4gICAgICAgICAgLy8gZXh0cmVtZWx5IHJhcmUgZWRnZSBjYXNlOiBkbyBub3QgaW5zZXJ0IGlmIG9sZCBlbGVtZW50IGlzIGluIGFcbiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICtcbiAgICAgICAgICAvLyBrZWVwLWFsaXZlICsgSE9Dcy4gKCM0NTkwKVxuICAgICAgICAgIG9sZEVsbS5fbGVhdmVDYiA/IG51bGwgOiBwYXJlbnRFbG0kMSxcbiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkge1xuICAgICAgICAgIC8vIGNvbXBvbmVudCByb290IGVsZW1lbnQgcmVwbGFjZWQuXG4gICAgICAgICAgLy8gdXBkYXRlIHBhcmVudCBwbGFjZWhvbGRlciBub2RlIGVsZW1lbnQsIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50O1xuICAgICAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgYW5jZXN0b3IuZWxtID0gdm5vZGUuZWxtO1xuICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICBjYnMuY3JlYXRlW2ldKGVtcHR5Tm9kZSwgdm5vZGUucGFyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7XG4gICAgICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSQxLCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50YWcpKSB7XG4gICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW52b2tlSW5zZXJ0SG9vayh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpc0luaXRpYWxQYXRjaCk7XG4gICAgcmV0dXJuIHZub2RlLmVsbVxuICB9XG59XG5cbi8qICAqL1xuXG52YXIgZGlyZWN0aXZlcyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVEaXJlY3RpdmVzLFxuICB1cGRhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7XG4gICAgdXBkYXRlRGlyZWN0aXZlcyh2bm9kZSwgZW1wdHlOb2RlKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmIChvbGRWbm9kZS5kYXRhLmRpcmVjdGl2ZXMgfHwgdm5vZGUuZGF0YS5kaXJlY3RpdmVzKSB7XG4gICAgX3VwZGF0ZShvbGRWbm9kZSwgdm5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgaXNDcmVhdGUgPSBvbGRWbm9kZSA9PT0gZW1wdHlOb2RlO1xuICB2YXIgaXNEZXN0cm95ID0gdm5vZGUgPT09IGVtcHR5Tm9kZTtcbiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTtcbiAgdmFyIG5ld0RpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEodm5vZGUuZGF0YS5kaXJlY3RpdmVzLCB2bm9kZS5jb250ZXh0KTtcblxuICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTtcbiAgdmFyIGRpcnNXaXRoUG9zdHBhdGNoID0gW107XG5cbiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7XG4gIGZvciAoa2V5IGluIG5ld0RpcnMpIHtcbiAgICBvbGREaXIgPSBvbGREaXJzW2tleV07XG4gICAgZGlyID0gbmV3RGlyc1trZXldO1xuICAgIGlmICghb2xkRGlyKSB7XG4gICAgICAvLyBuZXcgZGlyZWN0aXZlLCBiaW5kXG4gICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5pbnNlcnRlZCkge1xuICAgICAgICBkaXJzV2l0aEluc2VydC5wdXNoKGRpcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGV4aXN0aW5nIGRpcmVjdGl2ZSwgdXBkYXRlXG4gICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7XG4gICAgICBjYWxsSG9vayQxKGRpciwgJ3VwZGF0ZScsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmNvbXBvbmVudFVwZGF0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aEluc2VydC5sZW5ndGgpIHtcbiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhJbnNlcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aEluc2VydFtpXSwgJ2luc2VydGVkJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc0NyZWF0ZSkge1xuICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUuZGF0YS5ob29rIHx8ICh2bm9kZS5kYXRhLmhvb2sgPSB7fSksICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbEluc2VydCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHtcbiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZS5kYXRhLmhvb2sgfHwgKHZub2RlLmRhdGEuaG9vayA9IHt9KSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhQb3N0cGF0Y2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFpc0NyZWF0ZSkge1xuICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHtcbiAgICAgIGlmICghbmV3RGlyc1trZXldKSB7XG4gICAgICAgIC8vIG5vIGxvbmdlciBwcmVzZW50LCB1bmJpbmRcbiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSAoXG4gIGRpcnMsXG4gIHZtXG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmICghZGlycykge1xuICAgIHJldHVybiByZXNcbiAgfVxuICB2YXIgaSwgZGlyO1xuICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykge1xuICAgIGRpciA9IGRpcnNbaV07XG4gICAgaWYgKCFkaXIubW9kaWZpZXJzKSB7XG4gICAgICBkaXIubW9kaWZpZXJzID0gZW1wdHlNb2RpZmllcnM7XG4gICAgfVxuICAgIHJlc1tnZXRSYXdEaXJOYW1lKGRpcildID0gZGlyO1xuICAgIGRpci5kZWYgPSByZXNvbHZlQXNzZXQodm0uJG9wdGlvbnMsICdkaXJlY3RpdmVzJywgZGlyLm5hbWUsIHRydWUpO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGlyTmFtZSAoZGlyKSB7XG4gIHJldHVybiBkaXIucmF3TmFtZSB8fCAoKGRpci5uYW1lKSArIFwiLlwiICsgKE9iamVjdC5rZXlzKGRpci5tb2RpZmllcnMgfHwge30pLmpvaW4oJy4nKSkpXG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rJDEgKGRpciwgaG9vaywgdm5vZGUsIG9sZFZub2RlLCBpc0Rlc3Ryb3kpIHtcbiAgdmFyIGZuID0gZGlyLmRlZiAmJiBkaXIuZGVmW2hvb2tdO1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgZm4odm5vZGUuZWxtLCBkaXIsIHZub2RlLCBvbGRWbm9kZSwgaXNEZXN0cm95KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bm9kZS5jb250ZXh0LCAoXCJkaXJlY3RpdmUgXCIgKyAoZGlyLm5hbWUpICsgXCIgXCIgKyBob29rICsgXCIgaG9va1wiKSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBiYXNlTW9kdWxlcyA9IFtcbiAgcmVmLFxuICBkaXJlY3RpdmVzXG5dO1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gdXBkYXRlQXR0cnMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoIW9sZFZub2RlLmRhdGEuYXR0cnMgJiYgIXZub2RlLmRhdGEuYXR0cnMpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIga2V5LCBjdXIsIG9sZDtcbiAgdmFyIGVsbSA9IHZub2RlLmVsbTtcbiAgdmFyIG9sZEF0dHJzID0gb2xkVm5vZGUuZGF0YS5hdHRycyB8fCB7fTtcbiAgdmFyIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyB8fCB7fTtcbiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0XG4gIGlmIChhdHRycy5fX29iX18pIHtcbiAgICBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgPSBleHRlbmQoe30sIGF0dHJzKTtcbiAgfVxuXG4gIGZvciAoa2V5IGluIGF0dHJzKSB7XG4gICAgY3VyID0gYXR0cnNba2V5XTtcbiAgICBvbGQgPSBvbGRBdHRyc1trZXldO1xuICAgIGlmIChvbGQgIT09IGN1cikge1xuICAgICAgZWxtLnNldEF0dHIoa2V5LCBjdXIpO1xuICAgIH1cbiAgfVxuICBmb3IgKGtleSBpbiBvbGRBdHRycykge1xuICAgIGlmIChhdHRyc1trZXldID09IG51bGwpIHtcbiAgICAgIGVsbS5zZXRBdHRyKGtleSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBhdHRycyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVBdHRycyxcbiAgdXBkYXRlOiB1cGRhdGVBdHRyc1xufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuICB2YXIgY3R4ID0gdm5vZGUuY29udGV4dDtcblxuICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTtcbiAgaWYgKCFkYXRhLnN0YXRpY0NsYXNzICYmXG4gICAgIWRhdGEuY2xhc3MgJiZcbiAgICAoIW9sZERhdGEgfHwgKCFvbGREYXRhLnN0YXRpY0NsYXNzICYmICFvbGREYXRhLmNsYXNzKSlcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgb2xkQ2xhc3NMaXN0ID0gW107XG4gIC8vIHVubGlrZSB3ZWIsIHdlZXggdm5vZGUgc3RhdGljQ2xhc3MgaXMgYW4gQXJyYXlcbiAgdmFyIG9sZFN0YXRpY0NsYXNzID0gb2xkRGF0YS5zdGF0aWNDbGFzcztcbiAgaWYgKG9sZFN0YXRpY0NsYXNzKSB7XG4gICAgb2xkQ2xhc3NMaXN0LnB1c2guYXBwbHkob2xkQ2xhc3NMaXN0LCBvbGRTdGF0aWNDbGFzcyk7XG4gIH1cbiAgaWYgKG9sZERhdGEuY2xhc3MpIHtcbiAgICBvbGRDbGFzc0xpc3QucHVzaC5hcHBseShvbGRDbGFzc0xpc3QsIG9sZERhdGEuY2xhc3MpO1xuICB9XG5cbiAgdmFyIGNsYXNzTGlzdCA9IFtdO1xuICAvLyB1bmxpa2Ugd2ViLCB3ZWV4IHZub2RlIHN0YXRpY0NsYXNzIGlzIGFuIEFycmF5XG4gIHZhciBzdGF0aWNDbGFzcyA9IGRhdGEuc3RhdGljQ2xhc3M7XG4gIGlmIChzdGF0aWNDbGFzcykge1xuICAgIGNsYXNzTGlzdC5wdXNoLmFwcGx5KGNsYXNzTGlzdCwgc3RhdGljQ2xhc3MpO1xuICB9XG4gIGlmIChkYXRhLmNsYXNzKSB7XG4gICAgY2xhc3NMaXN0LnB1c2guYXBwbHkoY2xhc3NMaXN0LCBkYXRhLmNsYXNzKTtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IGdldFN0eWxlKG9sZENsYXNzTGlzdCwgY2xhc3NMaXN0LCBjdHgpO1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBlbC5zZXRTdHlsZShrZXksIHN0eWxlW2tleV0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0eWxlIChvbGRDbGFzc0xpc3QsIGNsYXNzTGlzdCwgY3R4KSB7XG4gIC8vIHN0eWxlIGlzIGEgd2VleC1vbmx5IGluamVjdGVkIG9iamVjdFxuICAvLyBjb21waWxlZCBmcm9tIDxzdHlsZT4gdGFncyBpbiB3ZWV4IGZpbGVzXG4gIHZhciBzdHlsZXNoZWV0ID0gY3R4LiRvcHRpb25zLnN0eWxlIHx8IHt9O1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGNsYXNzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3R5bGVzaGVldFtuYW1lXTtcbiAgICBleHRlbmQocmVzdWx0LCBzdHlsZSk7XG4gIH0pO1xuICBvbGRDbGFzc0xpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0eWxlc2hlZXRbbmFtZV07XG4gICAgZm9yICh2YXIga2V5IGluIHN0eWxlKSB7XG4gICAgICBpZiAoIXJlc3VsdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG52YXIga2xhc3MgPSB7XG4gIGNyZWF0ZTogdXBkYXRlQ2xhc3MsXG4gIHVwZGF0ZTogdXBkYXRlQ2xhc3Ncbn07XG5cbi8qICAqL1xuXG52YXIgdGFyZ2V0JDE7XG5cbmZ1bmN0aW9uIGFkZCQxIChcbiAgZXZlbnQsXG4gIGhhbmRsZXIsXG4gIG9uY2UsXG4gIGNhcHR1cmVcbikge1xuICBpZiAoY2FwdHVyZSkge1xuICAgIGNvbnNvbGUubG9nKCdXZWV4IGRvIG5vdCBzdXBwb3J0IGV2ZW50IGluIGJ1YmJsZSBwaGFzZS4nKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob25jZSkge1xuICAgIHZhciBvbGRIYW5kbGVyID0gaGFuZGxlcjtcbiAgICB2YXIgX3RhcmdldCA9IHRhcmdldCQxOyAvLyBzYXZlIGN1cnJlbnQgdGFyZ2V0IGVsZW1lbnQgaW4gY2xvc3VyZVxuICAgIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIHZhciByZXMgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgICAgID8gb2xkSGFuZGxlcihldilcbiAgICAgICAgOiBvbGRIYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICAgIHJlbW92ZSQyKGV2ZW50LCBudWxsLCBudWxsLCBfdGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHRhcmdldCQxLmFkZEV2ZW50KGV2ZW50LCBoYW5kbGVyKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlJDIgKFxuICBldmVudCxcbiAgaGFuZGxlcixcbiAgY2FwdHVyZSxcbiAgX3RhcmdldFxuKSB7XG4gIChfdGFyZ2V0IHx8IHRhcmdldCQxKS5yZW1vdmVFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURPTUxpc3RlbmVycyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmICghb2xkVm5vZGUuZGF0YS5vbiAmJiAhdm5vZGUuZGF0YS5vbikge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvbiA9IHZub2RlLmRhdGEub24gfHwge307XG4gIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307XG4gIHRhcmdldCQxID0gdm5vZGUuZWxtO1xuICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpO1xufVxuXG52YXIgZXZlbnRzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURPTUxpc3RlbmVycyxcbiAgdXBkYXRlOiB1cGRhdGVET01MaXN0ZW5lcnNcbn07XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplID0gY2FjaGVkKGNhbWVsaXplKTtcblxuZnVuY3Rpb24gY3JlYXRlU3R5bGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoIXZub2RlLmRhdGEuc3RhdGljU3R5bGUpIHtcbiAgICB1cGRhdGVTdHlsZShvbGRWbm9kZSwgdm5vZGUpO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBlbG0gPSB2bm9kZS5lbG07XG4gIHZhciBzdGF0aWNTdHlsZSA9IHZub2RlLmRhdGEuc3RhdGljU3R5bGU7XG4gIGZvciAodmFyIG5hbWUgaW4gc3RhdGljU3R5bGUpIHtcbiAgICBpZiAoc3RhdGljU3R5bGVbbmFtZV0pIHtcbiAgICAgIGVsbS5zZXRTdHlsZShub3JtYWxpemUobmFtZSksIHN0YXRpY1N0eWxlW25hbWVdKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlU3R5bGUob2xkVm5vZGUsIHZub2RlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoIW9sZFZub2RlLmRhdGEuc3R5bGUgJiYgIXZub2RlLmRhdGEuc3R5bGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgY3VyLCBuYW1lO1xuICB2YXIgZWxtID0gdm5vZGUuZWxtO1xuICB2YXIgb2xkU3R5bGUgPSBvbGRWbm9kZS5kYXRhLnN0eWxlIHx8IHt9O1xuICB2YXIgc3R5bGUgPSB2bm9kZS5kYXRhLnN0eWxlIHx8IHt9O1xuXG4gIHZhciBuZWVkQ2xvbmUgPSBzdHlsZS5fX29iX187XG5cbiAgLy8gaGFuZGxlIGFycmF5IHN5bnRheFxuICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZSkpIHtcbiAgICBzdHlsZSA9IHZub2RlLmRhdGEuc3R5bGUgPSB0b09iamVjdCQxKHN0eWxlKTtcbiAgfVxuXG4gIC8vIGNsb25lIHRoZSBzdHlsZSBmb3IgZnV0dXJlIHVwZGF0ZXMsXG4gIC8vIGluIGNhc2UgdGhlIHVzZXIgbXV0YXRlcyB0aGUgc3R5bGUgb2JqZWN0IGluLXBsYWNlLlxuICBpZiAobmVlZENsb25lKSB7XG4gICAgc3R5bGUgPSB2bm9kZS5kYXRhLnN0eWxlID0gZXh0ZW5kKHt9LCBzdHlsZSk7XG4gIH1cblxuICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlW25hbWVdKSB7XG4gICAgICBlbG0uc2V0U3R5bGUobm9ybWFsaXplKG5hbWUpLCAnJyk7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBzdHlsZSkge1xuICAgIGN1ciA9IHN0eWxlW25hbWVdO1xuICAgIGVsbS5zZXRTdHlsZShub3JtYWxpemUobmFtZSksIGN1cik7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9PYmplY3QkMSAoYXJyKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyW2ldKSB7XG4gICAgICBleHRlbmQocmVzLCBhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbnZhciBzdHlsZSA9IHtcbiAgY3JlYXRlOiBjcmVhdGVTdHlsZSxcbiAgdXBkYXRlOiB1cGRhdGVTdHlsZVxufTtcblxuLyogICovXG5cbi8qKlxuICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb24gKGRlZiQkMSkge1xuICBpZiAoIWRlZiQkMSkge1xuICAgIHJldHVyblxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgZGVmJCQxID09PSAnb2JqZWN0Jykge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBpZiAoZGVmJCQxLmNzcyAhPT0gZmFsc2UpIHtcbiAgICAgIGV4dGVuZChyZXMsIGF1dG9Dc3NUcmFuc2l0aW9uKGRlZiQkMS5uYW1lIHx8ICd2JykpO1xuICAgIH1cbiAgICBleHRlbmQocmVzLCBkZWYkJDEpO1xuICAgIHJldHVybiByZXNcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmJCQxID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYkJDEpXG4gIH1cbn1cblxudmFyIGF1dG9Dc3NUcmFuc2l0aW9uID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB7XG4gICAgZW50ZXJDbGFzczogKG5hbWUgKyBcIi1lbnRlclwiKSxcbiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgXCItZW50ZXItdG9cIiksXG4gICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1lbnRlci1hY3RpdmVcIiksXG4gICAgbGVhdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZVwiKSxcbiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgXCItbGVhdmUtdG9cIiksXG4gICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZS1hY3RpdmVcIilcbiAgfVxufSk7XG5cblxuLy8gVHJhbnNpdGlvbiBwcm9wZXJ0eS9ldmVudCBzbmlmZmluZ1xuXG5cblxuXG4vLyBiaW5kaW5nIHRvIHdpbmRvdyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBob3QgcmVsb2FkIHdvcmsgaW4gSUUgaW4gc3RyaWN0IG1vZGVcbnZhciByYWYgPSBpbkJyb3dzZXIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpXG4gIDogc2V0VGltZW91dDtcblxudmFyIHRyYW5zaXRpb24gPSB7XG4gIGNyZWF0ZTogZW50ZXIsXG4gIGFjdGl2YXRlOiBlbnRlcixcbiAgcmVtb3ZlOiBsZWF2ZVxufTtcblxuZnVuY3Rpb24gZW50ZXIgKF8sIHZub2RlKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcblxuICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vd1xuICBpZiAoZWwuX2xlYXZlQ2IpIHtcbiAgICBlbC5fbGVhdmVDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9sZWF2ZUNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChlbC5fZW50ZXJDYikge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGVudGVyQ2xhc3MgPSBkYXRhLmVudGVyQ2xhc3M7XG4gIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzcztcbiAgdmFyIGVudGVyQWN0aXZlQ2xhc3MgPSBkYXRhLmVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBhcHBlYXJDbGFzcyA9IGRhdGEuYXBwZWFyQ2xhc3M7XG4gIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzO1xuICB2YXIgYXBwZWFyQWN0aXZlQ2xhc3MgPSBkYXRhLmFwcGVhckFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlRW50ZXIgPSBkYXRhLmJlZm9yZUVudGVyO1xuICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyO1xuICB2YXIgYWZ0ZXJFbnRlciA9IGRhdGEuYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkID0gZGF0YS5lbnRlckNhbmNlbGxlZDtcbiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyO1xuICB2YXIgYXBwZWFyID0gZGF0YS5hcHBlYXI7XG4gIHZhciBhZnRlckFwcGVhciA9IGRhdGEuYWZ0ZXJBcHBlYXI7XG4gIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDtcblxuICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlO1xuICB2YXIgdHJhbnNpdGlvbk5vZGUgPSBhY3RpdmVJbnN0YW5jZS4kdm5vZGU7XG4gIHdoaWxlICh0cmFuc2l0aW9uTm9kZSAmJiB0cmFuc2l0aW9uTm9kZS5wYXJlbnQpIHtcbiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDtcbiAgICBjb250ZXh0ID0gdHJhbnNpdGlvbk5vZGUuY29udGV4dDtcbiAgfVxuXG4gIHZhciBpc0FwcGVhciA9ICFjb250ZXh0Ll9pc01vdW50ZWQgfHwgIXZub2RlLmlzUm9vdEluc2VydDtcblxuICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgc3RhcnRDbGFzcyA9IGlzQXBwZWFyID8gYXBwZWFyQ2xhc3MgOiBlbnRlckNsYXNzO1xuICB2YXIgdG9DbGFzcyA9IGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcztcbiAgdmFyIGFjdGl2ZUNsYXNzID0gaXNBcHBlYXIgPyBhcHBlYXJBY3RpdmVDbGFzcyA6IGVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBiZWZvcmVFbnRlckhvb2sgPSBpc0FwcGVhciA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpIDogYmVmb3JlRW50ZXI7XG4gIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhciA/ICh0eXBlb2YgYXBwZWFyID09PSAnZnVuY3Rpb24nID8gYXBwZWFyIDogZW50ZXIpIDogZW50ZXI7XG4gIHZhciBhZnRlckVudGVySG9vayA9IGlzQXBwZWFyID8gKGFmdGVyQXBwZWFyIHx8IGFmdGVyRW50ZXIpIDogYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkSG9vayA9IGlzQXBwZWFyID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkgOiBlbnRlckNhbmNlbGxlZDtcblxuICB2YXIgdXNlcldhbnRzQ29udHJvbCA9XG4gICAgZW50ZXJIb29rICYmXG4gICAgLy8gZW50ZXJIb29rIG1heSBiZSBhIGJvdW5kIG1ldGhvZCB3aGljaCBleHBvc2VzXG4gICAgLy8gdGhlIGxlbmd0aCBvZiBvcmlnaW5hbCBmbiBhcyBfbGVuZ3RoXG4gICAgKGVudGVySG9vay5fbGVuZ3RoIHx8IGVudGVySG9vay5sZW5ndGgpID4gMTtcblxuICB2YXIgc3R5bGVzaGVldCA9IHZub2RlLmNvbnRleHQuJG9wdGlvbnMuc3R5bGUgfHwge307XG4gIHZhciBzdGFydFN0YXRlID0gc3R5bGVzaGVldFtzdGFydENsYXNzXTtcbiAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0aWVzID0gKHN0eWxlc2hlZXRbJ0BUUkFOU0lUSU9OJ10gJiYgc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXVthY3RpdmVDbGFzc10pIHx8IHt9O1xuICB2YXIgZW5kU3RhdGUgPSBnZXRFbnRlclRhcmdldFN0YXRlKGVsLCBzdHlsZXNoZWV0LCBzdGFydENsYXNzLCB0b0NsYXNzLCBhY3RpdmVDbGFzcywgdm5vZGUuY29udGV4dCk7XG4gIHZhciBuZWVkQW5pbWF0aW9uID0gT2JqZWN0LmtleXMoZW5kU3RhdGUpLmxlbmd0aCA+IDA7XG5cbiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBlbnRlckNhbmNlbGxlZEhvb2sgJiYgZW50ZXJDYW5jZWxsZWRIb29rKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJFbnRlckhvb2sgJiYgYWZ0ZXJFbnRlckhvb2soZWwpO1xuICAgIH1cbiAgICBlbC5fZW50ZXJDYiA9IG51bGw7XG4gIH0pO1xuXG4gIC8vIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgbmF0aXZlIGVsZW1lbnQgaGFzIGJlZW4gaW5zZXJ0ZWQsIGJ1dCBjdXJyZW50bHlcbiAgLy8gdGhlcmUncyBubyBBUEkgdG8gZG8gdGhhdC4gU28gd2UgaGF2ZSB0byB3YWl0IFwib25lIGZyYW1lXCIgLSBub3QgZW50aXJlbHlcbiAgLy8gc3VyZSBpZiB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgZW5vdWdoIChlLmcuIG9uIHNsb3cgZGV2aWNlcz8pXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgIHZhciBwZW5kaW5nTm9kZSA9IHBhcmVudCAmJiBwYXJlbnQuX3BlbmRpbmcgJiYgcGFyZW50Ll9wZW5kaW5nW3Zub2RlLmtleV07XG4gICAgaWYgKHBlbmRpbmdOb2RlICYmXG4gICAgICBwZW5kaW5nTm9kZS5jb250ZXh0ID09PSB2bm9kZS5jb250ZXh0ICYmXG4gICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJlxuICAgICAgcGVuZGluZ05vZGUuZWxtLl9sZWF2ZUNiXG4gICAgKSB7XG4gICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTtcbiAgICB9XG4gICAgZW50ZXJIb29rICYmIGVudGVySG9vayhlbCwgY2IpO1xuXG4gICAgaWYgKG5lZWRBbmltYXRpb24pIHtcbiAgICAgIHZhciBhbmltYXRpb24gPSB2bm9kZS5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgnYW5pbWF0aW9uJyk7XG4gICAgICBhbmltYXRpb24udHJhbnNpdGlvbihlbC5yZWYsIHtcbiAgICAgICAgc3R5bGVzOiBlbmRTdGF0ZSxcbiAgICAgICAgZHVyYXRpb246IHRyYW5zaXRpb25Qcm9wZXJ0aWVzLmR1cmF0aW9uIHx8IDAsXG4gICAgICAgIGRlbGF5OiB0cmFuc2l0aW9uUHJvcGVydGllcy5kZWxheSB8fCAwLFxuICAgICAgICB0aW1pbmdGdW5jdGlvbjogdHJhbnNpdGlvblByb3BlcnRpZXMudGltaW5nRnVuY3Rpb24gfHwgJ2xpbmVhcidcbiAgICAgIH0sIHVzZXJXYW50c0NvbnRyb2wgPyBub29wIDogY2IpO1xuICAgIH0gZWxzZSBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICAgIGNiKCk7XG4gICAgfVxuICB9LCAxNik7XG5cbiAgLy8gc3RhcnQgZW50ZXIgdHJhbnNpdGlvblxuICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTtcblxuICBpZiAoc3RhcnRTdGF0ZSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzdGFydFN0YXRlKSB7XG4gICAgICBlbC5zZXRTdHlsZShrZXksIHN0YXJ0U3RhdGVba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFuZWVkQW5pbWF0aW9uICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgY2IoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcblxuICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vd1xuICBpZiAoZWwuX2VudGVyQ2IpIHtcbiAgICBlbC5fZW50ZXJDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9lbnRlckNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBybSgpXG4gIH1cblxuICBpZiAoZWwuX2xlYXZlQ2IpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsZWF2ZUNsYXNzID0gZGF0YS5sZWF2ZUNsYXNzO1xuICB2YXIgbGVhdmVUb0NsYXNzID0gZGF0YS5sZWF2ZVRvQ2xhc3M7XG4gIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlTGVhdmUgPSBkYXRhLmJlZm9yZUxlYXZlO1xuICB2YXIgbGVhdmUgPSBkYXRhLmxlYXZlO1xuICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTtcbiAgdmFyIGxlYXZlQ2FuY2VsbGVkID0gZGF0YS5sZWF2ZUNhbmNlbGxlZDtcbiAgdmFyIGRlbGF5TGVhdmUgPSBkYXRhLmRlbGF5TGVhdmU7XG5cbiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPVxuICAgIGxlYXZlICYmXG4gICAgLy8gbGVhdmUgaG9vayBtYXkgYmUgYSBib3VuZCBtZXRob2Qgd2hpY2ggZXhwb3Nlc1xuICAgIC8vIHRoZSBsZW5ndGggb2Ygb3JpZ2luYWwgZm4gYXMgX2xlbmd0aFxuICAgIChsZWF2ZS5fbGVuZ3RoIHx8IGxlYXZlLmxlbmd0aCkgPiAxO1xuXG4gIHZhciBzdHlsZXNoZWV0ID0gdm5vZGUuY29udGV4dC4kb3B0aW9ucy5zdHlsZSB8fCB7fTtcbiAgdmFyIHN0YXJ0U3RhdGUgPSBzdHlsZXNoZWV0W2xlYXZlQ2xhc3NdO1xuICB2YXIgZW5kU3RhdGUgPSBzdHlsZXNoZWV0W2xlYXZlVG9DbGFzc10gfHwgc3R5bGVzaGVldFtsZWF2ZUFjdGl2ZUNsYXNzXTtcbiAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0aWVzID0gKHN0eWxlc2hlZXRbJ0BUUkFOU0lUSU9OJ10gJiYgc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXVtsZWF2ZUFjdGl2ZUNsYXNzXSkgfHwge307XG5cbiAgdmFyIGNiID0gZWwuX2xlYXZlQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7XG4gICAgICBlbC5wYXJlbnROb2RlLl9wZW5kaW5nW3Zub2RlLmtleV0gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJtKCk7XG4gICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpO1xuICAgIH1cbiAgICBlbC5fbGVhdmVDYiA9IG51bGw7XG4gIH0pO1xuXG4gIGlmIChkZWxheUxlYXZlKSB7XG4gICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpO1xuICB9IGVsc2Uge1xuICAgIHBlcmZvcm1MZWF2ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVyZm9ybUxlYXZlICgpIHtcbiAgICB2YXIgYW5pbWF0aW9uID0gdm5vZGUuY29udGV4dC4kcmVxdWlyZVdlZXhNb2R1bGUoJ2FuaW1hdGlvbicpO1xuICAgIC8vIHRoZSBkZWxheWVkIGxlYXZlIG1heSBoYXZlIGFscmVhZHkgYmVlbiBjYW5jZWxsZWRcbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudFxuICAgIGlmICghdm5vZGUuZGF0YS5zaG93KSB7XG4gICAgICAoZWwucGFyZW50Tm9kZS5fcGVuZGluZyB8fCAoZWwucGFyZW50Tm9kZS5fcGVuZGluZyA9IHt9KSlbdm5vZGUua2V5XSA9IHZub2RlO1xuICAgIH1cbiAgICBiZWZvcmVMZWF2ZSAmJiBiZWZvcmVMZWF2ZShlbCk7XG5cbiAgICBpZiAoc3RhcnRTdGF0ZSkge1xuICAgICAgYW5pbWF0aW9uLnRyYW5zaXRpb24oZWwucmVmLCB7XG4gICAgICAgIHN0eWxlczogc3RhcnRTdGF0ZVxuICAgICAgfSwgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0ICgpIHtcbiAgICAgIGFuaW1hdGlvbi50cmFuc2l0aW9uKGVsLnJlZiwge1xuICAgICAgICBzdHlsZXM6IGVuZFN0YXRlLFxuICAgICAgICBkdXJhdGlvbjogdHJhbnNpdGlvblByb3BlcnRpZXMuZHVyYXRpb24gfHwgMCxcbiAgICAgICAgZGVsYXk6IHRyYW5zaXRpb25Qcm9wZXJ0aWVzLmRlbGF5IHx8IDAsXG4gICAgICAgIHRpbWluZ0Z1bmN0aW9uOiB0cmFuc2l0aW9uUHJvcGVydGllcy50aW1pbmdGdW5jdGlvbiB8fCAnbGluZWFyJ1xuICAgICAgfSwgdXNlcldhbnRzQ29udHJvbCA/IG5vb3AgOiBjYik7XG4gICAgfVxuXG4gICAgbGVhdmUgJiYgbGVhdmUoZWwsIGNiKTtcbiAgICBpZiAoIWVuZFN0YXRlICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICBjYigpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBkZXRlcm1pbmUgdGhlIHRhcmdldCBhbmltYXRpb24gc3R5bGUgZm9yIGFuIGVudGVyaW5nIHRyYW5zaXRpb24uXG5mdW5jdGlvbiBnZXRFbnRlclRhcmdldFN0YXRlIChlbCwgc3R5bGVzaGVldCwgc3RhcnRDbGFzcywgZW5kQ2xhc3MsIGFjdGl2ZUNsYXNzLCB2bSkge1xuICB2YXIgdGFyZ2V0U3RhdGUgPSB7fTtcbiAgdmFyIHN0YXJ0U3RhdGUgPSBzdHlsZXNoZWV0W3N0YXJ0Q2xhc3NdO1xuICB2YXIgZW5kU3RhdGUgPSBzdHlsZXNoZWV0W2VuZENsYXNzXTtcbiAgdmFyIGFjdGl2ZVN0YXRlID0gc3R5bGVzaGVldFthY3RpdmVDbGFzc107XG4gIC8vIDEuIGZhbGxiYWNrIHRvIGVsZW1lbnQncyBkZWZhdWx0IHN0eWxpbmdcbiAgaWYgKHN0YXJ0U3RhdGUpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3RhcnRTdGF0ZSkge1xuICAgICAgdGFyZ2V0U3RhdGVba2V5XSA9IGVsLnN0eWxlW2tleV07XG4gICAgICBpZiAoXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgdGFyZ2V0U3RhdGVba2V5XSA9PSBudWxsICYmXG4gICAgICAgICghYWN0aXZlU3RhdGUgfHwgYWN0aXZlU3RhdGVba2V5XSA9PSBudWxsKSAmJlxuICAgICAgICAoIWVuZFN0YXRlIHx8IGVuZFN0YXRlW2tleV0gPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwidHJhbnNpdGlvbiBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgZGVjbGFyZWQgaW4gZW50ZXIgc3RhcnRpbmcgY2xhc3MgKC5cIiArIHN0YXJ0Q2xhc3MgKyBcIiksIFwiICtcbiAgICAgICAgICBcImJ1dCBub3QgZGVjbGFyZWQgYW55d2hlcmUgaW4gZW50ZXIgZW5kaW5nIGNsYXNzICguXCIgKyBlbmRDbGFzcyArIFwiKSwgXCIgK1xuICAgICAgICAgIFwiZW50ZXIgYWN0aXZlIGNhc3MgKC5cIiArIGFjdGl2ZUNsYXNzICsgXCIpIG9yIHRoZSBlbGVtZW50J3MgZGVmYXVsdCBzdHlsaW5nLiBcIiArXG4gICAgICAgICAgXCJOb3RlIGluIFdlZXgsIENTUyBwcm9wZXJ0aWVzIG5lZWQgZXhwbGljaXQgdmFsdWVzIHRvIGJlIHRyYW5zaXRpb25hYmxlLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIDIuIGlmIHN0YXRlIGlzIG1peGVkIGluIGFjdGl2ZSBzdGF0ZSwgZXh0cmFjdCB0aGVtIHdoaWxlIGV4Y2x1ZGluZ1xuICAvLyAgICB0cmFuc2l0aW9uIHByb3BlcnRpZXNcbiAgaWYgKGFjdGl2ZVN0YXRlKSB7XG4gICAgZm9yICh2YXIga2V5JDEgaW4gYWN0aXZlU3RhdGUpIHtcbiAgICAgIGlmIChrZXkkMS5pbmRleE9mKCd0cmFuc2l0aW9uJykgIT09IDApIHtcbiAgICAgICAgdGFyZ2V0U3RhdGVba2V5JDFdID0gYWN0aXZlU3RhdGVba2V5JDFdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyAzLiBleHBsaWNpdCBlbmRTdGF0ZSBoYXMgaGlnaGVzdCBwcmlvcml0eVxuICBpZiAoZW5kU3RhdGUpIHtcbiAgICBleHRlbmQodGFyZ2V0U3RhdGUsIGVuZFN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0U3RhdGVcbn1cblxudmFyIHBsYXRmb3JtTW9kdWxlcyA9IFtcbiAgYXR0cnMsXG4gIGtsYXNzLFxuICBldmVudHMsXG4gIHN0eWxlLFxuICB0cmFuc2l0aW9uXG5dO1xuXG4vKiAgKi9cblxuLy8gdGhlIGRpcmVjdGl2ZSBtb2R1bGUgc2hvdWxkIGJlIGFwcGxpZWQgbGFzdCwgYWZ0ZXIgYWxsXG4vLyBidWlsdC1pbiBtb2R1bGVzIGhhdmUgYmVlbiBhcHBsaWVkLlxudmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTtcblxudmFyIHBhdGNoID0gY3JlYXRlUGF0Y2hGdW5jdGlvbih7XG4gIG5vZGVPcHM6IG5vZGVPcHMsXG4gIG1vZHVsZXM6IG1vZHVsZXMsXG4gIExPTkdfTElTVF9USFJFU0hPTEQ6IDEwXG59KTtcblxudmFyIHBsYXRmb3JtRGlyZWN0aXZlcyA9IHtcbn07XG5cbmZ1bmN0aW9uIGdldFZOb2RlVHlwZSAodm5vZGUpIHtcbiAgaWYgKCF2bm9kZS50YWcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICByZXR1cm4gdm5vZGUudGFnLnJlcGxhY2UoL3Z1ZVxcLWNvbXBvbmVudFxcLShcXGQrXFwtKT8vLCAnJylcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVTcGFuICh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmICF2bm9kZS5jaGlsZHJlblswXS50YWdcbn1cblxudmFyIGNzc0xlbmd0aFJFID0gL14oWystXT9bMC05XSsoXFwuWzAtOV0rKT8pKHB4fGVtfGV4fCV8aW58Y218bW18cHR8cGMpJC9pO1xuZnVuY3Rpb24gdHJpbUNTU1VuaXQgKHByb3ApIHtcbiAgdmFyIHJlcyA9IFN0cmluZyhwcm9wKS5tYXRjaChjc3NMZW5ndGhSRSk7XG4gIGlmIChyZXMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHJlc1sxXSlcbiAgfVxuICByZXR1cm4gcHJvcFxufVxuXG5mdW5jdGlvbiBwYXJzZVN0eWxlICh2bm9kZSkge1xuICBpZiAoIXZub2RlIHx8ICF2bm9kZS5kYXRhKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgcmVmID0gdm5vZGUuZGF0YTtcbiAgdmFyIHN0YXRpY1N0eWxlID0gcmVmLnN0YXRpY1N0eWxlO1xuICB2YXIgc3RhdGljQ2xhc3MgPSByZWYuc3RhdGljQ2xhc3M7XG4gIGlmICh2bm9kZS5kYXRhLnN0eWxlIHx8IHZub2RlLmRhdGEuY2xhc3MgfHwgc3RhdGljU3R5bGUgfHwgc3RhdGljQ2xhc3MpIHtcbiAgICB2YXIgc3R5bGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGljU3R5bGUsIHZub2RlLmRhdGEuc3R5bGUpO1xuXG4gICAgdmFyIGNzc01hcCA9IHZub2RlLmNvbnRleHQuJG9wdGlvbnMuc3R5bGUgfHwge307XG4gICAgdmFyIGNsYXNzTGlzdCA9IFtdLmNvbmNhdChzdGF0aWNDbGFzcywgdm5vZGUuZGF0YS5jbGFzcyk7XG4gICAgY2xhc3NMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIGlmIChuYW1lICYmIGNzc01hcFtuYW1lXSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlcywgY3NzTWFwW25hbWVdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICAgIHN0eWxlc1trZXldID0gdHJpbUNTU1VuaXQoc3R5bGVzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFZOb2RlQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uICh2bm9kZSkge1xuICAgIHZhciB0eXBlID0gZ2V0Vk5vZGVUeXBlKHZub2RlKTtcbiAgICB2YXIgcHJvcHMgPSB7IHR5cGU6IHR5cGUgfTtcblxuICAgIC8vIGNvbnZlcnQgcmF3IHRleHQgbm9kZVxuICAgIGlmICghdHlwZSkge1xuICAgICAgcHJvcHMudHlwZSA9ICdzcGFuJztcbiAgICAgIHByb3BzLmF0dHIgPSB7XG4gICAgICAgIHZhbHVlOiAodm5vZGUudGV4dCB8fCAnJykudHJpbSgpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wcy5zdHlsZSA9IHBhcnNlU3R5bGUodm5vZGUpO1xuICAgICAgaWYgKHZub2RlLmRhdGEpIHtcbiAgICAgICAgcHJvcHMuYXR0ciA9IHZub2RlLmRhdGEuYXR0cnM7XG4gICAgICAgIGlmICh2bm9kZS5kYXRhLm9uKSB7XG4gICAgICAgICAgcHJvcHMuZXZlbnRzID0gdm5vZGUuZGF0YS5vbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NwYW4nICYmIGlzU2ltcGxlU3Bhbih2bm9kZSkpIHtcbiAgICAgICAgcHJvcHMuYXR0ciA9IHByb3BzLmF0dHIgfHwge307XG4gICAgICAgIHByb3BzLmF0dHIudmFsdWUgPSB2bm9kZS5jaGlsZHJlblswXS50ZXh0LnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIHByb3BzXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZub2RlLmNoaWxkcmVuICYmIHZub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgcHJvcHMuY2hpbGRyZW4gPSBjb252ZXJ0Vk5vZGVDaGlsZHJlbih2bm9kZS5jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzXG4gIH0pXG59XG5cbnZhciBSaWNodGV4dCA9IHtcbiAgbmFtZTogJ3JpY2h0ZXh0JyxcbiAgLy8gYWJzdHJhY3Q6IHRydWUsXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyIChoKSB7XG4gICAgcmV0dXJuIGgoJ3dlZXg6cmljaHRleHQnLCB7XG4gICAgICBvbjogdGhpcy5fZXZlbnRzLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgdmFsdWU6IGNvbnZlcnRWTm9kZUNoaWxkcmVuKHRoaXMuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8IFtdKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn07XG5cbi8qICAqL1xuXG4vLyBQcm92aWRlcyB0cmFuc2l0aW9uIHN1cHBvcnQgZm9yIGEgc2luZ2xlIGVsZW1lbnQvY29tcG9uZW50LlxuLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpXG5cbnZhciB0cmFuc2l0aW9uUHJvcHMgPSB7XG4gIG5hbWU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBjc3M6IEJvb2xlYW4sXG4gIG1vZGU6IFN0cmluZyxcbiAgdHlwZTogU3RyaW5nLFxuICBlbnRlckNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlVG9DbGFzczogU3RyaW5nLFxuICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyVG9DbGFzczogU3RyaW5nLFxuICBkdXJhdGlvbjogW051bWJlciwgU3RyaW5nLCBPYmplY3RdXG59O1xuXG4vLyBpbiBjYXNlIHRoZSBjaGlsZCBpcyBhbHNvIGFuIGFic3RyYWN0IGNvbXBvbmVudCwgZS5nLiA8a2VlcC1hbGl2ZT5cbi8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkXG5mdW5jdGlvbiBnZXRSZWFsQ2hpbGQgKHZub2RlKSB7XG4gIHZhciBjb21wT3B0aW9ucyA9IHZub2RlICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICByZXR1cm4gZ2V0UmVhbENoaWxkKGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoY29tcE9wdGlvbnMuY2hpbGRyZW4pKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2bm9kZVxuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2l0aW9uRGF0YSAoY29tcCkge1xuICB2YXIgZGF0YSA9IHt9O1xuICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7XG4gIC8vIHByb3BzXG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zLnByb3BzRGF0YSkge1xuICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTtcbiAgfVxuICAvLyBldmVudHMuXG4gIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kc1xuICB2YXIgbGlzdGVuZXJzID0gb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICBmb3IgKHZhciBrZXkkMSBpbiBsaXN0ZW5lcnMpIHtcbiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdO1xuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyIChoLCByYXdDaGlsZCkge1xuICBpZiAoL1xcZC1rZWVwLWFsaXZlJC8udGVzdChyYXdDaGlsZC50YWcpKSB7XG4gICAgcmV0dXJuIGgoJ2tlZXAtYWxpdmUnLCB7XG4gICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGFcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1BhcmVudFRyYW5zaXRpb24gKHZub2RlKSB7XG4gIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7XG4gICAgaWYgKHZub2RlLmRhdGEudHJhbnNpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTYW1lQ2hpbGQgKGNoaWxkLCBvbGRDaGlsZCkge1xuICByZXR1cm4gb2xkQ2hpbGQua2V5ID09PSBjaGlsZC5rZXkgJiYgb2xkQ2hpbGQudGFnID09PSBjaGlsZC50YWdcbn1cblxuZnVuY3Rpb24gaXNBc3luY1BsYWNlaG9sZGVyIChub2RlKSB7XG4gIHJldHVybiBub2RlLmlzQ29tbWVudCAmJiBub2RlLmFzeW5jRmFjdG9yeVxufVxuXG52YXIgVHJhbnNpdGlvbiQxID0ge1xuICBuYW1lOiAndHJhbnNpdGlvbicsXG4gIHByb3BzOiB0cmFuc2l0aW9uUHJvcHMsXG4gIGFic3RyYWN0OiB0cnVlLFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyIChoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbjtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHRleHQgbm9kZXMgKHBvc3NpYmxlIHdoaXRlc3BhY2VzKVxuICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgd2FybihcbiAgICAgICAgJzx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQuIFVzZSAnICtcbiAgICAgICAgJzx0cmFuc2l0aW9uLWdyb3VwPiBmb3IgbGlzdHMuJyxcbiAgICAgICAgdGhpcy4kcGFyZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBtb2RlID0gdGhpcy5tb2RlO1xuXG4gICAgLy8gd2FybiBpbnZhbGlkIG1vZGVcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJ1xuICAgICkge1xuICAgICAgd2FybihcbiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLFxuICAgICAgICB0aGlzLiRwYXJlbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHJhd0NoaWxkID0gY2hpbGRyZW5bMF07XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgY29tcG9uZW50IHJvb3Qgbm9kZSBhbmQgdGhlIGNvbXBvbmVudCdzXG4gICAgLy8gcGFyZW50IGNvbnRhaW5lciBub2RlIGFsc28gaGFzIHRyYW5zaXRpb24sIHNraXAuXG4gICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0cmFuc2l0aW9uIGRhdGEgdG8gY2hpbGRcbiAgICAvLyB1c2UgZ2V0UmVhbENoaWxkKCkgdG8gaWdub3JlIGFic3RyYWN0IGNvbXBvbmVudHMgZS5nLiBrZWVwLWFsaXZlXG4gICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNoaWxkKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGVhdmluZykge1xuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyKGgsIHJhd0NoaWxkKVxuICAgIH1cblxuICAgIC8vIGVuc3VyZSBhIGtleSB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgdm5vZGUgdHlwZSBhbmQgdG8gdGhpcyB0cmFuc2l0aW9uXG4gICAgLy8gY29tcG9uZW50IGluc3RhbmNlLiBUaGlzIGtleSB3aWxsIGJlIHVzZWQgdG8gcmVtb3ZlIHBlbmRpbmcgbGVhdmluZyBub2Rlc1xuICAgIC8vIGR1cmluZyBlbnRlcmluZy5cbiAgICB2YXIgaWQgPSBcIl9fdHJhbnNpdGlvbi1cIiArICh0aGlzLl91aWQpICsgXCItXCI7XG4gICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGxcbiAgICAgID8gY2hpbGQuaXNDb21tZW50XG4gICAgICAgID8gaWQgKyAnY29tbWVudCdcbiAgICAgICAgOiBpZCArIGNoaWxkLnRhZ1xuICAgICAgOiBpc1ByaW1pdGl2ZShjaGlsZC5rZXkpXG4gICAgICAgID8gKFN0cmluZyhjaGlsZC5rZXkpLmluZGV4T2YoaWQpID09PSAwID8gY2hpbGQua2V5IDogaWQgKyBjaGlsZC5rZXkpXG4gICAgICAgIDogY2hpbGQua2V5O1xuXG4gICAgdmFyIGRhdGEgPSAoY2hpbGQuZGF0YSB8fCAoY2hpbGQuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IGV4dHJhY3RUcmFuc2l0aW9uRGF0YSh0aGlzKTtcbiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTtcbiAgICB2YXIgb2xkQ2hpbGQgPSBnZXRSZWFsQ2hpbGQob2xkUmF3Q2hpbGQpO1xuXG4gICAgLy8gbWFyayB2LXNob3dcbiAgICAvLyBzbyB0aGF0IHRoZSB0cmFuc2l0aW9uIG1vZHVsZSBjYW4gaGFuZCBvdmVyIHRoZSBjb250cm9sIHRvIHRoZSBkaXJlY3RpdmVcbiAgICBpZiAoY2hpbGQuZGF0YS5kaXJlY3RpdmVzICYmIGNoaWxkLmRhdGEuZGlyZWN0aXZlcy5zb21lKGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLm5hbWUgPT09ICdzaG93JzsgfSkpIHtcbiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb2xkQ2hpbGQgJiZcbiAgICAgIG9sZENoaWxkLmRhdGEgJiZcbiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmXG4gICAgICAhaXNBc3luY1BsYWNlaG9sZGVyKG9sZENoaWxkKVxuICAgICkge1xuICAgICAgLy8gcmVwbGFjZSBvbGQgY2hpbGQgdHJhbnNpdGlvbiBkYXRhIHdpdGggZnJlc2ggb25lXG4gICAgICAvLyBpbXBvcnRhbnQgZm9yIGR5bmFtaWMgdHJhbnNpdGlvbnMhXG4gICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkICYmIChvbGRDaGlsZC5kYXRhLnRyYW5zaXRpb24gPSBleHRlbmQoe30sIGRhdGEpKTtcbiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnb3V0LWluJykge1xuICAgICAgICAvLyByZXR1cm4gcGxhY2Vob2xkZXIgbm9kZSBhbmQgcXVldWUgdXBkYXRlIHdoZW4gbGVhdmUgZmluaXNoZXNcbiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKG9sZERhdGEsICdhZnRlckxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMkMS5fbGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHtcbiAgICAgICAgaWYgKGlzQXN5bmNQbGFjZWhvbGRlcihjaGlsZCkpIHtcbiAgICAgICAgICByZXR1cm4gb2xkUmF3Q2hpbGRcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsYXllZExlYXZlO1xuICAgICAgICB2YXIgcGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKCkgeyBkZWxheWVkTGVhdmUoKTsgfTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhkYXRhLCAnZW50ZXJDYW5jZWxsZWQnLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhvbGREYXRhLCAnZGVsYXlMZWF2ZScsIGZ1bmN0aW9uIChsZWF2ZSkgeyBkZWxheWVkTGVhdmUgPSBsZWF2ZTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0NoaWxkXG4gIH1cbn07XG5cbi8vIHJldXNlIHNhbWUgdHJhbnNpdGlvbiBjb21wb25lbnQgbG9naWMgZnJvbSB3ZWJcblxudmFyIHByb3BzID0gZXh0ZW5kKHtcbiAgdGFnOiBTdHJpbmcsXG4gIG1vdmVDbGFzczogU3RyaW5nXG59LCB0cmFuc2l0aW9uUHJvcHMpO1xuXG5kZWxldGUgcHJvcHMubW9kZTtcblxudmFyIFRyYW5zaXRpb25Hcm91cCA9IHtcbiAgcHJvcHM6IHByb3BzLFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkge1xuICAgIHZhciBkb20gPSB0aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgnZG9tJyk7XG4gICAgdGhpcy5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZG9tLmdldENvbXBvbmVudFJlY3QoZWwucmVmLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGlmICghcmVzLnJlc3VsdCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoKFwiZmFpbGVkIHRvIGdldCByZWN0IGZvciBlbGVtZW50OiBcIiArIChlbC50YWcpKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUocmVzLnNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTsgfTtcblxuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgnYW5pbWF0aW9uJyk7XG4gICAgdGhpcy5hbmltYXRlID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgYW5pbWF0aW9uLnRyYW5zaXRpb24oZWwucmVmLCBvcHRpb25zLCByZXNvbHZlKTtcbiAgICB9KTsgfTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkge1xuICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7XG4gICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMucHJldkNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB2YXIgdHJhbnNpdGlvbkRhdGEgPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhd0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHJhd0NoaWxkcmVuW2ldO1xuICAgICAgaWYgKGMudGFnKSB7XG4gICAgICAgIGlmIChjLmtleSAhPSBudWxsICYmIFN0cmluZyhjLmtleSkuaW5kZXhPZignX192bGlzdCcpICE9PSAwKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChjKTtcbiAgICAgICAgICBtYXBbYy5rZXldID0gY1xuICAgICAgICAgIDsoYy5kYXRhIHx8IChjLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdmFyIG9wdHMgPSBjLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgICAgICAgdmFyIG5hbWUgPSBvcHRzXG4gICAgICAgICAgICA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnKVxuICAgICAgICAgICAgOiBjLnRhZztcbiAgICAgICAgICB3YXJuKChcIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8XCIgKyBuYW1lICsgXCI+XCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHZhciBrZXB0ID0gW107XG4gICAgICB2YXIgcmVtb3ZlZCA9IFtdO1xuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgYy5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcblxuICAgICAgICAvLyBUT0RPOiByZWNvcmQgYmVmb3JlIHBhdGNoIHBvc2l0aW9uc1xuXG4gICAgICAgIGlmIChtYXBbYy5rZXldKSB7XG4gICAgICAgICAga2VwdC5wdXNoKGMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZWQucHVzaChjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmtlcHQgPSBoKHRhZywgbnVsbCwga2VwdCk7XG4gICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkO1xuICAgIH1cblxuICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pXG4gIH0sXG5cbiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkge1xuICAgIC8vIGZvcmNlIHJlbW92aW5nIHBhc3NcbiAgICB0aGlzLl9fcGF0Y2hfXyhcbiAgICAgIHRoaXMuX3Zub2RlLFxuICAgICAgdGhpcy5rZXB0LFxuICAgICAgZmFsc2UsIC8vIGh5ZHJhdGluZ1xuICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpXG4gICAgKTtcbiAgICB0aGlzLl92bm9kZSA9IHRoaXMua2VwdDtcbiAgfSxcblxuICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkICgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjtcbiAgICB2YXIgbW92ZUNsYXNzID0gdGhpcy5tb3ZlQ2xhc3MgfHwgKCh0aGlzLm5hbWUgfHwgJ3YnKSArICctbW92ZScpO1xuICAgIHZhciBtb3ZlRGF0YSA9IGNoaWxkcmVuLmxlbmd0aCAmJiB0aGlzLmdldE1vdmVEYXRhKGNoaWxkcmVuWzBdLmNvbnRleHQsIG1vdmVDbGFzcyk7XG4gICAgaWYgKCFtb3ZlRGF0YSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluaXNoIGltcGxlbWVudGluZyBtb3ZlIGFuaW1hdGlvbnMgb25jZVxuICAgIC8vIHdlIGhhdmUgYWNjZXNzIHRvIHN5bmMgZ2V0Q29tcG9uZW50UmVjdCgpXG5cbiAgICAvLyBjaGlsZHJlbi5mb3JFYWNoKGNhbGxQZW5kaW5nQ2JzKVxuXG4gICAgLy8gUHJvbWlzZS5hbGwoY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgIC8vICAgY29uc3Qgb2xkUG9zID0gYy5kYXRhLnBvc1xuICAgIC8vICAgY29uc3QgbmV3UG9zID0gYy5kYXRhLm5ld1Bvc1xuICAgIC8vICAgY29uc3QgZHggPSBvbGRQb3MubGVmdCAtIG5ld1Bvcy5sZWZ0XG4gICAgLy8gICBjb25zdCBkeSA9IG9sZFBvcy50b3AgLSBuZXdQb3MudG9wXG4gICAgLy8gICBpZiAoZHggfHwgZHkpIHtcbiAgICAvLyAgICAgYy5kYXRhLm1vdmVkID0gdHJ1ZVxuICAgIC8vICAgICByZXR1cm4gdGhpcy5hbmltYXRlKGMuZWxtLCB7XG4gICAgLy8gICAgICAgc3R5bGVzOiB7XG4gICAgLy8gICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHtkeH1weCwke2R5fXB4KWBcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG4gICAgLy8gfSkpLnRoZW4oKCkgPT4ge1xuICAgIC8vICAgY2hpbGRyZW4uZm9yRWFjaChjID0+IHtcbiAgICAvLyAgICAgaWYgKGMuZGF0YS5tb3ZlZCkge1xuICAgIC8vICAgICAgIHRoaXMuYW5pbWF0ZShjLmVsbSwge1xuICAgIC8vICAgICAgICAgc3R5bGVzOiB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICBkdXJhdGlvbjogbW92ZURhdGEuZHVyYXRpb24gfHwgMCxcbiAgICAvLyAgICAgICAgIGRlbGF5OiBtb3ZlRGF0YS5kZWxheSB8fCAwLFxuICAgIC8vICAgICAgICAgdGltaW5nRnVuY3Rpb246IG1vdmVEYXRhLnRpbWluZ0Z1bmN0aW9uIHx8ICdsaW5lYXInXG4gICAgLy8gICAgICAgfSlcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSlcbiAgICAvLyB9KVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNb3ZlRGF0YTogZnVuY3Rpb24gZ2V0TW92ZURhdGEgKGNvbnRleHQsIG1vdmVDbGFzcykge1xuICAgICAgdmFyIHN0eWxlc2hlZXQgPSBjb250ZXh0LiRvcHRpb25zLnN0eWxlIHx8IHt9O1xuICAgICAgcmV0dXJuIHN0eWxlc2hlZXRbJ0BUUkFOU0lUSU9OJ10gJiYgc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXVttb3ZlQ2xhc3NdXG4gICAgfVxuICB9XG59O1xuXG4vLyBmdW5jdGlvbiBjYWxsUGVuZGluZ0NicyAoYykge1xuLy8gICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbi8vICAgaWYgKGMuZWxtLl9tb3ZlQ2IpIHtcbi8vICAgICBjLmVsbS5fbW92ZUNiKClcbi8vICAgfVxuLy8gICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbi8vICAgaWYgKGMuZWxtLl9lbnRlckNiKSB7XG4vLyAgICAgYy5lbG0uX2VudGVyQ2IoKVxuLy8gICB9XG4vLyB9XG5cbnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7XG4gIFJpY2h0ZXh0OiBSaWNodGV4dCxcbiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiQxLFxuICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cFxufTtcblxuLyogZ2xvYmFscyByZW5kZXJlciAqL1xuXG52YXIgaXNSZXNlcnZlZFRhZyA9IG1ha2VNYXAoXG4gICd0ZW1wbGF0ZSxzY3JpcHQsc3R5bGUsZWxlbWVudCxjb250ZW50LHNsb3QsbGluayxtZXRhLHN2Zyx2aWV3LCcgK1xuICAnYSxkaXYsaW1nLGltYWdlLHRleHQsc3BhbixpbnB1dCxzd2l0Y2gsdGV4dGFyZWEsc3Bpbm5lcixzZWxlY3QsJyArXG4gICdzbGlkZXIsc2xpZGVyLW5laWdoYm9yLGluZGljYXRvcixjYW52YXMsJyArXG4gICdsaXN0LGNlbGwsaGVhZGVyLGxvYWRpbmcsbG9hZGluZy1pbmRpY2F0b3IscmVmcmVzaCxzY3JvbGxhYmxlLHNjcm9sbGVyLCcgK1xuICAndmlkZW8sd2ViLGVtYmVkLHRhYmJhcix0YWJoZWFkZXIsZGF0ZXBpY2tlcix0aW1lcGlja2VyLG1hcnF1ZWUsY291bnRkb3duJyxcbiAgdHJ1ZVxuKTtcblxuLy8gRWxlbWVudHMgdGhhdCB5b3UgY2FuLCBpbnRlbnRpb25hbGx5LCBsZWF2ZSBvcGVuIChhbmQgd2hpY2ggY2xvc2UgdGhlbXNlbHZlcylcbi8vIG1vcmUgZmxleGFibGUgdGhhbiB3ZWJcbnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcChcbiAgJ3dlYixzcGlubmVyLHN3aXRjaCx2aWRlbyx0ZXh0YXJlYSxjYW52YXMsJyArXG4gICdpbmRpY2F0b3IsbWFycXVlZSxjb3VudGRvd24nLFxuICB0cnVlXG4pO1xuXG52YXIgaXNSdW50aW1lQ29tcG9uZW50ID0gbWFrZU1hcChcbiAgJ3JpY2h0ZXh0LHRyaXNpdGlvbix0cmlzaXRpb24tZ3JvdXAnLFxuICB0cnVlXG4pO1xuXG52YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoXG4gICdlbWJlZCxpbWcsaW1hZ2UsaW5wdXQsbGluayxtZXRhJyxcbiAgdHJ1ZVxuKTtcblxuZnVuY3Rpb24gbXVzdFVzZVByb3AgKCkgeyAvKiBjb25zb2xlLmxvZygnbXVzdFVzZVByb3AnKSAqLyB9XG5cbmZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQgKCkgeyAvKiBjb25zb2xlLmxvZygnaXNVbmtub3duRWxlbWVudCcpICovIH1cblxuZnVuY3Rpb24gcXVlcnkgKGVsLCBkb2N1bWVudCkge1xuICAvLyByZW5kZXJlciBpcyBpbmplY3RlZCBieSB3ZWV4IGZhY3Rvcnkgd3JhcHBlclxuICB2YXIgcGxhY2Vob2xkZXIgPSBuZXcgcmVuZGVyZXIuQ29tbWVudCgncm9vdCcpO1xuICBwbGFjZWhvbGRlci5oYXNBdHRyaWJ1dGUgPSBwbGFjZWhvbGRlci5yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoKSB7fTsgLy8gaGFjayBmb3IgcGF0Y2hcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyKTtcbiAgcmV0dXJuIHBsYWNlaG9sZGVyXG59XG5cbi8qICAqL1xuXG4vLyBpbnN0YWxsIHBsYXRmb3JtIHNwZWNpZmljIHV0aWxzXG5WdWUkMi5jb25maWcubXVzdFVzZVByb3AgPSBtdXN0VXNlUHJvcDtcblZ1ZSQyLmNvbmZpZy5pc1Jlc2VydmVkVGFnID0gaXNSZXNlcnZlZFRhZztcblZ1ZSQyLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnQgPSBpc1J1bnRpbWVDb21wb25lbnQ7XG5WdWUkMi5jb25maWcuaXNVbmtub3duRWxlbWVudCA9IGlzVW5rbm93bkVsZW1lbnQ7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcnVudGltZSBkaXJlY3RpdmVzIGFuZCBjb21wb25lbnRzXG5WdWUkMi5vcHRpb25zLmRpcmVjdGl2ZXMgPSBwbGF0Zm9ybURpcmVjdGl2ZXM7XG5WdWUkMi5vcHRpb25zLmNvbXBvbmVudHMgPSBwbGF0Zm9ybUNvbXBvbmVudHM7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb25cblZ1ZSQyLnByb3RvdHlwZS5fX3BhdGNoX18gPSBwYXRjaDtcblxuLy8gd3JhcCBtb3VudFxuVnVlJDIucHJvdG90eXBlLiRtb3VudCA9IGZ1bmN0aW9uIChcbiAgZWwsXG4gIGh5ZHJhdGluZ1xuKSB7XG4gIHJldHVybiBtb3VudENvbXBvbmVudChcbiAgICB0aGlzLFxuICAgIGVsICYmIHF1ZXJ5KGVsLCB0aGlzLiRkb2N1bWVudCksXG4gICAgaHlkcmF0aW5nXG4gIClcbn07XG5cbi8vIHRoaXMgZW50cnkgaXMgYnVpbHQgYW5kIHdyYXBwZWQgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb25cbi8vIHVzZWQgdG8gZ2VuZXJhdGUgYSBmcmVzaCBjb3B5IG9mIFZ1ZSBmb3IgZXZlcnkgV2VleCBpbnN0YW5jZS5cblxuZXhwb3J0cy5WdWUgPSBWdWUkMjtcblxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgbGF0ZXN0Tm9kZUlkID0gMTtcblxuZnVuY3Rpb24gVGV4dE5vZGUgKHRleHQpIHtcbiAgdGhpcy5pbnN0YW5jZUlkID0gJyc7XG4gIHRoaXMubm9kZUlkID0gbGF0ZXN0Tm9kZUlkKys7XG4gIHRoaXMucGFyZW50Tm9kZSA9IG51bGw7XG4gIHRoaXMubm9kZVR5cGUgPSAzO1xuICB0aGlzLnRleHQgPSB0ZXh0O1xufVxuXG4vLyB0aGlzIHdpbGwgYmUgcHJlc2VydmVkIGR1cmluZyBidWlsZFxudmFyIFZ1ZUZhY3RvcnkgPSByZXF1aXJlKCcuL2ZhY3RvcnknKTtcblxudmFyIGluc3RhbmNlcyA9IHt9O1xudmFyIG1vZHVsZXMgPSB7fTtcbnZhciBjb21wb25lbnRzID0ge307XG5cbnZhciByZW5kZXJlciA9IHtcbiAgVGV4dE5vZGU6IFRleHROb2RlLFxuICBpbnN0YW5jZXM6IGluc3RhbmNlcyxcbiAgbW9kdWxlczogbW9kdWxlcyxcbiAgY29tcG9uZW50czogY29tcG9uZW50c1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIGZyYW1ld29yayBjb25maWcsIGJhc2ljYWxseSBhYm91dCB0aGUgdmlydHVhbC1ET00gYW5kIEpTIGJyaWRnZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjZmdcbiAqL1xuZnVuY3Rpb24gaW5pdCAoY2ZnKSB7XG4gIHJlbmRlcmVyLkRvY3VtZW50ID0gY2ZnLkRvY3VtZW50O1xuICByZW5kZXJlci5FbGVtZW50ID0gY2ZnLkVsZW1lbnQ7XG4gIHJlbmRlcmVyLkNvbW1lbnQgPSBjZmcuQ29tbWVudDtcbiAgcmVuZGVyZXIuY29tcGlsZUJ1bmRsZSA9IGNmZy5jb21waWxlQnVuZGxlO1xufVxuXG4vKipcbiAqIFJlc2V0IGZyYW1ld29yayBjb25maWcgYW5kIGNsZWFyIGFsbCByZWdpc3RyYXRpb25zLlxuICovXG5mdW5jdGlvbiByZXNldCAoKSB7XG4gIGNsZWFyKGluc3RhbmNlcyk7XG4gIGNsZWFyKG1vZHVsZXMpO1xuICBjbGVhcihjb21wb25lbnRzKTtcbiAgZGVsZXRlIHJlbmRlcmVyLkRvY3VtZW50O1xuICBkZWxldGUgcmVuZGVyZXIuRWxlbWVudDtcbiAgZGVsZXRlIHJlbmRlcmVyLkNvbW1lbnQ7XG4gIGRlbGV0ZSByZW5kZXJlci5jb21waWxlQnVuZGxlO1xufVxuXG4vKipcbiAqIERlbGV0ZSBhbGwga2V5cyBvZiBhbiBvYmplY3QuXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKi9cbmZ1bmN0aW9uIGNsZWFyIChvYmopIHtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIGlkLCBjb2RlLCBjb25maWcgYW5kIGV4dGVybmFsIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFuY2VJZFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcENvZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gKiBAcGFyYW0ge29iamVjdH0gZW52IHsgaW5mbywgY29uZmlnLCBzZXJ2aWNlcyB9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlIChcbiAgaW5zdGFuY2VJZCxcbiAgYXBwQ29kZSxcbiAgY29uZmlnLFxuICBkYXRhLFxuICBlbnZcbikge1xuICBpZiAoIGFwcENvZGUgPT09IHZvaWQgMCApIGFwcENvZGUgPSAnJztcbiAgaWYgKCBjb25maWcgPT09IHZvaWQgMCApIGNvbmZpZyA9IHt9O1xuICBpZiAoIGVudiA9PT0gdm9pZCAwICkgZW52ID0ge307XG5cbiAgLy8gVmlydHVhbC1ET00gb2JqZWN0LlxuICB2YXIgZG9jdW1lbnQgPSBuZXcgcmVuZGVyZXIuRG9jdW1lbnQoaW5zdGFuY2VJZCwgY29uZmlnLmJ1bmRsZVVybCk7XG5cbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdID0ge1xuICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsIGNvbmZpZzogY29uZmlnLCBkYXRhOiBkYXRhLFxuICAgIGRvY3VtZW50OiBkb2N1bWVudFxuICB9O1xuXG4gIC8vIFByZXBhcmUgbmF0aXZlIG1vZHVsZSBnZXR0ZXIgYW5kIEhUTUw1IFRpbWVyIEFQSXMuXG4gIHZhciBtb2R1bGVHZXR0ZXIgPSBnZW5Nb2R1bGVHZXR0ZXIoaW5zdGFuY2VJZCk7XG4gIHZhciB0aW1lckFQSXMgPSBnZXRJbnN0YW5jZVRpbWVyKGluc3RhbmNlSWQsIG1vZHVsZUdldHRlcik7XG5cbiAgLy8gUHJlcGFyZSBgd2VleGAgaW5zdGFuY2UgdmFyaWFibGUuXG4gIHZhciB3ZWV4SW5zdGFuY2VWYXIgPSB7XG4gICAgY29uZmlnOiBjb25maWcsXG4gICAgZG9jdW1lbnQ6IGRvY3VtZW50LFxuICAgIHN1cHBvcnRzOiBzdXBwb3J0cyxcbiAgICByZXF1aXJlTW9kdWxlOiBtb2R1bGVHZXR0ZXJcbiAgfTtcbiAgT2JqZWN0LmZyZWV6ZSh3ZWV4SW5zdGFuY2VWYXIpO1xuXG4gIC8vIEVhY2ggaW5zdGFuY2UgaGFzIGEgaW5kZXBlbmRlbnQgYFZ1ZWAgbW9kdWxlIGluc3RhbmNlXG4gIHZhciBWdWUgPSBpbnN0YW5jZS5WdWUgPSBjcmVhdGVWdWVNb2R1bGVJbnN0YW5jZShpbnN0YW5jZUlkLCBtb2R1bGVHZXR0ZXIpO1xuXG4gIC8vIFRoZSBmdW5jdGlvbiB3aGljaCBjcmVhdGUgYSBjbG9zdXJlIHRoZSBKUyBCdW5kbGUgd2lsbCBydW4gaW4uXG4gIC8vIEl0IHdpbGwgZGVjbGFyZSBzb21lIGluc3RhbmNlIHZhcmlhYmxlcyBsaWtlIGBWdWVgLCBIVE1MNSBUaW1lciBBUElzIGV0Yy5cbiAgdmFyIGluc3RhbmNlVmFycyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIFZ1ZTogVnVlLFxuICAgIHdlZXg6IHdlZXhJbnN0YW5jZVZhclxuICB9LCB0aW1lckFQSXMsIGVudi5zZXJ2aWNlcyk7XG5cbiAgYXBwQ29kZSA9IFwiKGZ1bmN0aW9uKGdsb2JhbCl7IFxcblwiICsgYXBwQ29kZSArIFwiXFxuIH0pKE9iamVjdC5jcmVhdGUodGhpcykpXCI7XG5cbiAgaWYgKCFjYWxsRnVuY3Rpb25OYXRpdmUoaW5zdGFuY2VWYXJzLCBhcHBDb2RlKSkge1xuICAgIC8vIElmIGZhaWxlZCB0byBjb21waWxlIGZ1bmN0aW9uQm9keSBvbiBuYXRpdmUgc2lkZSxcbiAgICAvLyBmYWxsYmFjayB0byAnY2FsbEZ1bmN0aW9uKCknLlxuICAgIGNhbGxGdW5jdGlvbihpbnN0YW5jZVZhcnMsIGFwcENvZGUpO1xuICB9XG5cbiAgLy8gU2VuZCBgY3JlYXRlRmluaXNoYCBzaWduYWwgaW4gbmV4dCB0aWNrLlxuICB0aW1lckFQSXMuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaW5zdGFuY2UuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ2NyZWF0ZUZpbmlzaCcgfSwgW10pO1xuICB9LCAwKTtcblxuICByZXR1cm4gaW5zdGFuY2Vcbn1cblxuLyoqXG4gKiBEZXN0cm95IGFuIGluc3RhbmNlIHdpdGggaWQuIEl0IHdpbGwgbWFrZSBzdXJlIGFsbCBtZW1vcnkgb2ZcbiAqIHRoaXMgaW5zdGFuY2UgcmVsZWFzZWQgYW5kIG5vIG1vcmUgbGVha3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFuY2VJZFxuICovXG5mdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuYXBwIGluc3RhbmNlb2YgaW5zdGFuY2UuVnVlKSB7XG4gICAgaW5zdGFuY2UuZG9jdW1lbnQuZGVzdHJveSgpO1xuICAgIGluc3RhbmNlLmFwcC4kZGVzdHJveSgpO1xuICB9XG4gIGRlbGV0ZSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG59XG5cbi8qKlxuICogUmVmcmVzaCBhbiBpbnN0YW5jZSB3aXRoIGlkIGFuZCBuZXcgdG9wLWxldmVsIGNvbXBvbmVudCBkYXRhLlxuICogSXQgd2lsbCB1c2UgYFZ1ZS5zZXRgIG9uIGFsbCBrZXlzIG9mIHRoZSBuZXcgZGF0YS4gU28gaXQncyBiZXR0ZXJcbiAqIGRlZmluZSBhbGwgcG9zc2libGUgbWVhbmluZ2Z1bCBrZXlzIHdoZW4gaW5zdGFuY2UgY3JlYXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiByZWZyZXNoSW5zdGFuY2UgKGluc3RhbmNlSWQsIGRhdGEpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICBpZiAoIWluc3RhbmNlIHx8ICEoaW5zdGFuY2UuYXBwIGluc3RhbmNlb2YgaW5zdGFuY2UuVnVlKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoKFwicmVmcmVzaEluc3RhbmNlOiBpbnN0YW5jZSBcIiArIGluc3RhbmNlSWQgKyBcIiBub3QgZm91bmQhXCIpKVxuICB9XG4gIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgaW5zdGFuY2UuVnVlLnNldChpbnN0YW5jZS5hcHAsIGtleSwgZGF0YVtrZXldKTtcbiAgfVxuICAvLyBGaW5hbGx5IGByZWZyZXNoRmluaXNoYCBzaWduYWwgbmVlZGVkLlxuICBpbnN0YW5jZS5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAncmVmcmVzaEZpbmlzaCcgfSwgW10pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgSlNPTiBvYmplY3Qgb2YgdGhlIHJvb3QgZWxlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKi9cbmZ1bmN0aW9uIGdldFJvb3QgKGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICBpZiAoIWluc3RhbmNlIHx8ICEoaW5zdGFuY2UuYXBwIGluc3RhbmNlb2YgaW5zdGFuY2UuVnVlKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoKFwiZ2V0Um9vdDogaW5zdGFuY2UgXCIgKyBpbnN0YW5jZUlkICsgXCIgbm90IGZvdW5kIVwiKSlcbiAgfVxuICByZXR1cm4gaW5zdGFuY2UuYXBwLiRlbC50b0pTT04oKVxufVxuXG52YXIganNIYW5kbGVycyA9IHtcbiAgZmlyZUV2ZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICByZXR1cm4gZmlyZUV2ZW50LmFwcGx5KHZvaWQgMCwgWyBpbnN0YW5jZXNbaWRdIF0uY29uY2F0KCBhcmdzICkpXG4gIH0sXG4gIGNhbGxiYWNrOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodm9pZCAwLCBbIGluc3RhbmNlc1tpZF0gXS5jb25jYXQoIGFyZ3MgKSlcbiAgfVxufTtcblxuZnVuY3Rpb24gZmlyZUV2ZW50IChpbnN0YW5jZSwgbm9kZUlkLCB0eXBlLCBlLCBkb21DaGFuZ2VzKSB7XG4gIHZhciBlbCA9IGluc3RhbmNlLmRvY3VtZW50LmdldFJlZihub2RlSWQpO1xuICBpZiAoZWwpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuZG9jdW1lbnQuZmlyZUV2ZW50KGVsLCB0eXBlLCBlLCBkb21DaGFuZ2VzKVxuICB9XG4gIHJldHVybiBuZXcgRXJyb3IoKFwiaW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcXFwiXCIgKyBub2RlSWQgKyBcIlxcXCJcIikpXG59XG5cbmZ1bmN0aW9uIGNhbGxiYWNrIChpbnN0YW5jZSwgY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgdmFyIHJlc3VsdCA9IGluc3RhbmNlLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2soY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpO1xuICBpbnN0YW5jZS5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAndXBkYXRlRmluaXNoJyB9LCBbXSk7XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0gIHthcnJheX0gdGFza3MgbGlzdCB3aXRoIGBtZXRob2RgIGFuZCBgYXJnc2BcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZVRhc2tzIChpZCwgdGFza3MpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2lkXTtcbiAgaWYgKGluc3RhbmNlICYmIEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB0YXNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IGpzSGFuZGxlcnNbdGFzay5tZXRob2RdO1xuICAgICAgdmFyIGFyZ3MgPSBbXS5jb25jYXQoIHRhc2suYXJncyApO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhcmdzLnVuc2hpZnQoaWQpO1xuICAgICAgICByZXN1bHRzLnB1c2goaGFuZGxlci5hcHBseSh2b2lkIDAsIGFyZ3MpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG4gIHJldHVybiBuZXcgRXJyb3IoKFwiaW52YWxpZCBpbnN0YW5jZSBpZCBcXFwiXCIgKyBpZCArIFwiXFxcIiBvciB0YXNrc1wiKSlcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBuYXRpdmUgbW9kdWxlcyBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuZXdNb2R1bGVzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlcyAobmV3TW9kdWxlcykge1xuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggbmFtZSApIHtcbiAgICBpZiAoIW1vZHVsZXNbbmFtZV0pIHtcbiAgICAgIG1vZHVsZXNbbmFtZV0gPSB7fTtcbiAgICB9XG4gICAgbmV3TW9kdWxlc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICBtb2R1bGVzW25hbWVdW21ldGhvZF0gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kdWxlc1tuYW1lXVttZXRob2QubmFtZV0gPSBtZXRob2QuYXJncztcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBuYW1lIGluIG5ld01vZHVsZXMpIGxvb3AoIG5hbWUgKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBtb2R1bGUgb3IgdGhlIG1ldGhvZCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIG5hbWUgKG9wdGlvbmFsKVxuICovXG5mdW5jdGlvbiBpc1JlZ2lzdGVyZWRNb2R1bGUgKG5hbWUsIG1ldGhvZCkge1xuICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gISEobW9kdWxlc1tuYW1lXSAmJiBtb2R1bGVzW25hbWVdW21ldGhvZF0pXG4gIH1cbiAgcmV0dXJuICEhbW9kdWxlc1tuYW1lXVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIG5hdGl2ZSBjb21wb25lbnRzIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHthcnJheX0gbmV3Q29tcG9uZW50c1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudHMgKG5ld0NvbXBvbmVudHMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q29tcG9uZW50cykpIHtcbiAgICBuZXdDb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGNvbXBvbmVudC50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudC50eXBlXSA9IGNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudCBuYW1lXG4gKi9cbmZ1bmN0aW9uIGlzUmVnaXN0ZXJlZENvbXBvbmVudCAobmFtZSkge1xuICByZXR1cm4gISFjb21wb25lbnRzW25hbWVdXG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIFdlZXggc3VwcG9ydHMgc3BlY2lmaWMgZmVhdHVyZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gY29uZGl0aW9uXG4gKi9cbmZ1bmN0aW9uIHN1cHBvcnRzIChjb25kaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBjb25kaXRpb24gIT09ICdzdHJpbmcnKSB7IHJldHVybiBudWxsIH1cblxuICB2YXIgcmVzID0gY29uZGl0aW9uLm1hdGNoKC9eQChcXHcrKVxcLyhcXHcrKShcXC4oXFx3KykpPyQvaSk7XG4gIGlmIChyZXMpIHtcbiAgICB2YXIgdHlwZSA9IHJlc1sxXTtcbiAgICB2YXIgbmFtZSA9IHJlc1syXTtcbiAgICB2YXIgbWV0aG9kID0gcmVzWzRdO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbW9kdWxlJzogcmV0dXJuIGlzUmVnaXN0ZXJlZE1vZHVsZShuYW1lLCBtZXRob2QpXG4gICAgICBjYXNlICdjb21wb25lbnQnOiByZXR1cm4gaXNSZWdpc3RlcmVkQ29tcG9uZW50KG5hbWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmcmVzaCBpbnN0YW5jZSBvZiBWdWUgZm9yIGVhY2ggV2VleCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVnVlTW9kdWxlSW5zdGFuY2UgKGluc3RhbmNlSWQsIG1vZHVsZUdldHRlcikge1xuICB2YXIgZXhwb3J0cyA9IHt9O1xuICBWdWVGYWN0b3J5KGV4cG9ydHMsIHJlbmRlcmVyKTtcbiAgdmFyIFZ1ZSA9IGV4cG9ydHMuVnVlO1xuXG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcblxuICAvLyBwYXRjaCByZXNlcnZlZCB0YWcgZGV0ZWN0aW9uIHRvIGFjY291bnQgZm9yIGR5bmFtaWNhbGx5IHJlZ2lzdGVyZWRcbiAgLy8gY29tcG9uZW50c1xuICB2YXIgd2VleFJlZ2V4ID0gL153ZWV4Oi9pO1xuICB2YXIgaXNSZXNlcnZlZFRhZyA9IFZ1ZS5jb25maWcuaXNSZXNlcnZlZFRhZyB8fCAoZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pO1xuICB2YXIgaXNSdW50aW1lQ29tcG9uZW50ID0gVnVlLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnQgfHwgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTtcbiAgVnVlLmNvbmZpZy5pc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gKCFpc1J1bnRpbWVDb21wb25lbnQobmFtZSkgJiYgY29tcG9uZW50c1tuYW1lXSkgfHxcbiAgICAgIGlzUmVzZXJ2ZWRUYWcobmFtZSkgfHxcbiAgICAgIHdlZXhSZWdleC50ZXN0KG5hbWUpXG4gIH07XG4gIFZ1ZS5jb25maWcucGFyc2VQbGF0Zm9ybVRhZ05hbWUgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gbmFtZS5yZXBsYWNlKHdlZXhSZWdleCwgJycpOyB9O1xuXG4gIC8vIGV4cG9zZSB3ZWV4LXNwZWNpZmljIGluZm9cbiAgVnVlLnByb3RvdHlwZS4kaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRvY3VtZW50ID0gaW5zdGFuY2UuZG9jdW1lbnQ7XG5cbiAgLy8gZXhwb3NlIHdlZXggbmF0aXZlIG1vZHVsZSBnZXR0ZXIgb24gc3ViVnVlIHByb3RvdHlwZSBzbyB0aGF0XG4gIC8vIHZkb20gcnVudGltZSBtb2R1bGVzIGNhbiBhY2Nlc3MgbmF0aXZlIG1vZHVsZXMgdmlhIHZub2RlLmNvbnRleHRcbiAgVnVlLnByb3RvdHlwZS4kcmVxdWlyZVdlZXhNb2R1bGUgPSBtb2R1bGVHZXR0ZXI7XG5cbiAgLy8gSGFjayBgVnVlYCBiZWhhdmlvciB0byBoYW5kbGUgaW5zdGFuY2UgaW5mb3JtYXRpb24gYW5kIGRhdGFcbiAgLy8gYmVmb3JlIHJvb3QgY29tcG9uZW50IGNyZWF0ZWQuXG4gIFZ1ZS5taXhpbih7XG4gICAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUgKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLiRvcHRpb25zO1xuICAgICAgLy8gcm9vdCBjb21wb25lbnQgKHZtKVxuICAgICAgaWYgKG9wdGlvbnMuZWwpIHtcbiAgICAgICAgLy8gc2V0IGV4dGVybmFsIGRhdGEgb2YgaW5zdGFuY2VcbiAgICAgICAgdmFyIGRhdGFPcHRpb24gPSBvcHRpb25zLmRhdGE7XG4gICAgICAgIHZhciBpbnRlcm5hbERhdGEgPSAodHlwZW9mIGRhdGFPcHRpb24gPT09ICdmdW5jdGlvbicgPyBkYXRhT3B0aW9uKCkgOiBkYXRhT3B0aW9uKSB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5kYXRhID0gT2JqZWN0LmFzc2lnbihpbnRlcm5hbERhdGEsIGluc3RhbmNlLmRhdGEpO1xuICAgICAgICAvLyByZWNvcmQgaW5zdGFuY2UgYnkgaWRcbiAgICAgICAgaW5zdGFuY2UuYXBwID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBKdXN0IGluc3RhbmNlIHZhcmlhYmxlIGB3ZWV4LmNvbmZpZ2BcbiAgICogR2V0IGluc3RhbmNlIGNvbmZpZy5cbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgVnVlLnByb3RvdHlwZS4kZ2V0Q29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChpbnN0YW5jZS5hcHAgaW5zdGFuY2VvZiBWdWUpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5jb25maWdcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFZ1ZVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIG5hdGl2ZSBtb2R1bGUgZ2V0dGVyLiBFYWNoIG5hdGl2ZSBtb2R1bGUgaGFzIHNldmVyYWxcbiAqIG1ldGhvZHMgdG8gY2FsbC4gQW5kIGFsbCB0aGUgYmVoYXZpb3JzIGlzIGluc3RhbmNlLXJlbGF0ZWQuIFNvXG4gKiB0aGlzIGdldHRlciB3aWxsIHJldHVybiBhIHNldCBvZiBtZXRob2RzIHdoaWNoIGFkZGl0aW9uYWxseVxuICogc2VuZCBjdXJyZW50IGluc3RhbmNlIGlkIHRvIG5hdGl2ZSB3aGVuIGNhbGxlZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gIGluc3RhbmNlSWRcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBnZW5Nb2R1bGVHZXR0ZXIgKGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgbmF0aXZlTW9kdWxlID0gbW9kdWxlc1tuYW1lXSB8fCBbXTtcbiAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIG1ldGhvZE5hbWUgKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0cHV0LCBtZXRob2ROYW1lLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBwcm94eUdldHRlciAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdtb2R1bGUnLCB7IG1vZHVsZTogbmFtZSwgbWV0aG9kOiBtZXRob2ROYW1lIH0sIGFyZ3MpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgnbW9kdWxlJywgeyBtb2R1bGU6IG5hbWUsIG1ldGhvZDogbWV0aG9kTmFtZSB9LCBbdmFsXSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBtZXRob2ROYW1lIGluIG5hdGl2ZU1vZHVsZSkgbG9vcCggbWV0aG9kTmFtZSApO1xuICAgIHJldHVybiBvdXRwdXRcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIEhUTUw1IFRpbWVyIEFQSXMuIEFuIGltcG9ydGFudCBwb2ludCBpcyB0aGF0IHRoZSBjYWxsYmFja1xuICogd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBjYWxsYmFjayBpZCB3aGVuIHNlbnQgdG8gbmF0aXZlLiBTbyB0aGVcbiAqIGZyYW1ld29yayBjYW4gbWFrZSBzdXJlIG5vIHNpZGUgZWZmZWN0IG9mIHRoZSBjYWxsYmFjayBoYXBwZW5lZCBhZnRlclxuICogYW4gaW5zdGFuY2UgZGVzdHJveWVkLlxuICogQHBhcmFtICB7W3R5cGVdfSBpbnN0YW5jZUlkICAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBtb2R1bGVHZXR0ZXIgW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRJbnN0YW5jZVRpbWVyIChpbnN0YW5jZUlkLCBtb2R1bGVHZXR0ZXIpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICB2YXIgdGltZXIgPSBtb2R1bGVHZXR0ZXIoJ3RpbWVyJyk7XG4gIHZhciB0aW1lckFQSXMgPSB7XG4gICAgc2V0VGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhcmdzWzBdLmFwcGx5KGFyZ3MsIGFyZ3Muc2xpY2UoMikpO1xuICAgICAgfTtcblxuICAgICAgdGltZXIuc2V0VGltZW91dChoYW5kbGVyLCBhcmdzWzFdKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpXG4gICAgfSxcbiAgICBzZXRJbnRlcnZhbDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhcmdzWzBdLmFwcGx5KGFyZ3MsIGFyZ3Muc2xpY2UoMikpO1xuICAgICAgfTtcblxuICAgICAgdGltZXIuc2V0SW50ZXJ2YWwoaGFuZGxlciwgYXJnc1sxXSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKVxuICAgIH0sXG4gICAgY2xlYXJUaW1lb3V0OiBmdW5jdGlvbiAobikge1xuICAgICAgdGltZXIuY2xlYXJUaW1lb3V0KG4pO1xuICAgIH0sXG4gICAgY2xlYXJJbnRlcnZhbDogZnVuY3Rpb24gKG4pIHtcbiAgICAgIHRpbWVyLmNsZWFySW50ZXJ2YWwobik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdGltZXJBUElzXG59XG5cbi8qKlxuICogQ2FsbCBhIG5ldyBmdW5jdGlvbiBib2R5IHdpdGggc29tZSBnbG9iYWwgb2JqZWN0cy5cbiAqIEBwYXJhbSAge29iamVjdH0gZ2xvYmFsT2JqZWN0c1xuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGNhbGxGdW5jdGlvbiAoZ2xvYmFsT2JqZWN0cywgYm9keSkge1xuICB2YXIgZ2xvYmFsS2V5cyA9IFtdO1xuICB2YXIgZ2xvYmFsVmFsdWVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBnbG9iYWxPYmplY3RzKSB7XG4gICAgZ2xvYmFsS2V5cy5wdXNoKGtleSk7XG4gICAgZ2xvYmFsVmFsdWVzLnB1c2goZ2xvYmFsT2JqZWN0c1trZXldKTtcbiAgfVxuICBnbG9iYWxLZXlzLnB1c2goYm9keSk7XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoIEZ1bmN0aW9uLCBbIG51bGwgXS5jb25jYXQoIGdsb2JhbEtleXMpICkpO1xuICByZXR1cm4gcmVzdWx0LmFwcGx5KHZvaWQgMCwgZ2xvYmFsVmFsdWVzKVxufVxuXG4vKipcbiAqIENhbGwgYSBuZXcgZnVuY3Rpb24gZ2VuZXJhdGVkIG9uIHRoZSBWOCBuYXRpdmUgc2lkZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGhlbHBzIHNwZWVkIHVwIGJ1bmRsZSBjb21waWxpbmcuIE5vcm1hbGx5LCB0aGUgVjhcbiAqIGVuZ2luZSBuZWVkcyB0byBkb3dubG9hZCwgcGFyc2UsIGFuZCBjb21waWxlIGEgYnVuZGxlIG9uIGV2ZXJ5XG4gKiB2aXNpdC4gSWYgJ2NvbXBpbGVCdW5kbGUoKScgaXMgYXZhaWxhYmxlIG9uIG5hdGl2ZSBzaWRlLFxuICogdGhlIGRvd25sb2RpbmcsIHBhcnNpbmcsIGFuZCBjb21waWxpbmcgc3RlcHMgd291bGQgYmUgc2tpcHBlZC5cbiAqIEBwYXJhbSAge29iamVjdH0gZ2xvYmFsT2JqZWN0c1xuICogQHBhcmFtICB7c3RyaW5nfSBib2R5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjYWxsRnVuY3Rpb25OYXRpdmUgKGdsb2JhbE9iamVjdHMsIGJvZHkpIHtcbiAgaWYgKHR5cGVvZiByZW5kZXJlci5jb21waWxlQnVuZGxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB2YXIgZm4gPSB2b2lkIDA7XG4gIHZhciBpc05hdGl2ZUNvbXBpbGVPayA9IGZhbHNlO1xuICB2YXIgc2NyaXB0ID0gJyhmdW5jdGlvbiAoJztcbiAgdmFyIGdsb2JhbEtleXMgPSBbXTtcbiAgdmFyIGdsb2JhbFZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gZ2xvYmFsT2JqZWN0cykge1xuICAgIGdsb2JhbEtleXMucHVzaChrZXkpO1xuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSk7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWxLZXlzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgIHNjcmlwdCArPSBnbG9iYWxLZXlzW2ldO1xuICAgIHNjcmlwdCArPSAnLCc7XG4gIH1cbiAgc2NyaXB0ICs9IGdsb2JhbEtleXNbZ2xvYmFsS2V5cy5sZW5ndGggLSAxXTtcbiAgc2NyaXB0ICs9ICcpIHsnO1xuICBzY3JpcHQgKz0gYm9keTtcbiAgc2NyaXB0ICs9ICd9ICknO1xuXG4gIHRyeSB7XG4gICAgdmFyIHdlZXggPSBnbG9iYWxPYmplY3RzLndlZXggfHwge307XG4gICAgdmFyIGNvbmZpZyA9IHdlZXguY29uZmlnIHx8IHt9O1xuICAgIGZuID0gcmVuZGVyZXIuY29tcGlsZUJ1bmRsZShzY3JpcHQsXG4gICAgICBjb25maWcuYnVuZGxlVXJsLFxuICAgICAgY29uZmlnLmJ1bmRsZURpZ2VzdCxcbiAgICAgIGNvbmZpZy5jb2RlQ2FjaGVQYXRoKTtcbiAgICBpZiAoZm4gJiYgdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmbi5hcHBseSh2b2lkIDAsIGdsb2JhbFZhbHVlcyk7XG4gICAgICBpc05hdGl2ZUNvbXBpbGVPayA9IHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgfVxuXG4gIHJldHVybiBpc05hdGl2ZUNvbXBpbGVPa1xufVxuXG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5yZXNldCA9IHJlc2V0O1xuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlO1xuZXhwb3J0cy5kZXN0cm95SW5zdGFuY2UgPSBkZXN0cm95SW5zdGFuY2U7XG5leHBvcnRzLnJlZnJlc2hJbnN0YW5jZSA9IHJlZnJlc2hJbnN0YW5jZTtcbmV4cG9ydHMuZ2V0Um9vdCA9IGdldFJvb3Q7XG5leHBvcnRzLnJlY2VpdmVUYXNrcyA9IHJlY2VpdmVUYXNrcztcbmV4cG9ydHMucmVnaXN0ZXJNb2R1bGVzID0gcmVnaXN0ZXJNb2R1bGVzO1xuZXhwb3J0cy5pc1JlZ2lzdGVyZWRNb2R1bGUgPSBpc1JlZ2lzdGVyZWRNb2R1bGU7XG5leHBvcnRzLnJlZ2lzdGVyQ29tcG9uZW50cyA9IHJlZ2lzdGVyQ29tcG9uZW50cztcbmV4cG9ydHMuaXNSZWdpc3RlcmVkQ29tcG9uZW50ID0gaXNSZWdpc3RlcmVkQ29tcG9uZW50O1xuZXhwb3J0cy5zdXBwb3J0cyA9IHN1cHBvcnRzO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgVGhlIGFwaSBmb3IgaW52b2tpbmcgd2l0aCBcIiRcIiBwcmVmaXhcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSAkdm0gaW5zdGVhZFxuICogZmluZCB0aGUgdm0gYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7Vm19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkIChpZCkge1xuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFZtIyQgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBWbSMkdm0gaW5zdGVhZCcpXG4gIGNvbnN0IGluZm8gPSB0aGlzLl9pZHNbaWRdXG4gIGlmIChpbmZvKSB7XG4gICAgcmV0dXJuIGluZm8udm1cbiAgfVxufVxuXG4vKipcbiAqIGZpbmQgdGhlIGVsZW1lbnQgYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRlbCAoaWQpIHtcbiAgY29uc3QgaW5mbyA9IHRoaXMuX2lkc1tpZF1cbiAgaWYgKGluZm8pIHtcbiAgICByZXR1cm4gaW5mby5lbFxuICB9XG59XG5cbi8qKlxuICogZmluZCB0aGUgdm0gb2YgdGhlIGN1c3RvbSBjb21wb25lbnQgYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7Vm19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkdm0gKGlkKSB7XG4gIGNvbnN0IGluZm8gPSB0aGlzLl9pZHNbaWRdXG4gIGlmIChpbmZvKSB7XG4gICAgcmV0dXJuIGluZm8udm1cbiAgfVxufVxuXG4vKipcbiAqIEZpcmUgd2hlbiBkaWZmZXIgcmVuZGVyaW5nIGZpbmlzaGVkXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkcmVuZGVyVGhlbiAoZm4pIHtcbiAgY29uc3QgYXBwID0gdGhpcy5fYXBwXG4gIGNvbnN0IGRpZmZlciA9IGFwcC5kaWZmZXJcbiAgcmV0dXJuIGRpZmZlci50aGVuKCgpID0+IHtcbiAgICBmbigpXG4gIH0pXG59XG5cbi8qKlxuICogc2Nyb2xsIGFuIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IGlkIGludG8gdmlldyxcbiAqIG1vcmVvdmVyIHNwZWNpZnkgYSBudW1iZXIgb2Ygb2Zmc2V0IG9wdGlvbmFsbHlcbiAqIEBwYXJhbSAge3N0cmluZ30gaWRcbiAqIEBwYXJhbSAge251bWJlcn0gb2Zmc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkc2Nyb2xsVG8gKGlkLCBvZmZzZXQpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkc2Nyb2xsVG8gaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgJ3BsZWFzZSB1c2UgXCJyZXF1aXJlKFxcJ0B3ZWV4LW1vZHVsZS9kb21cXCcpJyArXG4gICAgICAgICAgJy5zY3JvbGxUbyhlbCwgb3B0aW9ucylcIiBpbnN0ZWFkJylcbiAgY29uc3QgZWwgPSB0aGlzLiRlbChpZClcbiAgaWYgKGVsKSB7XG4gICAgY29uc3QgZG9tID0gdGhpcy5fYXBwLnJlcXVpcmVNb2R1bGUoJ2RvbScpXG4gICAgZG9tLnNjcm9sbFRvRWxlbWVudChlbC5yZWYsIHsgb2Zmc2V0OiBvZmZzZXQgfSlcbiAgfVxufVxuXG4vKipcbiAqIHBlcmZvcm0gdHJhbnNpdGlvbiBhbmltYXRpb24gb24gYW4gZWxlbWVudCBzcGVjaWZpZWQgYnkgaWRcbiAqIEBwYXJhbSAge3N0cmluZ30gICBpZFxuICogQHBhcmFtICB7b2JqZWN0fSAgIG9wdGlvbnNcbiAqIEBwYXJhbSAge29iamVjdH0gICBvcHRpb25zLnN0eWxlc1xuICogQHBhcmFtICB7b2JqZWN0fSAgIG9wdGlvbnMuZHVyYXRpb24obXMpXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgW29wdGlvbnMudGltaW5nRnVuY3Rpb25dXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgW29wdGlvbnMuZGVsYXk9MChtcyldXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICR0cmFuc2l0aW9uIChpZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgY29uc3QgZWwgPSB0aGlzLiRlbChpZClcbiAgaWYgKGVsICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5zdHlsZXMpIHtcbiAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLl9hcHAucmVxdWlyZU1vZHVsZSgnYW5pbWF0aW9uJylcbiAgICBhbmltYXRpb24udHJhbnNpdGlvbihlbC5yZWYsIG9wdGlvbnMsICguLi5hcmdzKSA9PiB7XG4gICAgICB0aGlzLl9zZXRTdHlsZShlbCwgb3B0aW9ucy5zdHlsZXMpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayguLi5hcmdzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBnZXQgc29tZSBjb25maWdcbiAqIEByZXR1cm4ge29iamVjdH0gc29tZSBjb25maWcgZm9yIGFwcCBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZVVybFxuICogQHByb3BlcnR5IHtib29sZWFufSBkZWJ1Z1xuICogQHByb3BlcnR5IHtvYmplY3R9IGVudlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi53ZWV4VmVyc2lvbihleC4gMS4wLjApXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW52LmFwcE5hbWUoZXguIFRCL1RNKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5hcHBWZXJzaW9uKGV4LiA1LjAuMClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbnYucGxhdGZvcm0oZXguIGlPUy9BbmRyb2lkKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5vc1ZlcnNpb24oZXguIDcuMC4wKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5kZXZpY2VNb2RlbCAqKm5hdGl2ZSBvbmx5KipcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnYuW2RldmljZVdpZHRoPTc1MF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnYuZGV2aWNlSGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkZ2V0Q29uZmlnIChjYWxsYmFjaykge1xuICBjb25zdCBjb25maWcgPSB0aGlzLl9hcHAub3B0aW9uc1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSB0aGUgY2FsbGJhY2sgb2YgVm0jJGdldENvbmZpZyhjYWxsYmFjaykgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAndGhpcyBhcGkgbm93IGNhbiBkaXJlY3RseSBSRVRVUk4gY29uZmlnIGluZm8uJylcbiAgICBjYWxsYmFjayhjb25maWcpXG4gIH1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiByZXF1ZXN0IG5ldHdvcmsgdmlhIGh0dHAgcHJvdG9jb2xcbiAqIEBwYXJhbSAge29iamVjdH0gICBwYXJhbXNcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gJHNlbmRIdHRwIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gVm0jJHNlbmRIdHRwIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgICAgICdwbGVhc2UgdXNlIFwicmVxdWlyZShcXCdAd2VleC1tb2R1bGUvc3RyZWFtXFwnKScgK1xuICAgICAgICAgICcuc2VuZEh0dHAocGFyYW1zLCBjYWxsYmFjaylcIiBpbnN0ZWFkJylcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5fYXBwLnJlcXVpcmVNb2R1bGUoJ3N0cmVhbScpXG4gIHN0cmVhbS5zZW5kSHR0cChwYXJhbXMsIGNhbGxiYWNrKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBvcGVuIGEgdXJsXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICovXG5leHBvcnQgZnVuY3Rpb24gJG9wZW5VUkwgKHVybCkge1xuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFZtIyRvcGVuVVJMIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgICAgICdwbGVhc2UgdXNlIFwicmVxdWlyZShcXCdAd2VleC1tb2R1bGUvZXZlbnRcXCcpJyArXG4gICAgICAgICAgJy5vcGVuVVJMKHVybClcIiBpbnN0ZWFkJylcbiAgY29uc3QgZXZlbnQgPSB0aGlzLl9hcHAucmVxdWlyZU1vZHVsZSgnZXZlbnQnKVxuICBldmVudC5vcGVuVVJMKHVybClcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogc2V0IGEgdGl0bGUgZm9yIHBhZ2VcbiAqIEBwYXJhbSAge3N0cmluZ30gdGl0bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRzZXRUaXRsZSAodGl0bGUpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkc2V0VGl0bGUgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgJ3BsZWFzZSB1c2UgXCJyZXF1aXJlKFxcJ0B3ZWV4LW1vZHVsZS9wYWdlSW5mb1xcJyknICtcbiAgICAgICAgICAnLnNldFRpdGxlKHRpdGxlKVwiIGluc3RlYWQnKVxuICBjb25zdCBwYWdlSW5mbyA9IHRoaXMuX2FwcC5yZXF1aXJlTW9kdWxlKCdwYWdlSW5mbycpXG4gIHBhZ2VJbmZvLnNldFRpdGxlKHRpdGxlKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBcInJlcXVpcmUoJ0B3ZWV4LW1vZHVsZS9tb2R1bGVOYW1lJykgaW5zdGVhZFwiXG4gKiBpbnZva2UgYSBuYXRpdmUgbWV0aG9kIGJ5IHNwZWNpZmluZyB0aGUgbmFtZSBvZiBtb2R1bGUgYW5kIG1ldGhvZFxuICogQHBhcmFtICB7c3RyaW5nfSBtb2R1bGVOYW1lXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSAgey4uLip9IHRoZSByZXN0IGFyZ3VtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gJGNhbGwgKG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkY2FsbCBpcyBkZXByZWNhdGVkLCAnICtcbiAgICAncGxlYXNlIHVzZSBcInJlcXVpcmUoXFwnQHdlZXgtbW9kdWxlL21vZHVsZU5hbWVcXCcpXCIgaW5zdGVhZCcpXG4gIGNvbnN0IG1vZHVsZSA9IHRoaXMuX2FwcC5yZXF1aXJlTW9kdWxlKG1vZHVsZU5hbWUpXG4gIGlmIChtb2R1bGUgJiYgbW9kdWxlW21ldGhvZE5hbWVdKSB7XG4gICAgbW9kdWxlW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBNaXggcHJvcGVydGllcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRvXG4gKiBAcGFyYW0ge09iamVjdH0gZnJvbVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuZCAodGFyZ2V0LCAuLi5zcmMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduID09PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIC4uLnNyYylcbiAgfVxuICBlbHNlIHtcbiAgICBjb25zdCBmaXJzdCA9IHNyYy5zaGlmdCgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmlyc3QpIHtcbiAgICAgIHRhcmdldFtrZXldID0gZmlyc3Rba2V5XVxuICAgIH1cbiAgICBpZiAoc3JjLmxlbmd0aCkge1xuICAgICAgZXh0ZW5kKHRhcmdldCwgLi4uc3JjKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2VudW1lcmFibGVdXG4gKi9cblxuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICovXG5cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgY29uc3QgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKVxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbi8qKlxuICogU2ltcGxlIGJpbmQsIGZhc3RlciB0aGFuIG5hdGl2ZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiBiaW5kIChmbiwgY3R4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgIGNvbnN0IGwgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5LWxpa2V9IGxpc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc3RhcnRdIC0gc3RhcnQgaW5kZXhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5cbmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMFxuICBsZXQgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnRcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5KGkpXG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF1cbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbi8qKlxuICogU3RyaWN0IG9iamVjdCB0eXBlIGNoZWNrLiBPbmx5IHJldHVybnMgdHJ1ZVxuICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbmNvbnN0IE9CSkVDVF9TVFJJTkcgPSAnW29iamVjdCBPYmplY3RdJ1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IE9CSkVDVF9TVFJJTkdcbn1cblxuZXhwb3J0IHtcbiAgZXh0ZW5kLFxuICBkZWYsXG4gIHJlbW92ZSxcbiAgaGFzT3duLFxuICBiaW5kLFxuICB0b0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQge1xuICBleHRlbmQsXG4gIGRlZixcbiAgcmVtb3ZlLFxuICBoYXNPd24sXG4gIGJpbmQsXG4gIHRvQXJyYXksXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0XG59IGZyb20gJy4vc2hhcmVkJ1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICBjb25zdCBjID0gKHN0ciArICcnKS5jaGFyQ29kZUF0KDApXG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLy8gY2FuIHdlIHVzZSBfX3Byb3RvX18/XG5leHBvcnQgY29uc3QgaGFzUHJvdG8gPSAnX19wcm90b19fJyBpbiB7fVxuXG5sZXQgX1NldFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmICh0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJyAmJiBTZXQudG9TdHJpbmcoKS5tYXRjaCgvbmF0aXZlIGNvZGUvKSkge1xuICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS5cbiAgX1NldCA9IFNldFxufVxuZWxzZSB7XG4gIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy5cbiAgX1NldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnNldCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgfVxuICBfU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gIT09IHVuZGVmaW5lZFxuICB9XG4gIF9TZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09IG51bGwgfHwgdGhpcy5zZXRba2V5XSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuc2V0W2tleV0gPSAxXG4gIH1cbiAgX1NldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIH1cbn1cblxuZXhwb3J0IHsgX1NldCB9XG5cbi8qKlxuICogUG9seWZpbGwgaW4gaU9TNyBieSBuYXRpdmUgYmVjYXVzZSB0aGUgSmF2YVNjcmlwdCBwb2x5ZmlsbCBoYXMgbWVtb3J5IHByb2JsZW0uXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5ld1NldCAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIGlmICh0eXBlb2YgbmF0aXZlU2V0ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBuYXRpdmVTZXQuY3JlYXRlKClcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlICovXG4gIHJldHVybiBuZXcgX1NldCgpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGVkIHZlcnNpb24gb2YgYSBwdXJlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdXG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpXG4gIH1cbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxtaXRlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmNvbnN0IGNhbWVsaXplUkUgPSAvLShcXHcpL2dcbmV4cG9ydCBjb25zdCBjYW1lbGl6ZSA9IGNhY2hlZChzdHIgPT4ge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgdG9VcHBlcilcbn0pXG5cbmZ1bmN0aW9uIHRvVXBwZXIgKF8sIGMpIHtcbiAgcmV0dXJuIGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJ1xufVxuXG4vKipcbiAqIEh5cGhlbmF0ZSBhIGNhbWVsQ2FzZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmNvbnN0IGh5cGhlbmF0ZVJFID0gLyhbYS16XFxkXSkoW0EtWl0pL2dcbmV4cG9ydCBjb25zdCBoeXBoZW5hdGUgPSBjYWNoZWQoc3RyID0+IHtcbiAgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnJDEtJDInKVxuICAgIC50b0xvd2VyQ2FzZSgpXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwb2YgKHYpIHtcbiAgY29uc3QgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KVxuICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKS50b0xvd2VyQ2FzZSgpXG59XG5cbi8vIHdlZXggbmFtZSBydWxlc1xuXG5jb25zdCBXRUVYX0NPTVBPTkVOVF9SRUcgPSAvXkB3ZWV4LWNvbXBvbmVudFxcLy9cbmNvbnN0IFdFRVhfTU9EVUxFX1JFRyA9IC9eQHdlZXgtbW9kdWxlXFwvL1xuY29uc3QgTk9STUFMX01PRFVMRV9SRUcgPSAvXlxcLnsxLDJ9XFwvL1xuY29uc3QgSlNfU1VSRklYX1JFRyA9IC9cXC5qcyQvXG5cbmV4cG9ydCBjb25zdCBpc1dlZXhDb21wb25lbnQgPSBuYW1lID0+ICEhbmFtZS5tYXRjaChXRUVYX0NPTVBPTkVOVF9SRUcpXG5leHBvcnQgY29uc3QgaXNXZWV4TW9kdWxlID0gbmFtZSA9PiAhIW5hbWUubWF0Y2goV0VFWF9NT0RVTEVfUkVHKVxuZXhwb3J0IGNvbnN0IGlzTm9ybWFsTW9kdWxlID0gbmFtZSA9PiAhIW5hbWUubWF0Y2goTk9STUFMX01PRFVMRV9SRUcpXG5leHBvcnQgY29uc3QgaXNOcG1Nb2R1bGUgPSBuYW1lID0+ICFpc1dlZXhDb21wb25lbnQobmFtZSkgJiYgIWlzV2VleE1vZHVsZShuYW1lKSAmJiAhaXNOb3JtYWxNb2R1bGUobmFtZSlcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVdlZXhQcmVmaXggKHN0cikge1xuICBjb25zdCByZXN1bHQgPSBzdHIucmVwbGFjZShXRUVYX0NPTVBPTkVOVF9SRUcsICcnKS5yZXBsYWNlKFdFRVhfTU9EVUxFX1JFRywgJycpXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUpTU3VyZml4IChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKEpTX1NVUkZJWF9SRUcsICcnKVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5pbXBvcnQgeyByZW1vdmUgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5sZXQgdWlkID0gMFxuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEZXAgKCkge1xuICB0aGlzLmlkID0gdWlkKytcbiAgdGhpcy5zdWJzID0gW11cbn1cblxuLy8gdGhlIGN1cnJlbnQgdGFyZ2V0IHdhdGNoZXIgYmVpbmcgZXZhbHVhdGVkLlxuLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZVxuLy8gd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQgYXQgYW55IHRpbWUuXG5EZXAudGFyZ2V0ID0gbnVsbFxubGV0IHRhcmdldFN0YWNrID0gW11cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hUYXJnZXQgKF90YXJnZXQpIHtcbiAgaWYgKERlcC50YXJnZXQpIHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldClcbiAgRGVwLnRhcmdldCA9IF90YXJnZXRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcFRhcmdldCAoKSB7XG4gIERlcC50YXJnZXQgPSB0YXJnZXRTdGFjay5wb3AoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRUYXJnZXQgKCkge1xuICBEZXAudGFyZ2V0ID0gbnVsbFxuICB0YXJnZXRTdGFjayA9IFtdXG59XG5cbi8qKlxuICogQWRkIGEgZGlyZWN0aXZlIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtEaXJlY3RpdmV9IHN1YlxuICovXG5cbkRlcC5wcm90b3R5cGUuYWRkU3ViID0gZnVuY3Rpb24gKHN1Yikge1xuICB0aGlzLnN1YnMucHVzaChzdWIpXG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZGlyZWN0aXZlIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtEaXJlY3RpdmV9IHN1YlxuICovXG5cbkRlcC5wcm90b3R5cGUucmVtb3ZlU3ViID0gZnVuY3Rpb24gKHN1Yikge1xuICByZW1vdmUodGhpcy5zdWJzLCBzdWIpXG59XG5cbi8qKlxuICogQWRkIHNlbGYgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSB0YXJnZXQgd2F0Y2hlci5cbiAqL1xuXG5EZXAucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKERlcC50YXJnZXQpIHtcbiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKVxuICB9XG59XG5cbi8qKlxuICogTm90aWZ5IGFsbCBzdWJzY3JpYmVycyBvZiBhIG5ldyB2YWx1ZS5cbiAqL1xuXG5EZXAucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gc3RhYmxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICBjb25zdCBzdWJzID0gdGhpcy5zdWJzLnNsaWNlKClcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBzdWJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHN1YnNbaV0udXBkYXRlKClcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5pbXBvcnQgRGVwLCB7IHB1c2hUYXJnZXQsIHBvcFRhcmdldCB9IGZyb20gJy4vZGVwJ1xuLy8gaW1wb3J0IHsgcHVzaFdhdGNoZXIgfSBmcm9tICcuL2JhdGNoZXInXG5pbXBvcnQge1xuICByZW1vdmUsXG4gIGV4dGVuZCxcbiAgaXNPYmplY3QsXG4gIGNyZWF0ZU5ld1NldFxuICAvLyBfU2V0IGFzIFNldFxufSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5sZXQgdWlkID0gMFxuXG4vKipcbiAqIEEgd2F0Y2hlciBwYXJzZXMgYW4gZXhwcmVzc2lvbiwgY29sbGVjdHMgZGVwZW5kZW5jaWVzLFxuICogYW5kIGZpcmVzIGNhbGxiYWNrIHdoZW4gdGhlIGV4cHJlc3Npb24gdmFsdWUgY2hhbmdlcy5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLlxuICpcbiAqIEBwYXJhbSB7VnVlfSB2bVxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IGV4cE9yRm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgICAgICAgICAgIC0ge0FycmF5fSBmaWx0ZXJzXG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gdHdvV2F5XG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gZGVlcFxuICogICAgICAgICAgICAgICAgIC0ge0Jvb2xlYW59IHVzZXJcbiAqICAgICAgICAgICAgICAgICAtIHtCb29sZWFufSBzeW5jXG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gbGF6eVxuICogICAgICAgICAgICAgICAgIC0ge0Z1bmN0aW9ufSBbcHJlUHJvY2Vzc11cbiAqICAgICAgICAgICAgICAgICAtIHtGdW5jdGlvbn0gW3Bvc3RQcm9jZXNzXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gV2F0Y2hlciAodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKSB7XG4gIC8vIG1peCBpbiBvcHRpb25zXG4gIGlmIChvcHRpb25zKSB7XG4gICAgZXh0ZW5kKHRoaXMsIG9wdGlvbnMpXG4gIH1cbiAgY29uc3QgaXNGbiA9IHR5cGVvZiBleHBPckZuID09PSAnZnVuY3Rpb24nXG4gIHRoaXMudm0gPSB2bVxuICB2bS5fd2F0Y2hlcnMucHVzaCh0aGlzKVxuICB0aGlzLmV4cHJlc3Npb24gPSBleHBPckZuXG4gIHRoaXMuY2IgPSBjYlxuICB0aGlzLmlkID0gKyt1aWQgLy8gdWlkIGZvciBiYXRjaGluZ1xuICB0aGlzLmFjdGl2ZSA9IHRydWVcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eSAvLyBmb3IgbGF6eSB3YXRjaGVyc1xuICB0aGlzLmRlcHMgPSBbXVxuICB0aGlzLm5ld0RlcHMgPSBbXVxuICB0aGlzLmRlcElkcyA9IGNyZWF0ZU5ld1NldCgpIC8vIG5ldyBTZXQoKVxuICB0aGlzLm5ld0RlcElkcyA9IGNyZWF0ZU5ld1NldCgpIC8vIG5ldyBTZXQoKVxuICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXJcbiAgaWYgKGlzRm4pIHtcbiAgICB0aGlzLmdldHRlciA9IGV4cE9yRm5cbiAgfVxuICB0aGlzLnZhbHVlID0gdGhpcy5sYXp5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHRoaXMuZ2V0KClcbiAgLy8gc3RhdGUgZm9yIGF2b2lkaW5nIGZhbHNlIHRyaWdnZXJzIGZvciBkZWVwIGFuZCBBcnJheVxuICAvLyB3YXRjaGVycyBkdXJpbmcgdm0uX2RpZ2VzdCgpXG4gIHRoaXMucXVldWVkID0gdGhpcy5zaGFsbG93ID0gZmFsc2Vcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICBwdXNoVGFyZ2V0KHRoaXMpXG4gIGNvbnN0IHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh0aGlzLnZtLCB0aGlzLnZtKVxuICAvLyBcInRvdWNoXCIgZXZlcnkgcHJvcGVydHkgc28gdGhleSBhcmUgYWxsIHRyYWNrZWQgYXNcbiAgLy8gZGVwZW5kZW5jaWVzIGZvciBkZWVwIHdhdGNoaW5nXG4gIGlmICh0aGlzLmRlZXApIHtcbiAgICB0cmF2ZXJzZSh2YWx1ZSlcbiAgfVxuICBwb3BUYXJnZXQoKVxuICB0aGlzLmNsZWFudXBEZXBzKClcbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge0RlcH0gZGVwXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gKGRlcCkge1xuICBjb25zdCBpZCA9IGRlcC5pZFxuICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHtcbiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpXG4gICAgdGhpcy5uZXdEZXBzLnB1c2goZGVwKVxuICAgIGlmICghdGhpcy5kZXBJZHMuaGFzKGlkKSkge1xuICAgICAgZGVwLmFkZFN1Yih0aGlzKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuY2xlYW51cERlcHMgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBpID0gdGhpcy5kZXBzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3QgZGVwID0gdGhpcy5kZXBzW2ldXG4gICAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoZGVwLmlkKSkge1xuICAgICAgZGVwLnJlbW92ZVN1Yih0aGlzKVxuICAgIH1cbiAgfVxuICBsZXQgdG1wID0gdGhpcy5kZXBJZHNcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkc1xuICB0aGlzLm5ld0RlcElkcyA9IHRtcFxuICB0aGlzLm5ld0RlcElkcy5jbGVhcigpXG4gIHRtcCA9IHRoaXMuZGVwc1xuICB0aGlzLmRlcHMgPSB0aGlzLm5ld0RlcHNcbiAgdGhpcy5uZXdEZXBzID0gdG1wXG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwXG59XG5cbi8qKlxuICogU3Vic2NyaWJlciBpbnRlcmZhY2UuXG4gKiBXaWxsIGJlIGNhbGxlZCB3aGVuIGEgZGVwZW5kZW5jeSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hhbGxvd1xuICovXG5cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChzaGFsbG93KSB7XG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHRoaXMucnVuKClcbiAgfVxuICAvLyB9IGVsc2UgaWYgKHRoaXMuc3luYykge1xuICAvLyAgIHRoaXMucnVuKClcbiAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyBpZiBxdWV1ZWQsIG9ubHkgb3ZlcndyaXRlIHNoYWxsb3cgd2l0aCBub24tc2hhbGxvdyxcbiAgLy8gICAvLyBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLlxuICAvLyAgIHRoaXMuc2hhbGxvdyA9IHRoaXMucXVldWVkXG4gIC8vICAgICA/IHNoYWxsb3dcbiAgLy8gICAgICAgPyB0aGlzLnNoYWxsb3dcbiAgLy8gICAgICAgOiBmYWxzZVxuICAvLyAgICAgOiAhIXNoYWxsb3dcbiAgLy8gICB0aGlzLnF1ZXVlZCA9IHRydWVcbiAgLy8gICBwdXNoV2F0Y2hlcih0aGlzKVxuICAvLyB9XG59XG5cbi8qKlxuICogQmF0Y2hlciBqb2IgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIGJhdGNoZXIuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KClcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fFxuICAgICAgLy8gRGVlcCB3YXRjaGVycyBhbmQgd2F0Y2hlcnMgb24gT2JqZWN0L0FycmF5cyBzaG91bGQgZmlyZSBldmVuXG4gICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBpcyB0aGUgc2FtZSwgYmVjYXVzZSB0aGUgdmFsdWUgbWF5XG4gICAgICAvLyBoYXZlIG11dGF0ZWQ7IGJ1dCBvbmx5IGRvIHNvIGlmIHRoaXMgaXMgYVxuICAgICAgLy8gbm9uLXNoYWxsb3cgdXBkYXRlIChjYXVzZWQgYnkgYSB2bSBkaWdlc3QpLlxuICAgICAgKChpc09iamVjdCh2YWx1ZSkgfHwgdGhpcy5kZWVwKSAmJiAhdGhpcy5zaGFsbG93KVxuICAgICkge1xuICAgICAgLy8gc2V0IG5ldyB2YWx1ZVxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpXG4gICAgfVxuICAgIHRoaXMucXVldWVkID0gdGhpcy5zaGFsbG93ID0gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgd2F0Y2hlci5cbiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy5cbiAqL1xuXG5XYXRjaGVyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0KClcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlXG59XG5cbi8qKlxuICogRGVwZW5kIG9uIGFsbCBkZXBzIGNvbGxlY3RlZCBieSB0aGlzIHdhdGNoZXIuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gKCkge1xuICBsZXQgaSA9IHRoaXMuZGVwcy5sZW5ndGhcbiAgd2hpbGUgKGktLSkge1xuICAgIHRoaXMuZGVwc1tpXS5kZXBlbmQoKVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIHNlbGYgZnJvbSBhbGwgZGVwZW5kZW5jaWVzJyBzdWJjcmliZXIgbGlzdC5cbiAqL1xuXG5XYXRjaGVyLnByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkIG9yIGlzIHBlcmZvcm1pbmcgYSB2LWZvclxuICAgIC8vIHJlLXJlbmRlciAodGhlIHdhdGNoZXIgbGlzdCBpcyB0aGVuIGZpbHRlcmVkIGJ5IHYtZm9yKS5cbiAgICBpZiAoIXRoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWQgJiYgIXRoaXMudm0uX3ZGb3JSZW1vdmluZykge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKVxuICAgIH1cbiAgICBsZXQgaSA9IHRoaXMuZGVwcy5sZW5ndGhcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLmRlcHNbaV0ucmVtb3ZlU3ViKHRoaXMpXG4gICAgfVxuICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcbiAgICB0aGlzLnZtID0gdGhpcy5jYiA9IHRoaXMudmFsdWUgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBSZWNydXNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZFxuICogZ2V0dGVycywgc28gdGhhdCBldmVyeSBuZXN0ZWQgcHJvcGVydHkgaW5zaWRlIHRoZSBvYmplY3RcbiAqIGlzIGNvbGxlY3RlZCBhcyBhIFwiZGVlcFwiIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwYXJhbSB7U2V0fSBzZWVuXG4gKi9cblxuY29uc3Qgc2Vlbk9iamVjdHMgPSBjcmVhdGVOZXdTZXQoKSAvLyBuZXcgU2V0KClcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiB0cmF2ZXJzZSAodmFsLCBzZWVuKSB7XG4gIGxldCBpLCBrZXlzLCBpc0EsIGlzT1xuICBpZiAoIXNlZW4pIHtcbiAgICBzZWVuID0gc2Vlbk9iamVjdHNcbiAgICBzZWVuLmNsZWFyKClcbiAgfVxuICBpc0EgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgaXNPID0gaXNPYmplY3QodmFsKVxuICBpZiAoaXNBIHx8IGlzTykge1xuICAgIGlmICh2YWwuX19vYl9fKSB7XG4gICAgICBjb25zdCBkZXBJZCA9IHZhbC5fX29iX18uZGVwLmlkXG4gICAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vlbi5hZGQoZGVwSWQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0EpIHtcbiAgICAgIGkgPSB2YWwubGVuZ3RoXG4gICAgICB3aGlsZSAoaS0tKSB0cmF2ZXJzZSh2YWxbaV0sIHNlZW4pXG4gICAgfSBlbHNlIGlmIChpc08pIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpXG4gICAgICBpID0ga2V5cy5sZW5ndGhcbiAgICAgIHdoaWxlIChpLS0pIHRyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2VlbilcbiAgICB9XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0IHsgZGVmIH0gZnJvbSAnLi4vdXRpbC9pbmRleCdcblxuY29uc3QgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZVxuZXhwb3J0IGNvbnN0IGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90bylcblxuLyoqXG4gKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHNcbiAqL1xuXG47W1xuICAncHVzaCcsXG4gICdwb3AnLFxuICAnc2hpZnQnLFxuICAndW5zaGlmdCcsXG4gICdzcGxpY2UnLFxuICAnc29ydCcsXG4gICdyZXZlcnNlJ1xuXVxuLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAvLyBjYWNoZSBvcmlnaW5hbCBtZXRob2RcbiAgY29uc3Qgb3JpZ2luYWwgPSBhcnJheVByb3RvW21ldGhvZF1cbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICAvLyBhdm9pZCBsZWFraW5nIGFyZ3VtZW50czpcbiAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jbG9zdXJlLXdpdGgtYXJndW1lbnRzXG4gICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgY29uc3QgYXJncyA9IG5ldyBBcnJheShpKVxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncylcbiAgICBjb25zdCBvYiA9IHRoaXMuX19vYl9fXG4gICAgbGV0IGluc2VydGVkXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3B1c2gnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3NwbGljZSc6XG4gICAgICAgIGluc2VydGVkID0gYXJncy5zbGljZSgyKVxuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQpIG9iLm9ic2VydmVBcnJheShpbnNlcnRlZClcbiAgICAvLyBub3RpZnkgY2hhbmdlXG4gICAgb2IuZGVwLm5vdGlmeSgpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxufSlcblxuLyoqXG4gKiBTd2FwIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCB3aXRoIGEgbmV3IHZhbHVlXG4gKiBhbmQgZW1pdHMgY29ycmVzcG9uZGluZyBldmVudC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHsqfSAtIHJlcGxhY2VkIGVsZW1lbnRcbiAqL1xuXG5kZWYoXG4gIGFycmF5UHJvdG8sXG4gICckc2V0JyxcbiAgZnVuY3Rpb24gJHNldCAoaW5kZXgsIHZhbCkge1xuICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gXCJBcnJheS5wcm90b3R5cGUuJHNldFwiIGlzIG5vdCBhIHN0YW5kYXJkIEFQSSxgXG4gICAgICArIGAgaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24uYClcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gaW5kZXggKyAxXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwbGljZShpbmRleCwgMSwgdmFsKVswXVxuICB9XG4pXG5cbi8qKlxuICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBhdCBnaXZlbiBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKi9cblxuZGVmKFxuICBhcnJheVByb3RvLFxuICAnJHJlbW92ZScsXG4gIGZ1bmN0aW9uICRyZW1vdmUgKGluZGV4KSB7XG4gICAgY29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBcIkFycmF5LnByb3RvdHlwZS4kcmVtb3ZlXCIgaXMgbm90IGEgc3RhbmRhcmQgQVBJLGBcbiAgICAgICsgYCBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgdmVyc2lvbi5gKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdGhpcy5sZW5ndGgpIHJldHVyblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgIGluZGV4ID0gdGhpcy5pbmRleE9mKGluZGV4KVxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbilcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0IERlcCBmcm9tICcuL2RlcCdcbmltcG9ydCB7IGFycmF5TWV0aG9kcyB9IGZyb20gJy4vYXJyYXknXG5pbXBvcnQge1xuICBkZWYsXG4gIHJlbW92ZSxcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGhhc1Byb3RvLFxuICBoYXNPd24sXG4gIGlzUmVzZXJ2ZWRcbn0gZnJvbSAnLi4vdXRpbC9pbmRleCdcblxuY29uc3QgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKVxuXG4vKipcbiAqIE9ic2VydmVyIGNsYXNzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRhcmdldFxuICogb2JqZWN0J3MgcHJvcGVydHkga2V5cyBpbnRvIGdldHRlci9zZXR0ZXJzIHRoYXRcbiAqIGNvbGxlY3QgZGVwZW5kZW5jaWVzIGFuZCBkaXNwYXRjaGVzIHVwZGF0ZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IHZhbHVlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB0aGlzLmRlcCA9IG5ldyBEZXAoKVxuICBkZWYodmFsdWUsICdfX29iX18nLCB0aGlzKVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBhdWdtZW50ID0gaGFzUHJvdG9cbiAgICAgID8gcHJvdG9BdWdtZW50XG4gICAgICA6IGNvcHlBdWdtZW50XG4gICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpXG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy53YWxrKHZhbHVlKVxuICB9XG59XG5cbi8vIEluc3RhbmNlIG1ldGhvZHNcblxuLyoqXG4gKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG9cbiAqIGdldHRlci9zZXR0ZXJzLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlblxuICogdmFsdWUgdHlwZSBpcyBPYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbk9ic2VydmVyLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gKG9iaikge1xuICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgdGhpcy5jb252ZXJ0KGtleSwgb2JqW2tleV0pXG4gIH1cbn1cblxuLyoqXG4gKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtc1xuICovXG5cbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiAoaXRlbXMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvYnNlcnZlKGl0ZW1zW2ldKVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHByb3BlcnR5IGludG8gZ2V0dGVyL3NldHRlciBzbyB3ZSBjYW4gZW1pdFxuICogdGhlIGV2ZW50cyB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC9jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKi9cblxuT2JzZXJ2ZXIucHJvdG90eXBlLmNvbnZlcnQgPSBmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgZGVmaW5lUmVhY3RpdmUodGhpcy52YWx1ZSwga2V5LCB2YWwpXG59XG5cbi8qKlxuICogQWRkIGFuIG93bmVyIHZtLCBzbyB0aGF0IHdoZW4gJHNldC8kZGVsZXRlIG11dGF0aW9uc1xuICogaGFwcGVuIHdlIGNhbiBub3RpZnkgb3duZXIgdm1zIHRvIHByb3h5IHRoZSBrZXlzIGFuZFxuICogZGlnZXN0IHRoZSB3YXRjaGVycy4gVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBvYmplY3RcbiAqIGlzIG9ic2VydmVkIGFzIGFuIGluc3RhbmNlJ3Mgcm9vdCAkZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1Z1ZX0gdm1cbiAqL1xuXG5PYnNlcnZlci5wcm90b3R5cGUuYWRkVm0gPSBmdW5jdGlvbiAodm0pIHtcbiAgKHRoaXMudm1zIHx8ICh0aGlzLnZtcyA9IFtdKSkucHVzaCh2bSlcbn1cblxuLyoqXG4gKiBSZW1vdmUgYW4gb3duZXIgdm0uIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpc1xuICogc3dhcHBlZCBvdXQgYXMgYW4gaW5zdGFuY2UncyAkZGF0YSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtWdWV9IHZtXG4gKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbk9ic2VydmVyLnByb3RvdHlwZS5yZW1vdmVWbSA9IGZ1bmN0aW9uICh2bSkge1xuICByZW1vdmUodGhpcy52bXMsIHZtKVxufVxuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhbiB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGludGVyY2VwdGluZ1xuICogdGhlIHByb3RvdHlwZSBjaGFpbiB1c2luZyBfX3Byb3RvX19cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gdGFyZ2V0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKi9cblxuZnVuY3Rpb24gcHJvdG9BdWdtZW50ICh0YXJnZXQsIHNyYykge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuICB0YXJnZXQuX19wcm90b19fID0gc3JjXG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgZGVmaW5pbmdcbiAqIGhpZGRlbiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b1xuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICBkZWYodGFyZ2V0LCBrZXksIHNyY1trZXldKVxuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtWdWV9IFt2bV1cbiAqIEByZXR1cm4ge09ic2VydmVyfHVuZGVmaW5lZH1cbiAqIEBzdGF0aWNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIHZtKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IG9iXG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fXG4gIH0gZWxzZSBpZiAoXG4gICAgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzUGxhaW5PYmplY3QodmFsdWUpKSAmJlxuICAgIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpICYmXG4gICAgIXZhbHVlLl9pc1Z1ZVxuICApIHtcbiAgICBvYiA9IG5ldyBPYnNlcnZlcih2YWx1ZSlcbiAgfVxuICBpZiAob2IgJiYgdm0pIHtcbiAgICBvYi5hZGRWbSh2bSlcbiAgfVxuICByZXR1cm4gb2Jcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiBhbiBPYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWxcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUgKG9iaiwga2V5LCB2YWwpIHtcbiAgY29uc3QgZGVwID0gbmV3IERlcCgpXG5cbiAgY29uc3QgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KVxuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIGNvbnN0IGdldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LmdldFxuICBjb25zdCBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXRcblxuICBsZXQgY2hpbGRPYiA9IG9ic2VydmUodmFsKVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKERlcC50YXJnZXQpIHtcbiAgICAgICAgZGVwLmRlcGVuZCgpXG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBlLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgZSA9IHZhbHVlW2ldXG4gICAgICAgICAgICBlICYmIGUuX19vYl9fICYmIGUuX19vYl9fLmRlcC5kZXBlbmQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlU2V0dGVyIChuZXdWYWwpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gbmV3VmFsXG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gb2JzZXJ2ZShuZXdWYWwpXG4gICAgICBkZXAubm90aWZ5KClcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcHVibGljXG4gKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQgKG9iaiwga2V5LCB2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmouc3BsaWNlKGtleSwgMSwgdmFsKVxuICB9XG4gIGlmIChoYXNPd24ob2JqLCBrZXkpKSB7XG4gICAgb2JqW2tleV0gPSB2YWxcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob2JqLl9pc1Z1ZSkge1xuICAgIHNldChvYmouX2RhdGEsIGtleSwgdmFsKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9iID0gb2JqLl9fb2JfX1xuICBpZiAoIW9iKSB7XG4gICAgb2JqW2tleV0gPSB2YWxcbiAgICByZXR1cm5cbiAgfVxuICBvYi5jb252ZXJ0KGtleSwgdmFsKVxuICBvYi5kZXAubm90aWZ5KClcbiAgaWYgKG9iLnZtcykge1xuICAgIGxldCBpID0gb2Iudm1zLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHZtID0gb2Iudm1zW2ldXG4gICAgICBwcm94eSh2bSwga2V5KVxuICAgICAgLy8gdm0uJGZvcmNlVXBkYXRlKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gZGVsIChvYmosIGtleSkge1xuICBpZiAoIWhhc093bihvYmosIGtleSkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWxldGUgb2JqW2tleV1cbiAgY29uc3Qgb2IgPSBvYmouX19vYl9fXG5cbiAgaWYgKCFvYikge1xuICAgIGlmIChvYmouX2lzVnVlKSB7XG4gICAgICBkZWxldGUgb2JqLl9kYXRhW2tleV1cbiAgICAgIC8vIG9iai4kZm9yY2VVcGRhdGUoKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBvYi5kZXAubm90aWZ5KClcbiAgaWYgKG9iLnZtcykge1xuICAgIGxldCBpID0gb2Iudm1zLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHZtID0gb2Iudm1zW2ldXG4gICAgICB1bnByb3h5KHZtLCBrZXkpXG4gICAgICAvLyB2bS4kZm9yY2VVcGRhdGUoKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBLRVlfV09SRFMgPSBbJyRpbmRleCcsICckdmFsdWUnLCAnJGV2ZW50J11cbmV4cG9ydCBmdW5jdGlvbiBwcm94eSAodm0sIGtleSkge1xuICBpZiAoS0VZX1dPUkRTLmluZGV4T2Yoa2V5KSA+IC0xIHx8ICFpc1Jlc2VydmVkKGtleSkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0sIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gcHJveHlHZXR0ZXIgKCkge1xuICAgICAgICByZXR1cm4gdm0uX2RhdGFba2V5XVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gcHJveHlTZXR0ZXIgKHZhbCkge1xuICAgICAgICB2bS5fZGF0YVtrZXldID0gdmFsXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucHJveHkgKHZtLCBrZXkpIHtcbiAgaWYgKCFpc1Jlc2VydmVkKGtleSkpIHtcbiAgICBkZWxldGUgdm1ba2V5XVxuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5cbmltcG9ydCBXYXRjaGVyIGZyb20gJy4vd2F0Y2hlcidcbmltcG9ydCBEZXAgZnJvbSAnLi9kZXAnXG5pbXBvcnQge1xuICBvYnNlcnZlLFxuICBwcm94eSxcbiAgdW5wcm94eVxufSBmcm9tICcuL29ic2VydmVyJ1xuaW1wb3J0IHtcbiAgaXNQbGFpbk9iamVjdCxcbiAgYmluZFxufSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdFN0YXRlICh2bSkge1xuICB2bS5fd2F0Y2hlcnMgPSBbXVxuICBpbml0RGF0YSh2bSlcbiAgaW5pdENvbXB1dGVkKHZtKVxuICBpbml0TWV0aG9kcyh2bSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXREYXRhICh2bSkge1xuICBsZXQgZGF0YSA9IHZtLl9kYXRhXG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgZGF0YSA9IHt9XG4gIH1cbiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgcHJveHkodm0sIGtleXNbaV0pXG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdm0pXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBub29wICgpIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDb21wdXRlZCAodm0pIHtcbiAgY29uc3QgY29tcHV0ZWQgPSB2bS5fY29tcHV0ZWRcbiAgaWYgKGNvbXB1dGVkKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgICBjb25zdCB1c2VyRGVmID0gY29tcHV0ZWRba2V5XVxuICAgICAgY29uc3QgZGVmID0ge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkZWYuZ2V0ID0gbWFrZUNvbXB1dGVkR2V0dGVyKHVzZXJEZWYsIHZtKVxuICAgICAgICBkZWYuc2V0ID0gbm9vcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmLmdldCA9IHVzZXJEZWYuZ2V0XG4gICAgICAgICAgPyB1c2VyRGVmLmNhY2hlICE9PSBmYWxzZVxuICAgICAgICAgICAgPyBtYWtlQ29tcHV0ZWRHZXR0ZXIodXNlckRlZi5nZXQsIHZtKVxuICAgICAgICAgICAgOiBiaW5kKHVzZXJEZWYuZ2V0LCB2bSlcbiAgICAgICAgICA6IG5vb3BcbiAgICAgICAgZGVmLnNldCA9IHVzZXJEZWYuc2V0XG4gICAgICAgICAgPyBiaW5kKHVzZXJEZWYuc2V0LCB2bSlcbiAgICAgICAgICA6IG5vb3BcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bSwga2V5LCBkZWYpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VDb21wdXRlZEdldHRlciAoZ2V0dGVyLCBvd25lcikge1xuICBjb25zdCB3YXRjaGVyID0gbmV3IFdhdGNoZXIob3duZXIsIGdldHRlciwgbnVsbCwge1xuICAgIGxhenk6IHRydWVcbiAgfSlcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVkR2V0dGVyICgpIHtcbiAgICBpZiAod2F0Y2hlci5kaXJ0eSkge1xuICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpXG4gICAgfVxuICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICB3YXRjaGVyLmRlcGVuZCgpXG4gICAgfVxuICAgIHJldHVybiB3YXRjaGVyLnZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRNZXRob2RzICh2bSkge1xuICBjb25zdCBtZXRob2RzID0gdm0uX21ldGhvZHNcbiAgaWYgKG1ldGhvZHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gbWV0aG9kcykge1xuICAgICAgdm1ba2V5XSA9IG1ldGhvZHNba2V5XVxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBAdG9kbzogSXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYnkgbmF0aXZlIGZyb20gYHJlZ2lzdGVyQ29tcG9uZW50cygpYC5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYXRpdmVDb21wb25lbnRNYXA6IHtcbiAgICB0ZXh0OiB0cnVlLFxuICAgIGltYWdlOiB0cnVlLFxuICAgIGNvbnRhaW5lcjogdHJ1ZSxcbiAgICBzbGlkZXI6IHtcbiAgICAgIHR5cGU6ICdzbGlkZXInLFxuICAgICAgYXBwZW5kOiAndHJlZSdcbiAgICB9LFxuICAgIGNlbGw6IHtcbiAgICAgIHR5cGU6ICdjZWxsJyxcbiAgICAgIGFwcGVuZDogJ3RyZWUnXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogRGlyZWN0aXZlIFBhcnNlclxuICovXG5cbmltcG9ydCB7IGJpbmQsIHR5cG9mIH0gZnJvbSAnLi4vdXRpbC9pbmRleCdcbmltcG9ydCBXYXRjaGVyIGZyb20gJy4uL2NvcmUvd2F0Y2hlcidcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuXG5jb25zdCB7IG5hdGl2ZUNvbXBvbmVudE1hcCB9ID0gY29uZmlnXG5cbmNvbnN0IFNFVFRFUlMgPSB7XG4gIGF0dHI6ICdzZXRBdHRyJyxcbiAgc3R5bGU6ICdzZXRTdHlsZScsXG4gIGV2ZW50OiAnYWRkRXZlbnQnXG59XG5cbi8qKlxuICogYXBwbHkgdGhlIG5hdGl2ZSBjb21wb25lbnQncyBvcHRpb25zKHNwZWNpZmllZCBieSB0ZW1wbGF0ZS50eXBlKVxuICogdG8gdGhlIHRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU5haXR2ZUNvbXBvbmVudE9wdGlvbnMgKHRlbXBsYXRlKSB7XG4gIGNvbnN0IHsgdHlwZSB9ID0gdGVtcGxhdGVcbiAgY29uc3Qgb3B0aW9ucyA9IG5hdGl2ZUNvbXBvbmVudE1hcFt0eXBlXVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAodGVtcGxhdGVba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRlbXBsYXRlW2tleV0gPSBvcHRpb25zW2tleV1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cG9mKHRlbXBsYXRlW2tleV0pID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBvZihvcHRpb25zW2tleV0pID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IHN1YmtleSBpbiBvcHRpb25zW2tleV0pIHtcbiAgICAgICAgICBpZiAodGVtcGxhdGVba2V5XVtzdWJrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlW2tleV1bc3Via2V5XSA9IG9wdGlvbnNba2V5XVtzdWJrZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYmluZCBhbGwgaWQsIGF0dHIsIGNsYXNzbmFtZXMsIHN0eWxlLCBldmVudHMgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEVsZW1lbnQgKHZtLCBlbCwgdGVtcGxhdGUpIHtcbiAgc2V0SWQodm0sIGVsLCB0ZW1wbGF0ZS5pZCwgdm0pXG4gIHNldEF0dHIodm0sIGVsLCB0ZW1wbGF0ZS5hdHRyKVxuICBzZXRDbGFzcyh2bSwgZWwsIHRlbXBsYXRlLmNsYXNzTGlzdClcbiAgc2V0U3R5bGUodm0sIGVsLCB0ZW1wbGF0ZS5zdHlsZSlcbiAgYmluZEV2ZW50cyh2bSwgZWwsIHRlbXBsYXRlLmV2ZW50cylcbn1cblxuLyoqXG4gKiBiaW5kIGFsbCBwcm9wcyB0byBzdWIgdm0gYW5kIGJpbmQgYWxsIHN0eWxlLCBldmVudHMgdG8gdGhlIHJvb3QgZWxlbWVudFxuICogb2YgdGhlIHN1YiB2bSBpZiBpdCBkb2Vzbid0IGhhdmUgYSByZXBsYWNlZCBtdWx0aS1ub2RlIGZyYWdtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kU3ViVm0gKHZtLCBzdWJWbSwgdGVtcGxhdGUsIHJlcGVhdEl0ZW0pIHtcbiAgc3ViVm0gPSBzdWJWbSB8fCB7fVxuICB0ZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IHt9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHN1YlZtLl9vcHRpb25zIHx8IHt9XG5cbiAgLy8gYmluZCBwcm9wc1xuICBsZXQgcHJvcHMgPSBvcHRpb25zLnByb3BzXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgcHJvcHMgPSBwcm9wcy5yZWR1Y2UoKHJlc3VsdCwgdmFsdWUpID0+IHtcbiAgICAgIHJlc3VsdFt2YWx1ZV0gPSB0cnVlXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSwge30pXG4gIH1cblxuICBtZXJnZVByb3BzKHJlcGVhdEl0ZW0sIHByb3BzLCB2bSwgc3ViVm0pXG4gIG1lcmdlUHJvcHModGVtcGxhdGUuYXR0ciwgcHJvcHMsIHZtLCBzdWJWbSlcbn1cblxuLyoqXG4gKiBtZXJnZSBjbGFzcyBhbmQgc3R5bGVzIGZyb20gdm0gdG8gc3ViIHZtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFN1YlZtQWZ0ZXJJbml0aWFsaXplZCAodm0sIHN1YlZtLCB0ZW1wbGF0ZSwgdGFyZ2V0ID0ge30pIHtcbiAgbWVyZ2VDbGFzc1N0eWxlKHRlbXBsYXRlLmNsYXNzTGlzdCwgdm0sIHN1YlZtKVxuICBtZXJnZVN0eWxlKHRlbXBsYXRlLnN0eWxlLCB2bSwgc3ViVm0pXG5cbiAgLy8gYmluZCBzdWJWbSB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgaWYgKHRhcmdldC5jaGlsZHJlbikge1xuICAgIHRhcmdldC5jaGlsZHJlblt0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoIC0gMV0uX3ZtID0gc3ViVm1cbiAgfVxuICBlbHNlIHtcbiAgICB0YXJnZXQuX3ZtID0gc3ViVm1cbiAgfVxufVxuXG4vKipcbiAqIEJpbmQgcHJvcHMgZnJvbSB2bSB0byBzdWIgdm0gYW5kIHdhdGNoIHRoZWlyIHVwZGF0ZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRhcmdldCwgcHJvcHMsIHZtLCBzdWJWbSkge1xuICBpZiAoIXRhcmdldCkge1xuICAgIHJldHVyblxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgIGlmICghcHJvcHMgfHwgcHJvcHNba2V5XSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXRba2V5XVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHdhdGNoKHZtLCB2YWx1ZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICBzdWJWbVtrZXldID0gdlxuICAgICAgICB9KVxuICAgICAgICBzdWJWbVtrZXldID0gcmV0dXJuVmFsdWVcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdWJWbVtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCaW5kIHN0eWxlIGZyb20gdm0gdG8gc3ViIHZtIGFuZCB3YXRjaCB0aGVpciB1cGRhdGVzLlxuICovXG5mdW5jdGlvbiBtZXJnZVN0eWxlICh0YXJnZXQsIHZtLCBzdWJWbSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtrZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB3YXRjaCh2bSwgdmFsdWUsIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIGlmIChzdWJWbS5fcm9vdEVsKSB7XG4gICAgICAgICAgc3ViVm0uX3Jvb3RFbC5zZXRTdHlsZShrZXksIHYpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBzdWJWbS5fcm9vdEVsLnNldFN0eWxlKGtleSwgcmV0dXJuVmFsdWUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHN1YlZtLl9yb290RWwpIHtcbiAgICAgICAgc3ViVm0uX3Jvb3RFbC5zZXRTdHlsZShrZXksIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJpbmQgY2xhc3MgJiBzdHlsZSBmcm9tIHZtIHRvIHN1YiB2bSBhbmQgd2F0Y2ggdGhlaXIgdXBkYXRlcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VDbGFzc1N0eWxlICh0YXJnZXQsIHZtLCBzdWJWbSkge1xuICBjb25zdCBjc3MgPSB2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5zdHlsZSB8fCB7fVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIXN1YlZtLl9yb290RWwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9ICdAb3JpZ2luYWxSb290RWwnXG4gIGNzc1tjbGFzc05hbWVdID0gc3ViVm0uX3Jvb3RFbC5jbGFzc1N0eWxlXG5cbiAgZnVuY3Rpb24gYWRkQ2xhc3NOYW1lIChsaXN0LCBuYW1lKSB7XG4gICAgaWYgKHR5cG9mKGxpc3QpID09PSAnYXJyYXknKSB7XG4gICAgICBsaXN0LnVuc2hpZnQobmFtZSlcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gd2F0Y2godm0sIHRhcmdldCwgdiA9PiB7XG4gICAgICBhZGRDbGFzc05hbWUodiwgY2xhc3NOYW1lKVxuICAgICAgc2V0Q2xhc3NTdHlsZShzdWJWbS5fcm9vdEVsLCBjc3MsIHYpXG4gICAgfSlcbiAgICBhZGRDbGFzc05hbWUodmFsdWUsIGNsYXNzTmFtZSlcbiAgICBzZXRDbGFzc1N0eWxlKHN1YlZtLl9yb290RWwsIGNzcywgdmFsdWUpXG4gIH1cbiAgZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICBhZGRDbGFzc05hbWUodGFyZ2V0LCBjbGFzc05hbWUpXG4gICAgc2V0Q2xhc3NTdHlsZShzdWJWbS5fcm9vdEVsLCBjc3MsIHRhcmdldClcbiAgfVxufVxuXG4vKipcbiAqIGJpbmQgaWQgdG8gYW4gZWxlbWVudFxuICogZWFjaCBpZCBpcyB1bmlxdWUgaW4gYSB3aG9sZSB2bVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SWQgKHZtLCBlbCwgaWQsIHRhcmdldCkge1xuICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobWFwLCB7XG4gICAgdm06IHtcbiAgICAgIHZhbHVlOiB0YXJnZXQsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgfSxcbiAgICBlbDoge1xuICAgICAgZ2V0OiAoKSA9PiBlbCB8fCB0YXJnZXQuX3Jvb3RFbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHR5cGVvZiBpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBpZFxuICAgIGlkID0gaGFuZGxlci5jYWxsKHZtKVxuICAgIGlmIChpZCB8fCBpZCA9PT0gMCkge1xuICAgICAgdm0uX2lkc1tpZF0gPSBtYXBcbiAgICB9XG4gICAgd2F0Y2godm0sIGhhbmRsZXIsIChuZXdJZCkgPT4ge1xuICAgICAgaWYgKG5ld0lkKSB7XG4gICAgICAgIHZtLl9pZHNbbmV3SWRdID0gbWFwXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBlbHNlIGlmIChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgdm0uX2lkc1tpZF0gPSBtYXBcbiAgfVxufVxuXG4vKipcbiAqIGJpbmQgYXR0ciB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldEF0dHIgKHZtLCBlbCwgYXR0cikge1xuICBiaW5kRGlyKHZtLCBlbCwgJ2F0dHInLCBhdHRyKVxufVxuXG5mdW5jdGlvbiBzZXRDbGFzc1N0eWxlIChlbCwgY3NzLCBjbGFzc0xpc3QpIHtcbiAgaWYgKHR5cGVvZiBjbGFzc0xpc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgY2xhc3NMaXN0ID0gY2xhc3NMaXN0LnNwbGl0KC9cXHMrLylcbiAgfVxuICBjbGFzc0xpc3QuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgIGNsYXNzTGlzdC5zcGxpY2UoaSwgMSwgLi4ubmFtZS5zcGxpdCgvXFxzKy8pKVxuICB9KVxuICBjb25zdCBjbGFzc1N0eWxlID0ge31cbiAgY29uc3QgbGVuZ3RoID0gY2xhc3NMaXN0Lmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdHlsZSA9IGNzc1tjbGFzc0xpc3RbaV1dXG4gICAgaWYgKHN0eWxlKSB7XG4gICAgICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNsYXNzU3R5bGVba2V5XSA9IHN0eWxlW2tleV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGVsLnNldENsYXNzU3R5bGUoY2xhc3NTdHlsZSlcbn1cblxuLyoqXG4gKiBiaW5kIGNsYXNzbmFtZXMgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRDbGFzcyAodm0sIGVsLCBjbGFzc0xpc3QpIHtcbiAgaWYgKHR5cGVvZiBjbGFzc0xpc3QgIT09ICdmdW5jdGlvbicgJiYgIUFycmF5LmlzQXJyYXkoY2xhc3NMaXN0KSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGNsYXNzTGlzdCkgJiYgIWNsYXNzTGlzdC5sZW5ndGgpIHtcbiAgICBlbC5zZXRDbGFzc1N0eWxlKHt9KVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3R5bGUgPSB2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5zdHlsZSB8fCB7fVxuICBpZiAodHlwZW9mIGNsYXNzTGlzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gd2F0Y2godm0sIGNsYXNzTGlzdCwgdiA9PiB7XG4gICAgICBzZXRDbGFzc1N0eWxlKGVsLCBzdHlsZSwgdilcbiAgICB9KVxuICAgIHNldENsYXNzU3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSlcbiAgfVxuICBlbHNlIHtcbiAgICBzZXRDbGFzc1N0eWxlKGVsLCBzdHlsZSwgY2xhc3NMaXN0KVxuICB9XG59XG5cbi8qKlxuICogYmluZCBzdHlsZSB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldFN0eWxlICh2bSwgZWwsIHN0eWxlKSB7XG4gIGJpbmREaXIodm0sIGVsLCAnc3R5bGUnLCBzdHlsZSlcbn1cblxuLyoqXG4gKiBhZGQgYW4gZXZlbnQgdHlwZSBhbmQgaGFuZGxlciB0byBhbiBlbGVtZW50IGFuZCBnZW5lcmF0ZSBhIGRvbSB1cGRhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnQgKHZtLCBlbCwgdHlwZSwgaGFuZGxlcikge1xuICBlbC5hZGRFdmVudCh0eXBlLCBiaW5kKGhhbmRsZXIsIHZtKSlcbn1cblxuLyoqXG4gKiBhZGQgYWxsIGV2ZW50cyBvZiBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGJpbmRFdmVudHMgKHZtLCBlbCwgZXZlbnRzKSB7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cylcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIGxldCBoYW5kbGVyID0gZXZlbnRzW2tleV1cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBoYW5kbGVyID0gdm1baGFuZGxlcl1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gVGhlIGV2ZW50IGhhbmRsZXIgXCIke2hhbmRsZXJ9XCIgaXMgbm90IGRlZmluZWQuYClcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0RXZlbnQodm0sIGVsLCBrZXksIGhhbmRsZXIpXG4gIH1cbn1cblxuLyoqXG4gKiBzZXQgYSBzZXJpZXMgb2YgbWVtYmVycyBhcyBhIGtpbmQgb2YgYW4gZWxlbWVudFxuICogZm9yIGV4YW1wbGU6IHN0eWxlLCBhdHRyLCAuLi5cbiAqIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHRoZW4gYmluZCB0aGUgZGF0YSBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGJpbmREaXIgKHZtLCBlbCwgbmFtZSwgZGF0YSkge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYmluZEtleSh2bSwgZWwsIG5hbWUsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxbU0VUVEVSU1tuYW1lXV0oa2V5LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBiaW5kIGRhdGEgY2hhbmdlcyB0byBhIGNlcnRhaW4ga2V5IHRvIGEgbmFtZSBzZXJpZXMgaW4gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBiaW5kS2V5ICh2bSwgZWwsIG5hbWUsIGtleSwgY2FsYykge1xuICBjb25zdCBtZXRob2ROYW1lID0gU0VUVEVSU1tuYW1lXVxuICAvLyB3YXRjaCB0aGUgY2FsYywgYW5kIHJldHVybnMgYSB2YWx1ZSBieSBjYWxjLmNhbGwoKVxuICBjb25zdCB2YWx1ZSA9IHdhdGNoKHZtLCBjYWxjLCAodmFsdWUpID0+IHtcbiAgICBmdW5jdGlvbiBoYW5kbGVyICgpIHtcbiAgICAgIGVsW21ldGhvZE5hbWVdKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IGRpZmZlciA9IHZtICYmIHZtLl9hcHAgJiYgdm0uX2FwcC5kaWZmZXJcbiAgICBpZiAoZGlmZmVyKSB7XG4gICAgICBkaWZmZXIuYXBwZW5kKCdlbGVtZW50JywgZWwuZGVwdGgsIGVsLnJlZiwgaGFuZGxlcilcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoYW5kbGVyKClcbiAgICB9XG4gIH0pXG5cbiAgZWxbbWV0aG9kTmFtZV0oa2V5LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiB3YXRjaCBhIGNhbGMgZnVuY3Rpb24gYW5kIGNhbGxiYWNrIGlmIHRoZSBjYWxjIHZhbHVlIGNoYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoICh2bSwgY2FsYywgY2FsbGJhY2spIHtcbiAgaWYgKHZtLl9zdGF0aWMpIHtcbiAgICByZXR1cm4gY2FsYy5jYWxsKHZtLCB2bSlcbiAgfVxuICBjb25zdCB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGNhbGMsIGZ1bmN0aW9uICh2YWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB2YWx1ZSA9PT0gb2xkVmFsdWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYWxsYmFjayh2YWx1ZSlcbiAgfSlcblxuICByZXR1cm4gd2F0Y2hlci52YWx1ZVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgRG9jdW1lbnQgJiBFbGVtZW50IEhlbHBlcnMuXG4gKlxuICogcmVxdWlyZWQ6XG4gKiBEb2N1bWVudCM6IGNyZWF0ZUVsZW1lbnQsIGNyZWF0ZUNvbW1lbnQsIGdldFJlZlxuICogRWxlbWVudCM6IGFwcGVuZENoaWxkLCBpbnNlcnRCZWZvcmUsIHJlbW92ZUNoaWxkLCBuZXh0U2libGluZ1xuICovXG5cbi8qKlxuICogQ3JlYXRlIGEgYm9keSBieSB0eXBlXG4gKiBVc2luZyB0aGlzLl9hcHAuZG9jXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCb2R5ICh2bSwgdHlwZSkge1xuICBjb25zdCBkb2MgPSB2bS5fYXBwLmRvY1xuICByZXR1cm4gZG9jLmNyZWF0ZUJvZHkodHlwZSlcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZWxlbWVudCBieSB0eXBlXG4gKiBVc2luZyB0aGlzLl9hcHAuZG9jXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICh2bSwgdHlwZSkge1xuICBjb25zdCBkb2MgPSB2bS5fYXBwLmRvY1xuICByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSlcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIGZyYWcgYmxvY2sgZm9yIGFuIGVsZW1lbnQuXG4gKiBUaGUgZnJhZyBibG9jayBoYXMgYSBzdGFydGVyLCBlbmRlciBhbmQgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmxvY2sgKHZtLCBlbGVtZW50KSB7XG4gIGNvbnN0IHN0YXJ0ID0gY3JlYXRlQmxvY2tTdGFydCh2bSlcbiAgY29uc3QgZW5kID0gY3JlYXRlQmxvY2tFbmQodm0pXG4gIGNvbnN0IGJsb2NrSWQgPSBsYXN0ZXN0QmxvY2tJZCsrXG4gIGlmIChlbGVtZW50LmVsZW1lbnQpIHtcbiAgICBsZXQgdXBkYXRlTWFyayA9IGVsZW1lbnQudXBkYXRlTWFya1xuICAgIGlmICh1cGRhdGVNYXJrKSB7XG4gICAgICBpZiAodXBkYXRlTWFyay5lbGVtZW50KSB7XG4gICAgICAgIHVwZGF0ZU1hcmsgPSB1cGRhdGVNYXJrLmVuZFxuICAgICAgfVxuICAgICAgZWxlbWVudC5lbGVtZW50Lmluc2VydEFmdGVyKGVuZCwgdXBkYXRlTWFyaylcbiAgICAgIGVsZW1lbnQuZWxlbWVudC5pbnNlcnRBZnRlcihzdGFydCwgdXBkYXRlTWFyaylcbiAgICAgIGVsZW1lbnQudXBkYXRlTWFyayA9IGVuZFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGVsZW1lbnQuZWxlbWVudC5pbnNlcnRCZWZvcmUoc3RhcnQsIGVsZW1lbnQuZW5kKVxuICAgICAgZWxlbWVudC5lbGVtZW50Lmluc2VydEJlZm9yZShlbmQsIGVsZW1lbnQuZW5kKVxuICAgIH1cbiAgICBlbGVtZW50ID0gZWxlbWVudC5lbGVtZW50XG4gIH1cbiAgZWxzZSB7XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChzdGFydClcbiAgICBlbGVtZW50LmFwcGVuZENoaWxkKGVuZClcbiAgfVxuICByZXR1cm4geyBzdGFydCwgZW5kLCBlbGVtZW50LCBibG9ja0lkIH1cbn1cblxubGV0IGxhc3Rlc3RCbG9ja0lkID0gMVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgYmxvY2sgc3RhcnRlci5cbiAqIFVzaW5nIHRoaXMuX2FwcC5kb2NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmxvY2tTdGFydCAodm0pIHtcbiAgY29uc3QgZG9jID0gdm0uX2FwcC5kb2NcbiAgY29uc3QgYW5jaG9yID0gZG9jLmNyZWF0ZUNvbW1lbnQoJ3N0YXJ0JylcbiAgcmV0dXJuIGFuY2hvclxufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgYmxvY2sgZW5kZXIuXG4gKiBVc2luZyB0aGlzLl9hcHAuZG9jXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrRW5kICh2bSkge1xuICBjb25zdCBkb2MgPSB2bS5fYXBwLmRvY1xuICBjb25zdCBhbmNob3IgPSBkb2MuY3JlYXRlQ29tbWVudCgnZW5kJylcbiAgcmV0dXJuIGFuY2hvclxufVxuXG4vKipcbiAqIEF0dGFjaCB0YXJnZXQgdG8gYSBjZXJ0YWluIGRlc3QgdXNpbmcgYXBwZW5kQ2hpbGQgYnkgZGVmYXVsdC5cbiAqIElmIHRoZSBkZXN0IGlzIGEgZnJhZyBibG9jayB0aGVuIGluc2VydCBiZWZvcmUgdGhlIGVuZGVyLlxuICogSWYgdGhlIHRhcmdldCBpcyBhIGZyYWcgYmxvY2sgdGhlbiBhdHRhY2ggdGhlIHN0YXJ0ZXIgYW5kIGVuZGVyIGluIG9yZGVyLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGRlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFRhcmdldCAodm0sIHRhcmdldCwgZGVzdCkge1xuICBpZiAoZGVzdC5lbGVtZW50KSB7XG4gICAgY29uc3QgYmVmb3JlID0gZGVzdC5lbmRcbiAgICBjb25zdCBhZnRlciA9IGRlc3QudXBkYXRlTWFya1xuICAgIC8vIHB1c2ggbmV3IHRhcmdldCBmb3Igd2F0Y2ggbGlzdCB1cGRhdGUgbGF0ZXJcbiAgICBpZiAoZGVzdC5jaGlsZHJlbikge1xuICAgICAgZGVzdC5jaGlsZHJlbi5wdXNoKHRhcmdldClcbiAgICB9XG4gICAgLy8gZm9yIGNoZWNrIHJlcGVhdCBjYXNlXG4gICAgaWYgKGFmdGVyKSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBtb3ZlVGFyZ2V0KHZtLCB0YXJnZXQsIGFmdGVyKVxuICAgICAgZGVzdC51cGRhdGVNYXJrID0gdGFyZ2V0LmVsZW1lbnQgPyB0YXJnZXQuZW5kIDogdGFyZ2V0XG4gICAgICByZXR1cm4gc2lnbmFsXG4gICAgfVxuICAgIGVsc2UgaWYgKHRhcmdldC5lbGVtZW50KSB7XG4gICAgICBkZXN0LmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRhcmdldC5zdGFydCwgYmVmb3JlKVxuICAgICAgZGVzdC5lbGVtZW50Lmluc2VydEJlZm9yZSh0YXJnZXQuZW5kLCBiZWZvcmUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGRlc3QuZWxlbWVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBiZWZvcmUpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGlmICh0YXJnZXQuZWxlbWVudCkge1xuICAgICAgZGVzdC5hcHBlbmRDaGlsZCh0YXJnZXQuc3RhcnQpXG4gICAgICBkZXN0LmFwcGVuZENoaWxkKHRhcmdldC5lbmQpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGRlc3QuYXBwZW5kQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE1vdmUgdGFyZ2V0IGJlZm9yZSBhIGNlcnRhaW4gZWxlbWVudC4gVGhlIHRhcmdldCBtYXliZSBibG9jayBvciBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGJlZm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZVRhcmdldCAodm0sIHRhcmdldCwgYWZ0ZXIpIHtcbiAgaWYgKHRhcmdldC5lbGVtZW50KSB7XG4gICAgcmV0dXJuIG1vdmVCbG9jayh0YXJnZXQsIGFmdGVyKVxuICB9XG4gIHJldHVybiBtb3ZlRWxlbWVudCh0YXJnZXQsIGFmdGVyKVxufVxuXG4vKipcbiAqIE1vdmUgZWxlbWVudCBiZWZvcmUgYSBjZXJ0YWluIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBlbGVtZW50XG4gKiBAcGFyYW0gIHtvYmplY3R9IGJlZm9yZVxuICovXG5mdW5jdGlvbiBtb3ZlRWxlbWVudCAoZWxlbWVudCwgYWZ0ZXIpIHtcbiAgY29uc3QgcGFyZW50ID0gYWZ0ZXIucGFyZW50Tm9kZVxuICBpZiAocGFyZW50KSB7XG4gICAgcmV0dXJuIHBhcmVudC5pbnNlcnRBZnRlcihlbGVtZW50LCBhZnRlcilcbiAgfVxufVxuXG4vKipcbiAqIE1vdmUgYWxsIGVsZW1lbnRzIG9mIHRoZSBibG9jayBiZWZvcmUgYSBjZXJ0YWluIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBmcmFnQmxvY2tcbiAqIEBwYXJhbSAge29iamVjdH0gYmVmb3JlXG4gKi9cbmZ1bmN0aW9uIG1vdmVCbG9jayAoZnJhZ0Jsb2NrLCBhZnRlcikge1xuICBjb25zdCBwYXJlbnQgPSBhZnRlci5wYXJlbnROb2RlXG5cbiAgaWYgKHBhcmVudCkge1xuICAgIGxldCBlbCA9IGZyYWdCbG9jay5zdGFydFxuICAgIGxldCBzaWduYWxcbiAgICBjb25zdCBncm91cCA9IFtlbF1cblxuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gZnJhZ0Jsb2NrLmVuZCkge1xuICAgICAgZWwgPSBlbC5uZXh0U2libGluZ1xuICAgICAgZ3JvdXAucHVzaChlbClcbiAgICB9XG5cbiAgICBsZXQgdGVtcCA9IGFmdGVyXG4gICAgZ3JvdXAuZXZlcnkoKGVsKSA9PiB7XG4gICAgICBzaWduYWwgPSBwYXJlbnQuaW5zZXJ0QWZ0ZXIoZWwsIHRlbXApXG4gICAgICB0ZW1wID0gZWxcbiAgICAgIHJldHVybiBzaWduYWwgIT09IC0xXG4gICAgfSlcblxuICAgIHJldHVybiBzaWduYWxcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSB0YXJnZXQgZnJvbSBET00gdHJlZS5cbiAqIElmIHRoZSB0YXJnZXQgaXMgYSBmcmFnIGJsb2NrIHRoZW4gY2FsbCBfcmVtb3ZlQmxvY2tcbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IHRhcmdldFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGFyZ2V0ICh2bSwgdGFyZ2V0LCBwcmVzZXJ2ZUJsb2NrID0gZmFsc2UpIHtcbiAgaWYgKHRhcmdldC5lbGVtZW50KSB7XG4gICAgcmVtb3ZlQmxvY2sodGFyZ2V0LCBwcmVzZXJ2ZUJsb2NrKVxuICB9XG4gIGVsc2Uge1xuICAgIHJlbW92ZUVsZW1lbnQodGFyZ2V0KVxuICB9XG4gIGlmICh0YXJnZXQuX3ZtKSB7XG4gICAgdGFyZ2V0Ll92bS4kZW1pdCgnaG9vazpkZXN0cm95ZWQnKVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgY2VydGFpbiBlbGVtZW50LlxuICogVXNpbmcgdGhpcy5fYXBwLmRvY1xuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQgKHRhcmdldCkge1xuICBjb25zdCBwYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZVxuXG4gIGlmIChwYXJlbnQpIHtcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZnJhZyBibG9jay5cbiAqIFRoZSBzZWNvbmQgcGFyYW0gZGVjaWRlcyB3aGV0aGVyIHRoZSBibG9jayBzZWxmIHNob3VsZCBiZSByZW1vdmVkIHRvby5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBmcmFnQmxvY2tcbiAqIEBwYXJhbSAge0Jvb2xlYW59IHByZXNlcnZlQmxvY2s9ZmFsc2VcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQmxvY2sgKGZyYWdCbG9jaywgcHJlc2VydmVCbG9jayA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGxldCBlbCA9IGZyYWdCbG9jay5zdGFydC5uZXh0U2libGluZ1xuXG4gIHdoaWxlIChlbCAmJiBlbCAhPT0gZnJhZ0Jsb2NrLmVuZCkge1xuICAgIHJlc3VsdC5wdXNoKGVsKVxuICAgIGVsID0gZWwubmV4dFNpYmxpbmdcbiAgfVxuXG4gIGlmICghcHJlc2VydmVCbG9jaykge1xuICAgIHJlbW92ZUVsZW1lbnQoZnJhZ0Jsb2NrLnN0YXJ0KVxuICB9XG4gIHJlc3VsdC5mb3JFYWNoKChlbCkgPT4ge1xuICAgIHJlbW92ZUVsZW1lbnQoZWwpXG4gIH0pXG4gIGlmICghcHJlc2VydmVCbG9jaykge1xuICAgIHJlbW92ZUVsZW1lbnQoZnJhZ0Jsb2NrLmVuZClcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFZpZXdNb2RlbCB0ZW1wbGF0ZSBwYXJzZXIgJiBkYXRhLWJpbmRpbmcgcHJvY2Vzc1xuICovXG5cbmltcG9ydCB7XG4gIGV4dGVuZCxcbiAgaXNPYmplY3QsXG4gIGJpbmRcbn0gZnJvbSAnLi4vdXRpbC9pbmRleCdcbmltcG9ydCB7XG4gIGluaXREYXRhLFxuICBpbml0Q29tcHV0ZWRcbn0gZnJvbSAnLi4vY29yZS9zdGF0ZSdcbmltcG9ydCB7XG4gIGJpbmRFbGVtZW50LFxuICBzZXRJZCxcbiAgYmluZFN1YlZtLFxuICBiaW5kU3ViVm1BZnRlckluaXRpYWxpemVkLFxuICBhcHBseU5haXR2ZUNvbXBvbmVudE9wdGlvbnMsXG4gIHdhdGNoXG59IGZyb20gJy4vZGlyZWN0aXZlJ1xuaW1wb3J0IHtcbiAgY3JlYXRlQmxvY2ssXG4gIGNyZWF0ZUJvZHksXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGF0dGFjaFRhcmdldCxcbiAgbW92ZVRhcmdldCxcbiAgcmVtb3ZlVGFyZ2V0XG59IGZyb20gJy4vZG9tLWhlbHBlcidcblxuLyoqXG4gKiBidWlsZCgpXG4gKiAgIGNvbXBpbGUodGVtcGxhdGUsIHBhcmVudE5vZGUpXG4gKiAgICAgaWYgKHR5cGUgaXMgY29udGVudCkgY3JlYXRlIGNvbnRlbnROb2RlXG4gKiAgICAgZWxzZSBpZiAoZGlycyBoYXZlIHYtZm9yKSBmb3JlYWNoIC0+IGNyZWF0ZSBjb250ZXh0XG4gKiAgICAgICAtPiBjb21waWxlKHRlbXBsYXRlV2l0aG91dEZvciwgcGFyZW50Tm9kZSk6IGRpZmYobGlzdCkgb25jaGFuZ2VcbiAqICAgICBlbHNlIGlmIChkaXJzIGhhdmUgdi1pZikgYXNzZXJ0XG4gKiAgICAgICAtPiBjb21waWxlKHRlbXBsYXRlV2l0aG91dElmLCBwYXJlbnROb2RlKTogdG9nZ2xlKHNob3duKSBvbmNoYW5nZVxuICogICAgIGVsc2UgaWYgKHR5cGUgaXMgZHluYW1pYylcbiAqICAgICAgIC0+IGNvbXBpbGUodGVtcGxhdGVXaXRob3V0RHluYW1pY1R5cGUsIHBhcmVudE5vZGUpOiB3YXRjaCh0eXBlKSBvbmNoYW5nZVxuICogICAgIGVsc2UgaWYgKHR5cGUgaXMgY3VzdG9tKVxuICogICAgICAgYWRkQ2hpbGRWbSh2bSwgcGFyZW50Vm0pXG4gKiAgICAgICBidWlsZChleHRlcm5hbERpcnMpXG4gKiAgICAgICBmb3JlYWNoIGNoaWxkTm9kZXMgLT4gY29tcGlsZShjaGlsZE5vZGUsIHRlbXBsYXRlKVxuICogICAgIGVsc2UgaWYgKHR5cGUgaXMgbmF0aXZlKVxuICogICAgICAgc2V0KGRpcnMpOiB1cGRhdGUoaWQvYXR0ci9zdHlsZS9jbGFzcykgb25jaGFuZ2VcbiAqICAgICAgIGFwcGVuZCh0ZW1wbGF0ZSwgcGFyZW50Tm9kZSlcbiAqICAgICAgIGZvcmVhY2ggY2hpbGROb2RlcyAtPiBjb21waWxlKGNoaWxkTm9kZSwgdGVtcGxhdGUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZCAodm0pIHtcbiAgY29uc3Qgb3B0ID0gdm0uX29wdGlvbnMgfHwge31cbiAgY29uc3QgdGVtcGxhdGUgPSBvcHQudGVtcGxhdGUgfHwge31cblxuICBpZiAob3B0LnJlcGxhY2UpIHtcbiAgICBpZiAodGVtcGxhdGUuY2hpbGRyZW4gJiYgdGVtcGxhdGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb21waWxlKHZtLCB0ZW1wbGF0ZS5jaGlsZHJlblswXSwgdm0uX3BhcmVudEVsKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbXBpbGUodm0sIHRlbXBsYXRlLmNoaWxkcmVuLCB2bS5fcGFyZW50RWwpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbXBpbGUodm0sIHRlbXBsYXRlLCB2bS5fcGFyZW50RWwpXG4gIH1cblxuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBcInJlYWR5XCIgbGlmZWN5Y2xlIGluIFZtKCR7dm0uX3R5cGV9KWApXG4gIHZtLiRlbWl0KCdob29rOnJlYWR5JylcbiAgdm0uX3JlYWR5ID0gdHJ1ZVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGVsZW1lbnRzIGJ5IGNoaWxkIG9yIGNoaWxkcmVuIGFuZCBhcHBlbmQgdG8gcGFyZW50IGVsZW1lbnRzLlxuICogUm9vdCBlbGVtZW50IGluZm8gd291bGQgYmUgbWVyZ2VkIGlmIGhhcy4gVGhlIGZpcnN0IGFyZ3VtZW50IG1heSBiZSBhbiBhcnJheVxuICogaWYgdGhlIHJvb3QgZWxlbWVudCB3aXRoIG9wdGlvbnMucmVwbGFjZSBoYXMgbm90IG9ubHkgb25lIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGFycmF5fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICBkZXN0XG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgbWV0YVxuICovXG5mdW5jdGlvbiBjb21waWxlICh2bSwgdGFyZ2V0LCBkZXN0LCBtZXRhKSB7XG4gIGNvbnN0IGFwcCA9IHZtLl9hcHAgfHwge31cblxuICBpZiAoYXBwLmxhc3RTaWduYWwgPT09IC0xKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0LmF0dHIgJiYgdGFyZ2V0LmF0dHIuaGFzT3duUHJvcGVydHkoJ3N0YXRpYycpKSB7XG4gICAgdm0uX3N0YXRpYyA9IHRydWVcbiAgfVxuXG4gIGlmICh0YXJnZXRJc0ZyYWdtZW50KHRhcmdldCkpIHtcbiAgICBjb21waWxlRnJhZ21lbnQodm0sIHRhcmdldCwgZGVzdCwgbWV0YSlcbiAgICByZXR1cm5cbiAgfVxuICBtZXRhID0gbWV0YSB8fCB7fVxuICBpZiAodGFyZ2V0SXNDb250ZW50KHRhcmdldCkpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSBjb21waWxlIFwiY29udGVudFwiIGJsb2NrIGJ5JywgdGFyZ2V0KVxuICAgIHZtLl9jb250ZW50ID0gY3JlYXRlQmxvY2sodm0sIGRlc3QpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0TmVlZENoZWNrUmVwZWF0KHRhcmdldCwgbWV0YSkpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSBjb21waWxlIFwicmVwZWF0XCIgbG9naWMgYnknLCB0YXJnZXQpXG4gICAgaWYgKGRlc3QudHlwZSA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBUaGUgcm9vdCBlbGVtZW50IGRvZXNcXCd0IHN1cHBvcnQgYHJlcGVhdGAgZGlyZWN0aXZlIScpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29tcGlsZVJlcGVhdCh2bSwgdGFyZ2V0LCBkZXN0KVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAodGFyZ2V0TmVlZENoZWNrU2hvd24odGFyZ2V0LCBtZXRhKSkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgXCJpZlwiIGxvZ2ljIGJ5JywgdGFyZ2V0KVxuICAgIGlmIChkZXN0LnR5cGUgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gVGhlIHJvb3QgZWxlbWVudCBkb2VzXFwndCBzdXBwb3J0IGBpZmAgZGlyZWN0aXZlIScpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29tcGlsZVNob3duKHZtLCB0YXJnZXQsIGRlc3QsIG1ldGEpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHR5cGVHZXR0ZXIgPSBtZXRhLnR5cGUgfHwgdGFyZ2V0LnR5cGVcbiAgaWYgKHRhcmdldE5lZWRDaGVja1R5cGUodHlwZUdldHRlciwgbWV0YSkpIHtcbiAgICBjb21waWxlVHlwZSh2bSwgdGFyZ2V0LCBkZXN0LCB0eXBlR2V0dGVyLCBtZXRhKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlR2V0dGVyXG4gIGNvbnN0IGNvbXBvbmVudCA9IHRhcmdldElzQ29tcG9zZWQodm0sIHRhcmdldCwgdHlwZSlcbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgY29tcG9zZWQgY29tcG9uZW50IGJ5JywgdGFyZ2V0KVxuICAgIGNvbXBpbGVDdXN0b21Db21wb25lbnQodm0sIGNvbXBvbmVudCwgdGFyZ2V0LCBkZXN0LCB0eXBlLCBtZXRhKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgbmF0aXZlIGNvbXBvbmVudCBieScsIHRhcmdldClcbiAgY29tcGlsZU5hdGl2ZUNvbXBvbmVudCh2bSwgdGFyZ2V0LCBkZXN0LCB0eXBlKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhcmdldCBpcyBhIGZyYWdtZW50IChhbiBhcnJheSkuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgdGFyZ2V0XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0YXJnZXRJc0ZyYWdtZW50ICh0YXJnZXQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhcmdldCB0eXBlIGlzIGNvbnRlbnQvc2xvdC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICB0YXJnZXRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRhcmdldElzQ29udGVudCAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQudHlwZSA9PT0gJ2NvbnRlbnQnIHx8IHRhcmdldC50eXBlID09PSAnc2xvdCdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0YXJnZXQgbmVlZCB0byBjb21waWxlIGJ5IGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICB0YXJnZXRcbiAqIEBwYXJhbSAge29iamVjdH0gIG1ldGFcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRhcmdldE5lZWRDaGVja1JlcGVhdCAodGFyZ2V0LCBtZXRhKSB7XG4gIHJldHVybiAhbWV0YS5oYXNPd25Qcm9wZXJ0eSgncmVwZWF0JykgJiYgdGFyZ2V0LnJlcGVhdFxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhcmdldCBuZWVkIHRvIGNvbXBpbGUgYnkgYSBib29sZWFuIHZhbHVlLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gIHRhcmdldFxuICogQHBhcmFtICB7b2JqZWN0fSAgbWV0YVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0TmVlZENoZWNrU2hvd24gKHRhcmdldCwgbWV0YSkge1xuICByZXR1cm4gIW1ldGEuaGFzT3duUHJvcGVydHkoJ3Nob3duJykgJiYgdGFyZ2V0LnNob3duXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGFyZ2V0IG5lZWQgdG8gY29tcGlsZSBieSBhIGR5bmFtaWMgdHlwZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8ZnVuY3Rpb259IHR5cGVHZXR0ZXJcbiAqIEBwYXJhbSAge29iamVjdH0gICAgICAgICAgbWV0YVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0TmVlZENoZWNrVHlwZSAodHlwZUdldHRlciwgbWV0YSkge1xuICByZXR1cm4gKHR5cGVvZiB0eXBlR2V0dGVyID09PSAnZnVuY3Rpb24nKSAmJiAhbWV0YS5oYXNPd25Qcm9wZXJ0eSgndHlwZScpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBraW5kIG9mIGNvbXBvbmVudCBpcyBjb21wb3NlZC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0YXJnZXRJc0NvbXBvc2VkICh2bSwgdGFyZ2V0LCB0eXBlKSB7XG4gIGxldCBjb21wb25lbnRcbiAgaWYgKHZtLl9hcHAgJiYgdm0uX2FwcC5jdXN0b21Db21wb25lbnRNYXApIHtcbiAgICBjb21wb25lbnQgPSB2bS5fYXBwLmN1c3RvbUNvbXBvbmVudE1hcFt0eXBlXVxuICB9XG4gIGlmICh2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5jb21wb25lbnRzKSB7XG4gICAgY29tcG9uZW50ID0gdm0uX29wdGlvbnMuY29tcG9uZW50c1t0eXBlXVxuICB9XG4gIGlmICh0YXJnZXQuY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gY29tcG9uZW50IHx8IHt9XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudFxufVxuXG4vKipcbiAqIENvbXBpbGUgYSBsaXN0IG9mIHRhcmdldHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHtvYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVGcmFnbWVudCAodm0sIHRhcmdldCwgZGVzdCwgbWV0YSkge1xuICBjb25zdCBmcmFnQmxvY2sgPSBjcmVhdGVCbG9jayh2bSwgZGVzdClcbiAgdGFyZ2V0LmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgY29tcGlsZSh2bSwgY2hpbGQsIGZyYWdCbG9jaywgbWV0YSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgdGFyZ2V0IHdpdGggcmVwZWF0IGRpcmVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdFxuICovXG5mdW5jdGlvbiBjb21waWxlUmVwZWF0ICh2bSwgdGFyZ2V0LCBkZXN0KSB7XG4gIGNvbnN0IHJlcGVhdCA9IHRhcmdldC5yZXBlYXRcbiAgY29uc3Qgb2xkU3R5bGUgPSB0eXBlb2YgcmVwZWF0ID09PSAnZnVuY3Rpb24nXG4gIGxldCBnZXR0ZXIgPSByZXBlYXQuZ2V0dGVyIHx8IHJlcGVhdC5leHByZXNzaW9uIHx8IHJlcGVhdFxuICBpZiAodHlwZW9mIGdldHRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGdldHRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdIH1cbiAgfVxuICBjb25zdCBrZXkgPSByZXBlYXQua2V5IHx8ICckaW5kZXgnXG4gIGNvbnN0IHZhbHVlID0gcmVwZWF0LnZhbHVlIHx8ICckdmFsdWUnXG4gIGNvbnN0IHRyYWNrQnkgPSByZXBlYXQudHJhY2tCeSB8fCB0YXJnZXQudHJhY2tCeSB8fFxuICAgICh0YXJnZXQuYXR0ciAmJiB0YXJnZXQuYXR0ci50cmFja0J5KVxuXG4gIGNvbnN0IGZyYWdCbG9jayA9IGNyZWF0ZUJsb2NrKHZtLCBkZXN0KVxuICBmcmFnQmxvY2suY2hpbGRyZW4gPSBbXVxuICBmcmFnQmxvY2suZGF0YSA9IFtdXG4gIGZyYWdCbG9jay52bXMgPSBbXVxuXG4gIGJpbmRSZXBlYXQodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCB7IGdldHRlciwga2V5LCB2YWx1ZSwgdHJhY2tCeSwgb2xkU3R5bGUgfSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgdGFyZ2V0IHdpdGggaWYgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge29iamVjdH0gbWV0YVxuICovXG5mdW5jdGlvbiBjb21waWxlU2hvd24gKHZtLCB0YXJnZXQsIGRlc3QsIG1ldGEpIHtcbiAgY29uc3QgbmV3TWV0YSA9IHsgc2hvd246IHRydWUgfVxuICBjb25zdCBmcmFnQmxvY2sgPSBjcmVhdGVCbG9jayh2bSwgZGVzdClcblxuICBpZiAoZGVzdC5lbGVtZW50ICYmIGRlc3QuY2hpbGRyZW4pIHtcbiAgICBkZXN0LmNoaWxkcmVuLnB1c2goZnJhZ0Jsb2NrKVxuICB9XG5cbiAgaWYgKG1ldGEucmVwZWF0KSB7XG4gICAgbmV3TWV0YS5yZXBlYXQgPSBtZXRhLnJlcGVhdFxuICB9XG5cbiAgYmluZFNob3duKHZtLCB0YXJnZXQsIGZyYWdCbG9jaywgbmV3TWV0YSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgdGFyZ2V0IHdpdGggZHluYW1pYyBjb21wb25lbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc3RcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHR5cGVHZXR0ZXJcbiAqL1xuZnVuY3Rpb24gY29tcGlsZVR5cGUgKHZtLCB0YXJnZXQsIGRlc3QsIHR5cGVHZXR0ZXIsIG1ldGEpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVHZXR0ZXIuY2FsbCh2bSlcbiAgY29uc3QgbmV3TWV0YSA9IGV4dGVuZCh7IHR5cGUgfSwgbWV0YSlcbiAgY29uc3QgZnJhZ0Jsb2NrID0gY3JlYXRlQmxvY2sodm0sIGRlc3QpXG5cbiAgaWYgKGRlc3QuZWxlbWVudCAmJiBkZXN0LmNoaWxkcmVuKSB7XG4gICAgZGVzdC5jaGlsZHJlbi5wdXNoKGZyYWdCbG9jaylcbiAgfVxuXG4gIHdhdGNoKHZtLCB0eXBlR2V0dGVyLCAodmFsdWUpID0+IHtcbiAgICBjb25zdCBuZXdNZXRhID0gZXh0ZW5kKHsgdHlwZTogdmFsdWUgfSwgbWV0YSlcbiAgICByZW1vdmVUYXJnZXQodm0sIGZyYWdCbG9jaywgdHJ1ZSlcbiAgICBjb21waWxlKHZtLCB0YXJnZXQsIGZyYWdCbG9jaywgbmV3TWV0YSlcbiAgfSlcblxuICBjb21waWxlKHZtLCB0YXJnZXQsIGZyYWdCbG9jaywgbmV3TWV0YSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgY29tcG9zZWQgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjb21waWxlQ3VzdG9tQ29tcG9uZW50ICh2bSwgY29tcG9uZW50LCB0YXJnZXQsIGRlc3QsIHR5cGUsIG1ldGEpIHtcbiAgY29uc3QgQ3RvciA9IHZtLmNvbnN0cnVjdG9yXG4gIGNvbnN0IHN1YlZtID0gbmV3IEN0b3IodHlwZSwgY29tcG9uZW50LCB2bSwgZGVzdCwgdW5kZWZpbmVkLCB7XG4gICAgJ2hvb2s6aW5pdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh2bS5fc3RhdGljKSB7XG4gICAgICAgIHRoaXMuX3N0YXRpYyA9IHZtLl9zdGF0aWNcbiAgICAgIH1cbiAgICAgIHNldElkKHZtLCBudWxsLCB0YXJnZXQuaWQsIHRoaXMpXG4gICAgICAvLyBiaW5kIHRlbXBsYXRlIGVhcmxpZXIgYmVjYXVzZSBvZiBsaWZlY3ljbGUgaXNzdWVzXG4gICAgICB0aGlzLl9leHRlcm5hbEJpbmRpbmcgPSB7XG4gICAgICAgIHBhcmVudDogdm0sXG4gICAgICAgIHRlbXBsYXRlOiB0YXJnZXRcbiAgICAgIH1cbiAgICB9LFxuICAgICdob29rOmNyZWF0ZWQnOiBmdW5jdGlvbiAoKSB7XG4gICAgICBiaW5kU3ViVm0odm0sIHRoaXMsIHRhcmdldCwgbWV0YS5yZXBlYXQpXG4gICAgfSxcbiAgICAnaG9vazpyZWFkeSc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICAgIGNvbXBpbGVDaGlsZHJlbih2bSwgdGFyZ2V0LCB0aGlzLl9jb250ZW50KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgYmluZFN1YlZtQWZ0ZXJJbml0aWFsaXplZCh2bSwgc3ViVm0sIHRhcmdldCwgZGVzdClcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBlbGVtZW50IGZyb20gdGVtcGxhdGUgYW5kIGF0dGFjaCB0byB0aGUgZGVzdCBpZiBuZWVkZWQuXG4gKiBUaGUgdGltZSB0byBhdHRhY2ggZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBtb2RlIHN0YXR1cyBpcyBub2RlIG9yIHRyZWUuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdFxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY29tcGlsZU5hdGl2ZUNvbXBvbmVudCAodm0sIHRlbXBsYXRlLCBkZXN0LCB0eXBlKSB7XG4gIGFwcGx5TmFpdHZlQ29tcG9uZW50T3B0aW9ucyh0ZW1wbGF0ZSlcblxuICBsZXQgZWxlbWVudFxuICBpZiAoZGVzdC5yZWYgPT09ICdfZG9jdW1lbnRFbGVtZW50Jykge1xuICAgIC8vIGlmIGl0cyBwYXJlbnQgaXMgZG9jdW1lbnRFbGVtZW50IHRoZW4gaXQncyBhIGJvZHlcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBjb21waWxlIHRvIGNyZWF0ZSBib2R5IGZvciAke3R5cGV9YClcbiAgICBlbGVtZW50ID0gY3JlYXRlQm9keSh2bSwgdHlwZSlcbiAgfVxuICBlbHNlIHtcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBjb21waWxlIHRvIGNyZWF0ZSBlbGVtZW50IGZvciAke3R5cGV9YClcbiAgICBlbGVtZW50ID0gY3JlYXRlRWxlbWVudCh2bSwgdHlwZSlcbiAgfVxuXG4gIGlmICghdm0uX3Jvb3RFbCkge1xuICAgIHZtLl9yb290RWwgPSBlbGVtZW50XG4gICAgLy8gYmluZCBldmVudCBlYXJsaWVyIGJlY2F1c2Ugb2YgbGlmZWN5Y2xlIGlzc3Vlc1xuICAgIGNvbnN0IGJpbmRpbmcgPSB2bS5fZXh0ZXJuYWxCaW5kaW5nIHx8IHt9XG4gICAgY29uc3QgdGFyZ2V0ID0gYmluZGluZy50ZW1wbGF0ZVxuICAgIGNvbnN0IHBhcmVudFZtID0gYmluZGluZy5wYXJlbnRcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5ldmVudHMgJiYgcGFyZW50Vm0gJiYgZWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCB0eXBlIGluIHRhcmdldC5ldmVudHMpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHBhcmVudFZtW3RhcmdldC5ldmVudHNbdHlwZV1dXG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudCh0eXBlLCBiaW5kKGhhbmRsZXIsIHBhcmVudFZtKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJpbmRFbGVtZW50KHZtLCBlbGVtZW50LCB0ZW1wbGF0ZSlcblxuICBpZiAodGVtcGxhdGUuYXR0ciAmJiB0ZW1wbGF0ZS5hdHRyLmFwcGVuZCkgeyAvLyBiYWNrd2FyZCwgYXBwZW5kIHByb3AgaW4gYXR0clxuICAgIHRlbXBsYXRlLmFwcGVuZCA9IHRlbXBsYXRlLmF0dHIuYXBwZW5kXG4gIH1cblxuICBpZiAodGVtcGxhdGUuYXBwZW5kKSB7IC8vIGdpdmUgdGhlIGFwcGVuZCBhdHRyaWJ1dGUgZm9yIGlvcyBhZGFwdGF0aW9uXG4gICAgZWxlbWVudC5hdHRyID0gZWxlbWVudC5hdHRyIHx8IHt9XG4gICAgZWxlbWVudC5hdHRyLmFwcGVuZCA9IHRlbXBsYXRlLmFwcGVuZFxuICB9XG5cbiAgY29uc3QgdHJlZU1vZGUgPSB0ZW1wbGF0ZS5hcHBlbmQgPT09ICd0cmVlJ1xuICBjb25zdCBhcHAgPSB2bS5fYXBwIHx8IHt9XG4gIGlmIChhcHAubGFzdFNpZ25hbCAhPT0gLTEgJiYgIXRyZWVNb2RlKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gY29tcGlsZSB0byBhcHBlbmQgc2luZ2xlIG5vZGUgZm9yJywgZWxlbWVudClcbiAgICBhcHAubGFzdFNpZ25hbCA9IGF0dGFjaFRhcmdldCh2bSwgZWxlbWVudCwgZGVzdClcbiAgfVxuICBpZiAoYXBwLmxhc3RTaWduYWwgIT09IC0xKSB7XG4gICAgY29tcGlsZUNoaWxkcmVuKHZtLCB0ZW1wbGF0ZSwgZWxlbWVudClcbiAgfVxuICBpZiAoYXBwLmxhc3RTaWduYWwgIT09IC0xICYmIHRyZWVNb2RlKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gY29tcGlsZSB0byBhcHBlbmQgd2hvbGUgdHJlZSBmb3InLCBlbGVtZW50KVxuICAgIGFwcC5sYXN0U2lnbmFsID0gYXR0YWNoVGFyZ2V0KHZtLCBlbGVtZW50LCBkZXN0KVxuICB9XG59XG5cbi8qKlxuICogU2V0IGFsbCBjaGlsZHJlbiB0byBhIGNlcnRhaW4gcGFyZW50IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdFxuICovXG5mdW5jdGlvbiBjb21waWxlQ2hpbGRyZW4gKHZtLCB0ZW1wbGF0ZSwgZGVzdCkge1xuICBjb25zdCBhcHAgPSB2bS5fYXBwIHx8IHt9XG4gIGNvbnN0IGNoaWxkcmVuID0gdGVtcGxhdGUuY2hpbGRyZW5cbiAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4ge1xuICAgICAgY29tcGlsZSh2bSwgY2hpbGQsIGRlc3QpXG4gICAgICByZXR1cm4gYXBwLmxhc3RTaWduYWwgIT09IC0xXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoIHRoZSBsaXN0IHVwZGF0ZSBhbmQgcmVmcmVzaCB0aGUgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge29iamVjdH0gZnJhZ0Jsb2NrIHt2bXMsIGRhdGEsIGNoaWxkcmVufVxuICogQHBhcmFtIHtvYmplY3R9IGluZm8gICAgICB7Z2V0dGVyLCBrZXksIHZhbHVlLCB0cmFja0J5LCBvbGRTdHlsZX1cbiAqL1xuZnVuY3Rpb24gYmluZFJlcGVhdCAodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBpbmZvKSB7XG4gIGNvbnN0IHZtcyA9IGZyYWdCbG9jay52bXNcbiAgY29uc3QgY2hpbGRyZW4gPSBmcmFnQmxvY2suY2hpbGRyZW5cbiAgY29uc3QgeyBnZXR0ZXIsIHRyYWNrQnksIG9sZFN0eWxlIH0gPSBpbmZvXG4gIGNvbnN0IGtleU5hbWUgPSBpbmZvLmtleVxuICBjb25zdCB2YWx1ZU5hbWUgPSBpbmZvLnZhbHVlXG5cbiAgZnVuY3Rpb24gY29tcGlsZUl0ZW0gKGl0ZW0sIGluZGV4LCBjb250ZXh0KSB7XG4gICAgbGV0IG1lcmdlZERhdGFcbiAgICBpZiAob2xkU3R5bGUpIHtcbiAgICAgIG1lcmdlZERhdGEgPSBpdGVtXG4gICAgICBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgbWVyZ2VkRGF0YVtrZXlOYW1lXSA9IGluZGV4XG4gICAgICAgIGlmICghbWVyZ2VkRGF0YS5oYXNPd25Qcm9wZXJ0eSgnSU5ERVgnKSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXJnZWREYXRhLCAnSU5ERVgnLCB7XG4gICAgICAgICAgICB2YWx1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFwiSU5ERVhcIiBpbiByZXBlYXQgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgICAgICAgJ3BsZWFzZSB1c2UgXCIkaW5kZXhcIiBpbnN0ZWFkJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBFYWNoIGxpc3QgaXRlbSBtdXN0IGJlIGFuIG9iamVjdCBpbiBvbGQtc3R5bGUgcmVwZWF0LCAnXG4gICAgICAgICAgKyAncGxlYXNlIHVzZSBgcmVwZWF0PXt7diBpbiBsaXN0fX1gIGluc3RlYWQuJylcbiAgICAgICAgbWVyZ2VkRGF0YSA9IHt9XG4gICAgICAgIG1lcmdlZERhdGFba2V5TmFtZV0gPSBpbmRleFxuICAgICAgICBtZXJnZWREYXRhW3ZhbHVlTmFtZV0gPSBpdGVtXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbWVyZ2VkRGF0YSA9IHt9XG4gICAgICBtZXJnZWREYXRhW2tleU5hbWVdID0gaW5kZXhcbiAgICAgIG1lcmdlZERhdGFbdmFsdWVOYW1lXSA9IGl0ZW1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGV4dCA9IG1lcmdlQ29udGV4dChjb250ZXh0LCBtZXJnZWREYXRhKVxuICAgIHZtcy5wdXNoKG5ld0NvbnRleHQpXG4gICAgY29tcGlsZShuZXdDb250ZXh0LCB0YXJnZXQsIGZyYWdCbG9jaywgeyByZXBlYXQ6IGl0ZW0gfSlcbiAgfVxuXG4gIGNvbnN0IGxpc3QgPSB3YXRjaEJsb2NrKHZtLCBmcmFnQmxvY2ssIGdldHRlciwgJ3JlcGVhdCcsXG4gICAgKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIHRoZSBcInJlcGVhdFwiIGl0ZW0gaGFzIGNoYW5nZWQnLCBkYXRhKVxuICAgICAgaWYgKCFmcmFnQmxvY2sgfHwgIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9sZENoaWxkcmVuID0gY2hpbGRyZW4uc2xpY2UoKVxuICAgICAgY29uc3Qgb2xkVm1zID0gdm1zLnNsaWNlKClcbiAgICAgIGNvbnN0IG9sZERhdGEgPSBmcmFnQmxvY2suZGF0YS5zbGljZSgpXG4gICAgICAvLyAxLiBjb2xsZWN0IGFsbCBuZXcgcmVmcyB0cmFjayBieVxuICAgICAgY29uc3QgdHJhY2tNYXAgPSB7fVxuICAgICAgY29uc3QgcmV1c2VkTWFwID0ge31cbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJhY2tCeSA/IGl0ZW1bdHJhY2tCeV0gOiAob2xkU3R5bGUgPyBpdGVtW2tleU5hbWVdIDogaW5kZXgpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5ID09PSAnJykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRyYWNrTWFwW2tleV0gPSBpdGVtXG4gICAgICB9KVxuXG4gICAgICAvLyAyLiByZW1vdmUgdW51c2VkIGVsZW1lbnQgZm9yZWFjaCBvbGQgaXRlbVxuICAgICAgY29uc3QgcmV1c2VkTGlzdCA9IFtdXG4gICAgICBvbGREYXRhLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRyYWNrQnkgPyBpdGVtW3RyYWNrQnldIDogKG9sZFN0eWxlID8gaXRlbVtrZXlOYW1lXSA6IGluZGV4KVxuICAgICAgICBpZiAodHJhY2tNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHJldXNlZE1hcFtrZXldID0ge1xuICAgICAgICAgICAgaXRlbSwgaW5kZXgsIGtleSxcbiAgICAgICAgICAgIHRhcmdldDogb2xkQ2hpbGRyZW5baW5kZXhdLFxuICAgICAgICAgICAgdm06IG9sZFZtc1tpbmRleF1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV1c2VkTGlzdC5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlVGFyZ2V0KHZtLCBvbGRDaGlsZHJlbltpbmRleF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIDMuIGNyZWF0ZSBuZXcgZWxlbWVudCBmb3JlYWNoIG5ldyBpdGVtXG4gICAgICBjaGlsZHJlbi5sZW5ndGggPSAwXG4gICAgICB2bXMubGVuZ3RoID0gMFxuICAgICAgZnJhZ0Jsb2NrLmRhdGEgPSBkYXRhLnNsaWNlKClcbiAgICAgIGZyYWdCbG9jay51cGRhdGVNYXJrID0gZnJhZ0Jsb2NrLnN0YXJ0XG5cbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJhY2tCeSA/IGl0ZW1bdHJhY2tCeV0gOiAob2xkU3R5bGUgPyBpdGVtW2tleU5hbWVdIDogaW5kZXgpXG4gICAgICAgIGNvbnN0IHJldXNlZCA9IHJldXNlZE1hcFtrZXldXG4gICAgICAgIGlmIChyZXVzZWQpIHtcbiAgICAgICAgICBpZiAocmV1c2VkLml0ZW0gPT09IHJldXNlZExpc3RbMF0pIHtcbiAgICAgICAgICAgIHJldXNlZExpc3Quc2hpZnQoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldXNlZExpc3QuJHJlbW92ZShyZXVzZWQuaXRlbSlcbiAgICAgICAgICAgIG1vdmVUYXJnZXQodm0sIHJldXNlZC50YXJnZXQsIGZyYWdCbG9jay51cGRhdGVNYXJrLCB0cnVlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHJldXNlZC50YXJnZXQpXG4gICAgICAgICAgdm1zLnB1c2gocmV1c2VkLnZtKVxuICAgICAgICAgIGlmIChvbGRTdHlsZSkge1xuICAgICAgICAgICAgcmV1c2VkLnZtID0gaXRlbVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldXNlZC52bVt2YWx1ZU5hbWVdID0gaXRlbVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXVzZWQudm1ba2V5TmFtZV0gPSBpbmRleFxuICAgICAgICAgIGZyYWdCbG9jay51cGRhdGVNYXJrID0gcmV1c2VkLnRhcmdldFxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVJdGVtKGl0ZW0sIGluZGV4LCB2bSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgZGVsZXRlIGZyYWdCbG9jay51cGRhdGVNYXJrXG4gICAgfVxuICApXG5cbiAgZnJhZ0Jsb2NrLmRhdGEgPSBsaXN0LnNsaWNlKDApXG4gIGxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICBjb21waWxlSXRlbShpdGVtLCBpbmRleCwgdm0pXG4gIH0pXG59XG5cbi8qKlxuICogV2F0Y2ggdGhlIGRpc3BsYXkgdXBkYXRlIGFuZCBhZGQvcmVtb3ZlIHRoZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGZyYWdCbG9ja1xuICogQHBhcmFtICB7b2JqZWN0fSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGJpbmRTaG93biAodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBtZXRhKSB7XG4gIGNvbnN0IGRpc3BsYXkgPSB3YXRjaEJsb2NrKHZtLCBmcmFnQmxvY2ssIHRhcmdldC5zaG93biwgJ3Nob3duJyxcbiAgICAoZGlzcGxheSkgPT4ge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gdGhlIFwiaWZcIiBpdGVtIHdhcyBjaGFuZ2VkJywgZGlzcGxheSlcblxuICAgICAgaWYgKCFmcmFnQmxvY2sgfHwgISFmcmFnQmxvY2suZGlzcGxheSA9PT0gISFkaXNwbGF5KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZnJhZ0Jsb2NrLmRpc3BsYXkgPSAhIWRpc3BsYXlcbiAgICAgIGlmIChkaXNwbGF5KSB7XG4gICAgICAgIGNvbXBpbGUodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBtZXRhKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlbW92ZVRhcmdldCh2bSwgZnJhZ0Jsb2NrLCB0cnVlKVxuICAgICAgfVxuICAgIH1cbiAgKVxuXG4gIGZyYWdCbG9jay5kaXNwbGF5ID0gISFkaXNwbGF5XG4gIGlmIChkaXNwbGF5KSB7XG4gICAgY29tcGlsZSh2bSwgdGFyZ2V0LCBmcmFnQmxvY2ssIG1ldGEpXG4gIH1cbn1cblxuLyoqXG4gKiBXYXRjaCBjYWxjIHZhbHVlIGNoYW5nZXMgYW5kIGFwcGVuZCBjZXJ0YWluIHR5cGUgYWN0aW9uIHRvIGRpZmZlci5cbiAqIEl0IGlzIHVzZWQgZm9yIGlmIG9yIHJlcGVhdCBkYXRhLWJpbmRpbmcgZ2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBmcmFnQmxvY2tcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxjXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZVxuICogQHBhcmFtICB7ZnVuY3Rpb259IGhhbmRsZXJcbiAqIEByZXR1cm4ge2FueX0gICAgICBpbml0IHZhbHVlIG9mIGNhbGNcbiAqL1xuZnVuY3Rpb24gd2F0Y2hCbG9jayAodm0sIGZyYWdCbG9jaywgY2FsYywgdHlwZSwgaGFuZGxlcikge1xuICBjb25zdCBkaWZmZXIgPSB2bSAmJiB2bS5fYXBwICYmIHZtLl9hcHAuZGlmZmVyXG4gIGNvbnN0IGNvbmZpZyA9IHt9XG4gIGNvbnN0IGRlcHRoID0gKGZyYWdCbG9jay5lbGVtZW50LmRlcHRoIHx8IDApICsgMVxuXG4gIHJldHVybiB3YXRjaCh2bSwgY2FsYywgKHZhbHVlKSA9PiB7XG4gICAgY29uZmlnLmxhdGVzdFZhbHVlID0gdmFsdWVcbiAgICBpZiAoZGlmZmVyICYmICFjb25maWcucmVjb3JkZWQpIHtcbiAgICAgIGRpZmZlci5hcHBlbmQodHlwZSwgZGVwdGgsIGZyYWdCbG9jay5ibG9ja0lkLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhdGVzdFZhbHVlID0gY29uZmlnLmxhdGVzdFZhbHVlXG4gICAgICAgIGhhbmRsZXIobGF0ZXN0VmFsdWUpXG4gICAgICAgIGNvbmZpZy5yZWNvcmRlZCA9IGZhbHNlXG4gICAgICAgIGNvbmZpZy5sYXRlc3RWYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uZmlnLnJlY29yZGVkID0gdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIENsb25lIGEgY29udGV4dCBhbmQgbWVyZ2UgY2VydGFpbiBkYXRhLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gbWVyZ2VkRGF0YVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBtZXJnZUNvbnRleHQgKGNvbnRleHQsIG1lcmdlZERhdGEpIHtcbiAgY29uc3QgbmV3Q29udGV4dCA9IE9iamVjdC5jcmVhdGUoY29udGV4dClcbiAgbmV3Q29udGV4dC5fZGF0YSA9IG1lcmdlZERhdGFcbiAgaW5pdERhdGEobmV3Q29udGV4dClcbiAgaW5pdENvbXB1dGVkKG5ld0NvbnRleHQpXG4gIG5ld0NvbnRleHQuX3JlYWxQYXJlbnQgPSBjb250ZXh0XG4gIGlmIChjb250ZXh0Ll9zdGF0aWMpIHtcbiAgICBuZXdDb250ZXh0Ll9zdGF0aWMgPSBjb250ZXh0Ll9zdGF0aWNcbiAgfVxuICByZXR1cm4gbmV3Q29udGV4dFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIEV2ZXJ5dGhpbmcgYWJvdXQgY29tcG9uZW50IGV2ZW50IHdoaWNoIGluY2x1ZGVzIGV2ZW50IG9iamVjdCwgZXZlbnQgbGlzdGVuZXIsXG4gKiBldmVudCBlbWl0dGVyIGFuZCBsaWZlY3ljbGUgaG9va3MuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBvYmplY3QgZGVmaW5pdGlvbi4gQW4gZXZlbnQgb2JqZWN0IGhhcyBgdHlwZWAsIGB0aW1lc3RhbXBgIGFuZFxuICogYGRldGFpbGAgZnJvbSB3aGljaCBhIGNvbXBvbmVudCBlbWl0LiBUaGUgZXZlbnQgb2JqZWN0IGNvdWxkIGJlIGRpc3BhdGNoZWQgdG9cbiAqIHBhcmVudHMgb3IgYnJvYWRjYXN0ZWQgdG8gY2hpbGRyZW4gZXhjZXB0IGB0aGlzLnN0b3AoKWAgaXMgY2FsbGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7YW55fSAgICBkZXRhaWxcbiAqL1xuZnVuY3Rpb24gRXZ0ICh0eXBlLCBkZXRhaWwpIHtcbiAgaWYgKGRldGFpbCBpbnN0YW5jZW9mIEV2dCkge1xuICAgIHJldHVybiBkZXRhaWxcbiAgfVxuXG4gIHRoaXMudGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICB0aGlzLmRldGFpbCA9IGRldGFpbFxuICB0aGlzLnR5cGUgPSB0eXBlXG5cbiAgbGV0IHNob3VsZFN0b3AgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBzdG9wIGRpc3BhdGNoIGFuZCBicm9hZGNhc3RcbiAgICovXG4gIHRoaXMuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGRTdG9wID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrIGlmIGl0IGNhbid0IGJlIGRpc3BhdGNoZWQgb3IgYnJvYWRjYXN0ZWRcbiAgICovXG4gIHRoaXMuaGFzU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2hvdWxkU3RvcFxuICB9XG59XG5cbi8qKlxuICogRW1pdCBhbiBldmVudCBidXQgbm90IGJyb2FkY2FzdCBkb3duIG9yIGRpc3BhdGNoIHVwLlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHthbnl9ICAgIGRldGFpbFxuICovXG5leHBvcnQgZnVuY3Rpb24gJGVtaXQgKHR5cGUsIGRldGFpbCkge1xuICBjb25zdCBldmVudHMgPSB0aGlzLl92bUV2ZW50c1xuICBjb25zdCBoYW5kbGVyTGlzdCA9IGV2ZW50c1t0eXBlXVxuICBpZiAoaGFuZGxlckxpc3QpIHtcbiAgICBjb25zdCBldnQgPSBuZXcgRXZ0KHR5cGUsIGRldGFpbClcbiAgICBoYW5kbGVyTGlzdC5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZ0KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0IGFuIGV2ZW50IGFuZCBkaXNwYXRjaCBpdCB1cC5cbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7YW55fSAgICBkZXRhaWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRkaXNwYXRjaCAodHlwZSwgZGV0YWlsKSB7XG4gIGNvbnN0IGV2dCA9IG5ldyBFdnQodHlwZSwgZGV0YWlsKVxuICB0aGlzLiRlbWl0KHR5cGUsIGV2dClcblxuICBpZiAoIWV2dC5oYXNTdG9wcGVkKCkgJiYgdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC4kZGlzcGF0Y2gpIHtcbiAgICB0aGlzLl9wYXJlbnQuJGRpc3BhdGNoKHR5cGUsIGV2dClcbiAgfVxufVxuXG4vKipcbiAqIEVtaXQgYW4gZXZlbnQgYW5kIGJyb2FkY2FzdCBpdCBkb3duLlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHthbnl9ICAgIGRldGFpbFxuICovXG5leHBvcnQgZnVuY3Rpb24gJGJyb2FkY2FzdCAodHlwZSwgZGV0YWlsKSB7XG4gIGNvbnN0IGV2dCA9IG5ldyBFdnQodHlwZSwgZGV0YWlsKVxuICB0aGlzLiRlbWl0KHR5cGUsIGV2dClcblxuICBpZiAoIWV2dC5oYXNTdG9wcGVkKCkgJiYgdGhpcy5fY2hpbGRyZW5WbXMpIHtcbiAgICB0aGlzLl9jaGlsZHJlblZtcy5mb3JFYWNoKChzdWJWbSkgPT4ge1xuICAgICAgc3ViVm0uJGJyb2FkY2FzdCh0eXBlLCBldnQpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBldmVudCBsaXN0ZW5lci5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gJG9uICh0eXBlLCBoYW5kbGVyKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGV2ZW50cyA9IHRoaXMuX3ZtRXZlbnRzXG4gIGNvbnN0IGhhbmRsZXJMaXN0ID0gZXZlbnRzW3R5cGVdIHx8IFtdXG4gIGhhbmRsZXJMaXN0LnB1c2goaGFuZGxlcilcbiAgZXZlbnRzW3R5cGVdID0gaGFuZGxlckxpc3RcblxuICAvLyBmaXhlZCBvbGQgdmVyc2lvbiBsaWZlY3ljbGUgZGVzaWduXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZSA9PT0gJ2hvb2s6cmVhZHknICYmIHRoaXMuX3JlYWR5KSB7XG4gICAgdGhpcy4kZW1pdCgnaG9vazpyZWFkeScpXG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXIuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZVxuICogQHBhcmFtICB7ZnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRvZmYgKHR5cGUsIGhhbmRsZXIpIHtcbiAgaWYgKCF0eXBlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgZXZlbnRzID0gdGhpcy5fdm1FdmVudHNcbiAgaWYgKCFoYW5kbGVyKSB7XG4gICAgZGVsZXRlIGV2ZW50c1t0eXBlXVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGhhbmRsZXJMaXN0ID0gZXZlbnRzW3R5cGVdXG4gIGlmICghaGFuZGxlckxpc3QpIHtcbiAgICByZXR1cm5cbiAgfVxuICBoYW5kbGVyTGlzdC4kcmVtb3ZlKGhhbmRsZXIpXG59XG5cbmNvbnN0IExJRkVfQ1lDTEVfVFlQRVMgPSBbJ2luaXQnLCAnY3JlYXRlZCcsICdyZWFkeScsICdkZXN0cm95ZWQnXVxuXG4vKipcbiAqIEluaXQgZXZlbnRzOlxuICogMS4gbGlzdGVuIGBldmVudHNgIGluIGNvbXBvbmVudCBvcHRpb25zICYgYGV4dGVybmFsRXZlbnRzYC5cbiAqIDIuIGJpbmQgbGlmZWN5Y2xlIGhvb2tzLlxuICogQHBhcmFtICB7Vm19ICAgICB2bVxuICogQHBhcmFtICB7b2JqZWN0fSBleHRlcm5hbEV2ZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEV2ZW50cyAodm0sIGV4dGVybmFsRXZlbnRzKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB2bS5fb3B0aW9ucyB8fCB7fVxuICBjb25zdCBldmVudHMgPSBvcHRpb25zLmV2ZW50cyB8fCB7fVxuICBmb3IgKGNvbnN0IHR5cGUxIGluIGV2ZW50cykge1xuICAgIHZtLiRvbih0eXBlMSwgZXZlbnRzW3R5cGUxXSlcbiAgfVxuICBmb3IgKGNvbnN0IHR5cGUyIGluIGV4dGVybmFsRXZlbnRzKSB7XG4gICAgdm0uJG9uKHR5cGUyLCBleHRlcm5hbEV2ZW50c1t0eXBlMl0pXG4gIH1cbiAgTElGRV9DWUNMRV9UWVBFUy5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgdm0uJG9uKGBob29rOiR7dHlwZX1gLCBvcHRpb25zW3R5cGVdKVxuICB9KVxufVxuXG4vKipcbiAqIEJpbmQgZXZlbnQgcmVsYXRlZCBtZXRob2RzIHRvIFZpZXdNb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge1ZtfSB2bVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4aW5FdmVudHMgKHZtKSB7XG4gIHZtLiRlbWl0ID0gJGVtaXRcbiAgdm0uJGRpc3BhdGNoID0gJGRpc3BhdGNoXG4gIHZtLiRicm9hZGNhc3QgPSAkYnJvYWRjYXN0XG4gIHZtLiRvbiA9ICRvblxuICB2bS4kb2ZmID0gJG9mZlxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFZpZXdNb2RlbCBDb25zdHJ1Y3RvciAmIGRlZmluaXRpb25cbiAqL1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuaW1wb3J0IHtcbiAgaW5pdFN0YXRlXG59IGZyb20gJy4uL2NvcmUvc3RhdGUnXG5pbXBvcnQge1xuICBidWlsZFxufSBmcm9tICcuL2NvbXBpbGVyJ1xuaW1wb3J0IHtcbiAgc2V0LFxuICBkZWxcbn0gZnJvbSAnLi4vY29yZS9vYnNlcnZlcidcbmltcG9ydCB7XG4gIHdhdGNoXG59IGZyb20gJy4vZGlyZWN0aXZlJ1xuaW1wb3J0IHtcbiAgaW5pdEV2ZW50cyxcbiAgbWl4aW5FdmVudHNcbn0gZnJvbSAnLi9ldmVudHMnXG5cbi8qKlxuICogVmlld01vZGVsIGNvbnN0cnVjdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zICAgIGNvbXBvbmVudCBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyZW50Vm0gICB3aGljaCBjb250YWlucyBfYXBwXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyZW50RWwgICByb290IGVsZW1lbnQgb3IgZnJhZyBibG9ja1xuICogQHBhcmFtIHtvYmplY3R9IG1lcmdlZERhdGEgZXh0ZXJuYWwgZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IGV4dGVybmFsRXZlbnRzIGV4dGVybmFsIGV2ZW50c1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBWbSAoXG4gIHR5cGUsXG4gIG9wdGlvbnMsXG4gIHBhcmVudFZtLFxuICBwYXJlbnRFbCxcbiAgbWVyZ2VkRGF0YSxcbiAgZXh0ZXJuYWxFdmVudHNcbikge1xuICBwYXJlbnRWbSA9IHBhcmVudFZtIHx8IHt9XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudFZtLl9yZWFsUGFyZW50ID8gcGFyZW50Vm0uX3JlYWxQYXJlbnQgOiBwYXJlbnRWbVxuICB0aGlzLl9hcHAgPSBwYXJlbnRWbS5fYXBwIHx8IHt9XG4gIHBhcmVudFZtLl9jaGlsZHJlblZtcyAmJiBwYXJlbnRWbS5fY2hpbGRyZW5WbXMucHVzaCh0aGlzKVxuXG4gIGlmICghb3B0aW9ucyAmJiB0aGlzLl9hcHAuY3VzdG9tQ29tcG9uZW50TWFwKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMuX2FwcC5jdXN0b21Db21wb25lbnRNYXBbdHlwZV1cbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGNvbnN0IGRhdGEgPSBvcHRpb25zLmRhdGEgfHwge31cblxuICB0aGlzLl9vcHRpb25zID0gb3B0aW9uc1xuICB0aGlzLl9tZXRob2RzID0gb3B0aW9ucy5tZXRob2RzIHx8IHt9XG4gIHRoaXMuX2NvbXB1dGVkID0gb3B0aW9ucy5jb21wdXRlZCB8fCB7fVxuICB0aGlzLl9jc3MgPSBvcHRpb25zLnN0eWxlIHx8IHt9XG4gIHRoaXMuX2lkcyA9IHt9XG4gIHRoaXMuX3ZtRXZlbnRzID0ge31cbiAgdGhpcy5fY2hpbGRyZW5WbXMgPSBbXVxuICB0aGlzLl90eXBlID0gdHlwZVxuXG4gIC8vIGJpbmQgZXZlbnRzIGFuZCBsaWZlY3ljbGVzXG4gIGluaXRFdmVudHModGhpcywgZXh0ZXJuYWxFdmVudHMpXG5cbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gXCJpbml0XCIgbGlmZWN5Y2xlIGluIFZtKCR7dGhpcy5fdHlwZX0pYClcbiAgdGhpcy4kZW1pdCgnaG9vazppbml0JylcbiAgdGhpcy5faW5pdGVkID0gdHJ1ZVxuXG4gIC8vIHByb3h5IGRhdGEgYW5kIG1ldGhvZHNcbiAgLy8gb2JzZXJ2ZSBkYXRhIGFuZCBhZGQgdGhpcyB0byB2bXNcbiAgdGhpcy5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nID8gZGF0YSgpIDogZGF0YVxuICBpZiAobWVyZ2VkRGF0YSkge1xuICAgIGV4dGVuZCh0aGlzLl9kYXRhLCBtZXJnZWREYXRhKVxuICB9XG4gIGluaXRTdGF0ZSh0aGlzKVxuXG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIFwiY3JlYXRlZFwiIGxpZmVjeWNsZSBpbiBWbSgke3RoaXMuX3R5cGV9KWApXG4gIHRoaXMuJGVtaXQoJ2hvb2s6Y3JlYXRlZCcpXG4gIHRoaXMuX2NyZWF0ZWQgPSB0cnVlXG5cbiAgLy8gYmFja3dhcmQgb2xkIHJlYWR5IGVudHJ5XG4gIGlmIChvcHRpb25zLm1ldGhvZHMgJiYgb3B0aW9ucy5tZXRob2RzLnJlYWR5KSB7XG4gICAgY29uc29sZS53YXJuKCdcImV4cG9ydHMubWV0aG9kcy5yZWFkeVwiIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgJ3BsZWFzZSB1c2UgXCJleHBvcnRzLmNyZWF0ZWRcIiBpbnN0ZWFkJylcbiAgICBvcHRpb25zLm1ldGhvZHMucmVhZHkuY2FsbCh0aGlzKVxuICB9XG5cbiAgaWYgKCF0aGlzLl9hcHAuZG9jKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBpZiBubyBwYXJlbnRFbGVtZW50IHRoZW4gc3BlY2lmeSB0aGUgZG9jdW1lbnRFbGVtZW50XG4gIHRoaXMuX3BhcmVudEVsID0gcGFyZW50RWwgfHwgdGhpcy5fYXBwLmRvYy5kb2N1bWVudEVsZW1lbnRcbiAgYnVpbGQodGhpcylcbn1cblxubWl4aW5FdmVudHMoVm0ucHJvdG90eXBlKVxuXG4vKipcbiAqIFdhdGNoIGFuIGZ1bmN0aW9uIGFuZCBiaW5kIGFsbCB0aGUgZGF0YSBhcHBlYXJlZCBpbiBpdC4gV2hlbiB0aGUgcmVsYXRlZFxuICogZGF0YSBjaGFuZ2VzLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBuZXcgdmFsdWUgYXMgMXN0IHBhcmFtLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5WbS5wcm90b3R5cGUuJHdhdGNoID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykge1xuICB3YXRjaCh0aGlzLCBmbiwgY2FsbGJhY2spXG59XG5cblZtLnNldCA9IHNldFxuVm0uZGVsZXRlID0gZGVsXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmxldCBuYXRpdmVNb2R1bGVzID0ge31cblxuLy8gZm9yIHRlc3RpbmdcblxuLyoqXG4gKiBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlIChtb2R1bGVOYW1lKSB7XG4gIHJldHVybiBuYXRpdmVNb2R1bGVzW21vZHVsZU5hbWVdXG59XG5cbi8qKlxuICogZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyTW9kdWxlcyAoKSB7XG4gIG5hdGl2ZU1vZHVsZXMgPSB7fVxufVxuXG4vLyBmb3IgZnJhbWV3b3JrXG5cbi8qKlxuICogaW5pdCBtb2R1bGVzIGZvciBhbiBhcHAgaW5zdGFuY2VcbiAqIHRoZSBzZWNvbmQgcGFyYW0gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHJlcGxhY2UgYW4gZXhpc3RlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRNb2R1bGVzIChtb2R1bGVzLCBpZlJlcGxhY2UpIHtcbiAgZm9yIChjb25zdCBtb2R1bGVOYW1lIGluIG1vZHVsZXMpIHtcbiAgICAvLyBpbml0IGBtb2R1bGVzW21vZHVsZU5hbWVdW11gXG4gICAgbGV0IG1ldGhvZHMgPSBuYXRpdmVNb2R1bGVzW21vZHVsZU5hbWVdXG4gICAgaWYgKCFtZXRob2RzKSB7XG4gICAgICBtZXRob2RzID0ge31cbiAgICAgIG5hdGl2ZU1vZHVsZXNbbW9kdWxlTmFtZV0gPSBtZXRob2RzXG4gICAgfVxuXG4gICAgLy8gcHVzaCBlYWNoIG5vbi1leGlzdGVkIG5ldyBtZXRob2RcbiAgICBtb2R1bGVzW21vZHVsZU5hbWVdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGhvZCA9IHtcbiAgICAgICAgICBuYW1lOiBtZXRob2RcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW1ldGhvZHNbbWV0aG9kLm5hbWVdIHx8IGlmUmVwbGFjZSkge1xuICAgICAgICBtZXRob2RzW21ldGhvZC5uYW1lXSA9IG1ldGhvZFxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBpbml0IGFwcCBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TWV0aG9kcyAoVm0sIGFwaXMpIHtcbiAgY29uc3QgcCA9IFZtLnByb3RvdHlwZVxuXG4gIGZvciAoY29uc3QgYXBpTmFtZSBpbiBhcGlzKSB7XG4gICAgaWYgKCFwLmhhc093blByb3BlcnR5KGFwaU5hbWUpKSB7XG4gICAgICBwW2FwaU5hbWVdID0gYXBpc1thcGlOYW1lXVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIGdldCBhIG1vZHVsZSBvZiBtZXRob2RzIGZvciBhbiBhcHAgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVNb2R1bGUgKGFwcCwgbmFtZSkge1xuICBjb25zdCBtZXRob2RzID0gbmF0aXZlTW9kdWxlc1tuYW1lXVxuICBjb25zdCB0YXJnZXQgPSB7fVxuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gbWV0aG9kcykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIG1vZHVsZUdldHRlciAoKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gYXBwLmNhbGxUYXNrcyh7XG4gICAgICAgICAgbW9kdWxlOiBuYW1lLFxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICBhcmdzOiBhcmdzXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBtb2R1bGVTZXR0ZXIgKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gYXBwLmNhbGxUYXNrcyh7XG4gICAgICAgICAgICBtb2R1bGU6IG5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgICBhcmdzOiBbdmFsdWVdXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuXG4vKipcbiAqIGdldCBhIGN1c3RvbSBjb21wb25lbnQgb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUN1c3RvbUNvbXBvbmVudCAoYXBwLCBuYW1lKSB7XG4gIGNvbnN0IHsgY3VzdG9tQ29tcG9uZW50TWFwIH0gPSBhcHBcbiAgcmV0dXJuIGN1c3RvbUNvbXBvbmVudE1hcFtuYW1lXVxufVxuXG4vKipcbiAqIHJlZ2lzdGVyIGEgY3VzdG9tIGNvbXBvbmVudCBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckN1c3RvbUNvbXBvbmVudCAoYXBwLCBuYW1lLCBkZWYpIHtcbiAgY29uc3QgeyBjdXN0b21Db21wb25lbnRNYXAgfSA9IGFwcFxuXG4gIGlmIChjdXN0b21Db21wb25lbnRNYXBbbmFtZV0pIHtcbiAgICBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBkZWZpbmUgYSBjb21wb25lbnQoJHtuYW1lfSkgdGhhdCBhbHJlYWR5IGV4aXN0c2ApXG4gICAgcmV0dXJuXG4gIH1cblxuICBjdXN0b21Db21wb25lbnRNYXBbbmFtZV0gPSBkZWZcbn1cbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IFNlbVZlcjtcblxuLy8gVGhlIGRlYnVnIGZ1bmN0aW9uIGlzIGV4Y2x1ZGVkIGVudGlyZWx5IGZyb20gdGhlIG1pbmlmaWVkIHZlcnNpb24uXG4vKiBub21pbiAqLyB2YXIgZGVidWc7XG4vKiBub21pbiAqLyBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gICAgLyogbm9taW4gKi8gcHJvY2Vzcy5lbnYgJiZcbiAgICAvKiBub21pbiAqLyBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gICAgLyogbm9taW4gKi8gL1xcYnNlbXZlclxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykpXG4gIC8qIG5vbWluICovIGRlYnVnID0gZnVuY3Rpb24oKSB7XG4gICAgLyogbm9taW4gKi8gdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgIC8qIG5vbWluICovIGFyZ3MudW5zaGlmdCgnU0VNVkVSJyk7XG4gICAgLyogbm9taW4gKi8gY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJncyk7XG4gICAgLyogbm9taW4gKi8gfTtcbi8qIG5vbWluICovIGVsc2VcbiAgLyogbm9taW4gKi8gZGVidWcgPSBmdW5jdGlvbigpIHt9O1xuXG4vLyBOb3RlOiB0aGlzIGlzIHRoZSBzZW12ZXIub3JnIHZlcnNpb24gb2YgdGhlIHNwZWMgdGhhdCBpdCBpbXBsZW1lbnRzXG4vLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG5leHBvcnRzLlNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnO1xuXG52YXIgTUFYX0xFTkdUSCA9IDI1NjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgOTAwNzE5OTI1NDc0MDk5MTtcblxuLy8gVGhlIGFjdHVhbCByZWdleHBzIGdvIG9uIGV4cG9ydHMucmVcbnZhciByZSA9IGV4cG9ydHMucmUgPSBbXTtcbnZhciBzcmMgPSBleHBvcnRzLnNyYyA9IFtdO1xudmFyIFIgPSAwO1xuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG52YXIgTlVNRVJJQ0lERU5USUZJRVIgPSBSKys7XG5zcmNbTlVNRVJJQ0lERU5USUZJRVJdID0gJzB8WzEtOV1cXFxcZConO1xudmFyIE5VTUVSSUNJREVOVElGSUVSTE9PU0UgPSBSKys7XG5zcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gPSAnWzAtOV0rJztcblxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG52YXIgTk9OTlVNRVJJQ0lERU5USUZJRVIgPSBSKys7XG5zcmNbTk9OTlVNRVJJQ0lERU5USUZJRVJdID0gJ1xcXFxkKlthLXpBLVotXVthLXpBLVowLTktXSonO1xuXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG52YXIgTUFJTlZFUlNJT04gPSBSKys7XG5zcmNbTUFJTlZFUlNJT05dID0gJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSXSArICcpXFxcXC4nICtcbiAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1tOVU1FUklDSURFTlRJRklFUl0gKyAnKSc7XG5cbnZhciBNQUlOVkVSU0lPTkxPT1NFID0gUisrO1xuc3JjW01BSU5WRVJTSU9OTE9PU0VdID0gJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJyknO1xuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG5cbnZhciBQUkVSRUxFQVNFSURFTlRJRklFUiA9IFIrKztcbnNyY1tQUkVSRUxFQVNFSURFTlRJRklFUl0gPSAnKD86JyArIHNyY1tOVU1FUklDSURFTlRJRklFUl0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8JyArIHNyY1tOT05OVU1FUklDSURFTlRJRklFUl0gKyAnKSc7XG5cbnZhciBQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFID0gUisrO1xuc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdID0gJyg/OicgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnICsgc3JjW05PTk5VTUVSSUNJREVOVElGSUVSXSArICcpJztcblxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uXG4vLyBIeXBoZW4sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRvdC1zZXBhcmF0ZWQgcHJlLXJlbGVhc2UgdmVyc2lvblxuLy8gaWRlbnRpZmllcnMuXG5cbnZhciBQUkVSRUxFQVNFID0gUisrO1xuc3JjW1BSRVJFTEVBU0VdID0gJyg/Oi0oJyArIHNyY1tQUkVSRUxFQVNFSURFTlRJRklFUl0gK1xuICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuJyArIHNyY1tQUkVSRUxFQVNFSURFTlRJRklFUl0gKyAnKSopKSc7XG5cbnZhciBQUkVSRUxFQVNFTE9PU0UgPSBSKys7XG5zcmNbUFJFUkVMRUFTRUxPT1NFXSA9ICcoPzotPygnICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdICtcbiAgICAgICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuJyArIHNyY1tQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXSArICcpKikpJztcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxudmFyIEJVSUxESURFTlRJRklFUiA9IFIrKztcbnNyY1tCVUlMRElERU5USUZJRVJdID0gJ1swLTlBLVphLXotXSsnO1xuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxudmFyIEJVSUxEID0gUisrO1xuc3JjW0JVSUxEXSA9ICcoPzpcXFxcKygnICsgc3JjW0JVSUxESURFTlRJRklFUl0gK1xuICAgICAgICAgICAgICcoPzpcXFxcLicgKyBzcmNbQlVJTERJREVOVElGSUVSXSArICcpKikpJztcblxuXG4vLyAjIyBGdWxsIFZlcnNpb24gU3RyaW5nXG4vLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4vLyBidWlsZCBtZXRhZGF0YS5cblxuLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuLy8gdGhlIHZlcnNpb24gc3RyaW5nIGFyZSBjYXB0dXJpbmcgZ3JvdXBzLiAgVGhlIGJ1aWxkIG1ldGFkYXRhIGlzIG5vdCBhXG4vLyBjYXB0dXJpbmcgZ3JvdXAsIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBldmVyIGJlIHVzZWQgaW4gdmVyc2lvblxuLy8gY29tcGFyaXNvbi5cblxudmFyIEZVTEwgPSBSKys7XG52YXIgRlVMTFBMQUlOID0gJ3Y/JyArIHNyY1tNQUlOVkVSU0lPTl0gK1xuICAgICAgICAgICAgICAgIHNyY1tQUkVSRUxFQVNFXSArICc/JyArXG4gICAgICAgICAgICAgICAgc3JjW0JVSUxEXSArICc/Jztcblxuc3JjW0ZVTExdID0gJ14nICsgRlVMTFBMQUlOICsgJyQnO1xuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG52YXIgTE9PU0VQTEFJTiA9ICdbdj1cXFxcc10qJyArIHNyY1tNQUlOVkVSU0lPTkxPT1NFXSArXG4gICAgICAgICAgICAgICAgIHNyY1tQUkVSRUxFQVNFTE9PU0VdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgc3JjW0JVSUxEXSArICc/JztcblxudmFyIExPT1NFID0gUisrO1xuc3JjW0xPT1NFXSA9ICdeJyArIExPT1NFUExBSU4gKyAnJCc7XG5cbnZhciBHVExUID0gUisrO1xuc3JjW0dUTFRdID0gJygoPzo8fD4pPz0/KSc7XG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbnZhciBYUkFOR0VJREVOVElGSUVSTE9PU0UgPSBSKys7XG5zcmNbWFJBTkdFSURFTlRJRklFUkxPT1NFXSA9IHNyY1tOVU1FUklDSURFTlRJRklFUkxPT1NFXSArICd8eHxYfFxcXFwqJztcbnZhciBYUkFOR0VJREVOVElGSUVSID0gUisrO1xuc3JjW1hSQU5HRUlERU5USUZJRVJdID0gc3JjW05VTUVSSUNJREVOVElGSUVSXSArICd8eHxYfFxcXFwqJztcblxudmFyIFhSQU5HRVBMQUlOID0gUisrO1xuc3JjW1hSQU5HRVBMQUlOXSA9ICdbdj1cXFxcc10qKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUl0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICcoPzpcXFxcLignICsgc3JjW1hSQU5HRUlERU5USUZJRVJdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4oJyArIHNyY1tYUkFOR0VJREVOVElGSUVSXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJyg/OicgKyBzcmNbUFJFUkVMRUFTRV0gKyAnKT8nICtcbiAgICAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgICAnKT8pPyc7XG5cbnZhciBYUkFOR0VQTEFJTkxPT1NFID0gUisrO1xuc3JjW1hSQU5HRVBMQUlOTE9PU0VdID0gJ1t2PVxcXFxzXSooJyArIHNyY1tYUkFOR0VJREVOVElGSUVSTE9PU0VdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoPzpcXFxcLignICsgc3JjW1hSQU5HRUlERU5USUZJRVJMT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKD86JyArIHNyY1tQUkVSRUxFQVNFTE9PU0VdICsgJyk/JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcpPyk/JztcblxudmFyIFhSQU5HRSA9IFIrKztcbnNyY1tYUkFOR0VdID0gJ14nICsgc3JjW0dUTFRdICsgJ1xcXFxzKicgKyBzcmNbWFJBTkdFUExBSU5dICsgJyQnO1xudmFyIFhSQU5HRUxPT1NFID0gUisrO1xuc3JjW1hSQU5HRUxPT1NFXSA9ICdeJyArIHNyY1tHVExUXSArICdcXFxccyonICsgc3JjW1hSQU5HRVBMQUlOTE9PU0VdICsgJyQnO1xuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxudmFyIExPTkVUSUxERSA9IFIrKztcbnNyY1tMT05FVElMREVdID0gJyg/On4+PyknO1xuXG52YXIgVElMREVUUklNID0gUisrO1xuc3JjW1RJTERFVFJJTV0gPSAnKFxcXFxzKiknICsgc3JjW0xPTkVUSUxERV0gKyAnXFxcXHMrJztcbnJlW1RJTERFVFJJTV0gPSBuZXcgUmVnRXhwKHNyY1tUSUxERVRSSU1dLCAnZycpO1xudmFyIHRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+JztcblxudmFyIFRJTERFID0gUisrO1xuc3JjW1RJTERFXSA9ICdeJyArIHNyY1tMT05FVElMREVdICsgc3JjW1hSQU5HRVBMQUlOXSArICckJztcbnZhciBUSUxERUxPT1NFID0gUisrO1xuc3JjW1RJTERFTE9PU0VdID0gJ14nICsgc3JjW0xPTkVUSUxERV0gKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnJCc7XG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG52YXIgTE9ORUNBUkVUID0gUisrO1xuc3JjW0xPTkVDQVJFVF0gPSAnKD86XFxcXF4pJztcblxudmFyIENBUkVUVFJJTSA9IFIrKztcbnNyY1tDQVJFVFRSSU1dID0gJyhcXFxccyopJyArIHNyY1tMT05FQ0FSRVRdICsgJ1xcXFxzKyc7XG5yZVtDQVJFVFRSSU1dID0gbmV3IFJlZ0V4cChzcmNbQ0FSRVRUUklNXSwgJ2cnKTtcbnZhciBjYXJldFRyaW1SZXBsYWNlID0gJyQxXic7XG5cbnZhciBDQVJFVCA9IFIrKztcbnNyY1tDQVJFVF0gPSAnXicgKyBzcmNbTE9ORUNBUkVUXSArIHNyY1tYUkFOR0VQTEFJTl0gKyAnJCc7XG52YXIgQ0FSRVRMT09TRSA9IFIrKztcbnNyY1tDQVJFVExPT1NFXSA9ICdeJyArIHNyY1tMT05FQ0FSRVRdICsgc3JjW1hSQU5HRVBMQUlOTE9PU0VdICsgJyQnO1xuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxudmFyIENPTVBBUkFUT1JMT09TRSA9IFIrKztcbnNyY1tDT01QQVJBVE9STE9PU0VdID0gJ14nICsgc3JjW0dUTFRdICsgJ1xcXFxzKignICsgTE9PU0VQTEFJTiArICcpJHxeJCc7XG52YXIgQ09NUEFSQVRPUiA9IFIrKztcbnNyY1tDT01QQVJBVE9SXSA9ICdeJyArIHNyY1tHVExUXSArICdcXFxccyooJyArIEZVTExQTEFJTiArICcpJHxeJCc7XG5cblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbnZhciBDT01QQVJBVE9SVFJJTSA9IFIrKztcbnNyY1tDT01QQVJBVE9SVFJJTV0gPSAnKFxcXFxzKiknICsgc3JjW0dUTFRdICtcbiAgICAgICAgICAgICAgICAgICAgICAnXFxcXHMqKCcgKyBMT09TRVBMQUlOICsgJ3wnICsgc3JjW1hSQU5HRVBMQUlOXSArICcpJztcblxuLy8gdGhpcyBvbmUgaGFzIHRvIHVzZSB0aGUgL2cgZmxhZ1xucmVbQ09NUEFSQVRPUlRSSU1dID0gbmV3IFJlZ0V4cChzcmNbQ09NUEFSQVRPUlRSSU1dLCAnZycpO1xudmFyIGNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnO1xuXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG52YXIgSFlQSEVOUkFOR0UgPSBSKys7XG5zcmNbSFlQSEVOUkFOR0VdID0gJ15cXFxccyooJyArIHNyY1tYUkFOR0VQTEFJTl0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICdcXFxccystXFxcXHMrJyArXG4gICAgICAgICAgICAgICAgICAgJygnICsgc3JjW1hSQU5HRVBMQUlOXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJ1xcXFxzKiQnO1xuXG52YXIgSFlQSEVOUkFOR0VMT09TRSA9IFIrKztcbnNyY1tIWVBIRU5SQU5HRUxPT1NFXSA9ICdeXFxcXHMqKCcgKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFxzKy1cXFxccysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1tYUkFOR0VQTEFJTkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxcXHMqJCc7XG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbnZhciBTVEFSID0gUisrO1xuc3JjW1NUQVJdID0gJyg8fD4pPz0/XFxcXHMqXFxcXConO1xuXG4vLyBDb21waWxlIHRvIGFjdHVhbCByZWdleHAgb2JqZWN0cy5cbi8vIEFsbCBhcmUgZmxhZy1mcmVlLCB1bmxlc3MgdGhleSB3ZXJlIGNyZWF0ZWQgYWJvdmUgd2l0aCBhIGZsYWcuXG5mb3IgKHZhciBpID0gMDsgaSA8IFI7IGkrKykge1xuICBkZWJ1ZyhpLCBzcmNbaV0pO1xuICBpZiAoIXJlW2ldKVxuICAgIHJlW2ldID0gbmV3IFJlZ0V4cChzcmNbaV0pO1xufVxuXG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5mdW5jdGlvbiBwYXJzZSh2ZXJzaW9uLCBsb29zZSkge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcilcbiAgICByZXR1cm4gdmVyc2lvbjtcblxuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmICh2ZXJzaW9uLmxlbmd0aCA+IE1BWF9MRU5HVEgpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHIgPSBsb29zZSA/IHJlW0xPT1NFXSA6IHJlW0ZVTExdO1xuICBpZiAoIXIudGVzdCh2ZXJzaW9uKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIGxvb3NlKTtcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnRzLnZhbGlkID0gdmFsaWQ7XG5mdW5jdGlvbiB2YWxpZCh2ZXJzaW9uLCBsb29zZSkge1xuICB2YXIgdiA9IHBhcnNlKHZlcnNpb24sIGxvb3NlKTtcbiAgcmV0dXJuIHYgPyB2LnZlcnNpb24gOiBudWxsO1xufVxuXG5cbmV4cG9ydHMuY2xlYW4gPSBjbGVhbjtcbmZ1bmN0aW9uIGNsZWFuKHZlcnNpb24sIGxvb3NlKSB7XG4gIHZhciBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBsb29zZSk7XG4gIHJldHVybiBzID8gcy52ZXJzaW9uIDogbnVsbDtcbn1cblxuZXhwb3J0cy5TZW1WZXIgPSBTZW1WZXI7XG5cbmZ1bmN0aW9uIFNlbVZlcih2ZXJzaW9uLCBsb29zZSkge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSBsb29zZSlcbiAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIGVsc2VcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb247XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBWZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJyArIE1BWF9MRU5HVEggKyAnIGNoYXJhY3RlcnMnKVxuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZW1WZXIpKVxuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIGxvb3NlKTtcblxuICBkZWJ1ZygnU2VtVmVyJywgdmVyc2lvbiwgbG9vc2UpO1xuICB0aGlzLmxvb3NlID0gbG9vc2U7XG4gIHZhciBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gobG9vc2UgPyByZVtMT09TRV0gOiByZVtGVUxMXSk7XG5cbiAgaWYgKCFtKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgVmVyc2lvbjogJyArIHZlcnNpb24pO1xuXG4gIHRoaXMucmF3ID0gdmVyc2lvbjtcblxuICAvLyB0aGVzZSBhcmUgYWN0dWFsbHkgbnVtYmVyc1xuICB0aGlzLm1ham9yID0gK21bMV07XG4gIHRoaXMubWlub3IgPSArbVsyXTtcbiAgdGhpcy5wYXRjaCA9ICttWzNdO1xuXG4gIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1ham9yIHZlcnNpb24nKVxuXG4gIGlmICh0aGlzLm1pbm9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1pbm9yIDwgMClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuXG4gIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuXG4gIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICBpZiAoIW1bNF0pXG4gICAgdGhpcy5wcmVyZWxlYXNlID0gW107XG4gIGVsc2VcbiAgICB0aGlzLnByZXJlbGVhc2UgPSBtWzRdLnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uKGlkKSB7XG4gICAgICBpZiAoL15bMC05XSskLy50ZXN0KGlkKSkge1xuICAgICAgICB2YXIgbnVtID0gK2lkO1xuICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgICByZXR1cm4gbnVtO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pO1xuXG4gIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW107XG4gIHRoaXMuZm9ybWF0KCk7XG59XG5cblNlbVZlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMudmVyc2lvbiA9IHRoaXMubWFqb3IgKyAnLicgKyB0aGlzLm1pbm9yICsgJy4nICsgdGhpcy5wYXRjaDtcbiAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGgpXG4gICAgdGhpcy52ZXJzaW9uICs9ICctJyArIHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJyk7XG4gIHJldHVybiB0aGlzLnZlcnNpb247XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZlcnNpb247XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbihvdGhlcikge1xuICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMubG9vc2UsIG90aGVyKTtcbiAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKVxuICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5sb29zZSk7XG5cbiAgcmV0dXJuIHRoaXMuY29tcGFyZU1haW4ob3RoZXIpIHx8IHRoaXMuY29tcGFyZVByZShvdGhlcik7XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLmNvbXBhcmVNYWluID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKVxuICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5sb29zZSk7XG5cbiAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1ham9yLCBvdGhlci5tYWpvcikgfHxcbiAgICAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1pbm9yLCBvdGhlci5taW5vcikgfHxcbiAgICAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnBhdGNoLCBvdGhlci5wYXRjaCk7XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLmNvbXBhcmVQcmUgPSBmdW5jdGlvbihvdGhlcikge1xuICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpXG4gICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLmxvb3NlKTtcblxuICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKVxuICAgIHJldHVybiAtMTtcbiAgZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpXG4gICAgcmV0dXJuIDE7XG4gIGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aClcbiAgICByZXR1cm4gMDtcblxuICB2YXIgaSA9IDA7XG4gIGRvIHtcbiAgICB2YXIgYSA9IHRoaXMucHJlcmVsZWFzZVtpXTtcbiAgICB2YXIgYiA9IG90aGVyLnByZXJlbGVhc2VbaV07XG4gICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpO1xuICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGVsc2UgaWYgKGEgPT09IGIpXG4gICAgICBjb250aW51ZTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpO1xuICB9IHdoaWxlICgrK2kpO1xufTtcblxuLy8gcHJlbWlub3Igd2lsbCBidW1wIHRoZSB2ZXJzaW9uIHVwIHRvIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UsIGFuZCBpbW1lZGlhdGVseVxuLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuU2VtVmVyLnByb3RvdHlwZS5pbmMgPSBmdW5jdGlvbihyZWxlYXNlLCBpZGVudGlmaWVyKSB7XG4gIHN3aXRjaCAocmVsZWFzZSkge1xuICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5wYXRjaCA9IDA7XG4gICAgICB0aGlzLm1pbm9yID0gMDtcbiAgICAgIHRoaXMubWFqb3IrKztcbiAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5wYXRjaCA9IDA7XG4gICAgICB0aGlzLm1pbm9yKys7XG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcik7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwcmVwYXRjaCc6XG4gICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgIC8vIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQuXG4gICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgLy8gcHJlcGF0Y2guXG4gICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllcik7XG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcik7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21ham9yJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICBpZiAodGhpcy5taW5vciAhPT0gMCB8fCB0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApXG4gICAgICAgIHRoaXMubWFqb3IrKztcbiAgICAgIHRoaXMubWlub3IgPSAwO1xuICAgICAgdGhpcy5wYXRjaCA9IDA7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKVxuICAgICAgICB0aGlzLm1pbm9yKys7XG4gICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGF0Y2gnOlxuICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhpcy5wYXRjaCsrO1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW107XG4gICAgICBicmVhaztcbiAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgIC8vIDEuMC4wIFwicHJlXCIgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICBjYXNlICdwcmUnOlxuICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFswXTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGg7XG4gICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKys7XG4gICAgICAgICAgICBpID0gLTI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSAtMSkgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKDApO1xuICAgICAgfVxuICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgLy8gMS4yLjAtYmV0YS5mb29ibHogb3IgMS4yLjAtYmV0YSBidW1wcyB0byAxLjIuMC1iZXRhLjBcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZVswXSA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIDBdO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgMF07XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAnICsgcmVsZWFzZSk7XG4gIH1cbiAgdGhpcy5mb3JtYXQoKTtcbiAgdGhpcy5yYXcgPSB0aGlzLnZlcnNpb247XG4gIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0cy5pbmMgPSBpbmM7XG5mdW5jdGlvbiBpbmModmVyc2lvbiwgcmVsZWFzZSwgbG9vc2UsIGlkZW50aWZpZXIpIHtcbiAgaWYgKHR5cGVvZihsb29zZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWRlbnRpZmllciA9IGxvb3NlO1xuICAgIGxvb3NlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBsb29zZSkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIpLnZlcnNpb247XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0cy5kaWZmID0gZGlmZjtcbmZ1bmN0aW9uIGRpZmYodmVyc2lvbjEsIHZlcnNpb24yKSB7XG4gIGlmIChlcSh2ZXJzaW9uMSwgdmVyc2lvbjIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHYxID0gcGFyc2UodmVyc2lvbjEpO1xuICAgIHZhciB2MiA9IHBhcnNlKHZlcnNpb24yKTtcbiAgICBpZiAodjEucHJlcmVsZWFzZS5sZW5ndGggfHwgdjIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2MSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnbWFqb3InIHx8IGtleSA9PT0gJ21pbm9yJyB8fCBrZXkgPT09ICdwYXRjaCcpIHtcbiAgICAgICAgICBpZiAodjFba2V5XSAhPT0gdjJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuICdwcmUnK2tleTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAncHJlcmVsZWFzZSc7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiB2MSkge1xuICAgICAgaWYgKGtleSA9PT0gJ21ham9yJyB8fCBrZXkgPT09ICdtaW5vcicgfHwga2V5ID09PSAncGF0Y2gnKSB7XG4gICAgICAgIGlmICh2MVtrZXldICE9PSB2MltrZXldKSB7XG4gICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLmNvbXBhcmVJZGVudGlmaWVycyA9IGNvbXBhcmVJZGVudGlmaWVycztcblxudmFyIG51bWVyaWMgPSAvXlswLTldKyQvO1xuZnVuY3Rpb24gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpIHtcbiAgdmFyIGFudW0gPSBudW1lcmljLnRlc3QoYSk7XG4gIHZhciBibnVtID0gbnVtZXJpYy50ZXN0KGIpO1xuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2E7XG4gICAgYiA9ICtiO1xuICB9XG5cbiAgcmV0dXJuIChhbnVtICYmICFibnVtKSA/IC0xIDpcbiAgICAgICAgIChibnVtICYmICFhbnVtKSA/IDEgOlxuICAgICAgICAgYSA8IGIgPyAtMSA6XG4gICAgICAgICBhID4gYiA/IDEgOlxuICAgICAgICAgMDtcbn1cblxuZXhwb3J0cy5yY29tcGFyZUlkZW50aWZpZXJzID0gcmNvbXBhcmVJZGVudGlmaWVycztcbmZ1bmN0aW9uIHJjb21wYXJlSWRlbnRpZmllcnMoYSwgYikge1xuICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGIsIGEpO1xufVxuXG5leHBvcnRzLm1ham9yID0gbWFqb3I7XG5mdW5jdGlvbiBtYWpvcihhLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3I7XG59XG5cbmV4cG9ydHMubWlub3IgPSBtaW5vcjtcbmZ1bmN0aW9uIG1pbm9yKGEsIGxvb3NlKSB7XG4gIHJldHVybiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vcjtcbn1cblxuZXhwb3J0cy5wYXRjaCA9IHBhdGNoO1xuZnVuY3Rpb24gcGF0Y2goYSwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoO1xufVxuXG5leHBvcnRzLmNvbXBhcmUgPSBjb21wYXJlO1xuZnVuY3Rpb24gY29tcGFyZShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSk7XG59XG5cbmV4cG9ydHMuY29tcGFyZUxvb3NlID0gY29tcGFyZUxvb3NlO1xuZnVuY3Rpb24gY29tcGFyZUxvb3NlKGEsIGIpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgdHJ1ZSk7XG59XG5cbmV4cG9ydHMucmNvbXBhcmUgPSByY29tcGFyZTtcbmZ1bmN0aW9uIHJjb21wYXJlKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGIsIGEsIGxvb3NlKTtcbn1cblxuZXhwb3J0cy5zb3J0ID0gc29ydDtcbmZ1bmN0aW9uIHNvcnQobGlzdCwgbG9vc2UpIHtcbiAgcmV0dXJuIGxpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY29tcGFyZShhLCBiLCBsb29zZSk7XG4gIH0pO1xufVxuXG5leHBvcnRzLnJzb3J0ID0gcnNvcnQ7XG5mdW5jdGlvbiByc29ydChsaXN0LCBsb29zZSkge1xuICByZXR1cm4gbGlzdC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5yY29tcGFyZShhLCBiLCBsb29zZSk7XG4gIH0pO1xufVxuXG5leHBvcnRzLmd0ID0gZ3Q7XG5mdW5jdGlvbiBndChhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPiAwO1xufVxuXG5leHBvcnRzLmx0ID0gbHQ7XG5mdW5jdGlvbiBsdChhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPCAwO1xufVxuXG5leHBvcnRzLmVxID0gZXE7XG5mdW5jdGlvbiBlcShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDA7XG59XG5cbmV4cG9ydHMubmVxID0gbmVxO1xuZnVuY3Rpb24gbmVxKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMDtcbn1cblxuZXhwb3J0cy5ndGUgPSBndGU7XG5mdW5jdGlvbiBndGUoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDA7XG59XG5cbmV4cG9ydHMubHRlID0gbHRlO1xuZnVuY3Rpb24gbHRlKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8PSAwO1xufVxuXG5leHBvcnRzLmNtcCA9IGNtcDtcbmZ1bmN0aW9uIGNtcChhLCBvcCwgYiwgbG9vc2UpIHtcbiAgdmFyIHJldDtcbiAgc3dpdGNoIChvcCkge1xuICAgIGNhc2UgJz09PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSBhID0gYS52ZXJzaW9uO1xuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0JykgYiA9IGIudmVyc2lvbjtcbiAgICAgIHJldCA9IGEgPT09IGI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICchPT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JykgYSA9IGEudmVyc2lvbjtcbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIGIgPSBiLnZlcnNpb247XG4gICAgICByZXQgPSBhICE9PSBiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnJzogY2FzZSAnPSc6IGNhc2UgJz09JzogcmV0ID0gZXEoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBjYXNlICchPSc6IHJldCA9IG5lcShhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGNhc2UgJz4nOiByZXQgPSBndChhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGNhc2UgJz49JzogcmV0ID0gZ3RlKGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgY2FzZSAnPCc6IHJldCA9IGx0KGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgY2FzZSAnPD0nOiByZXQgPSBsdGUoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG9wZXJhdG9yOiAnICsgb3ApO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydHMuQ29tcGFyYXRvciA9IENvbXBhcmF0b3I7XG5mdW5jdGlvbiBDb21wYXJhdG9yKGNvbXAsIGxvb3NlKSB7XG4gIGlmIChjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgIGlmIChjb21wLmxvb3NlID09PSBsb29zZSlcbiAgICAgIHJldHVybiBjb21wO1xuICAgIGVsc2VcbiAgICAgIGNvbXAgPSBjb21wLnZhbHVlO1xuICB9XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKVxuICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcihjb21wLCBsb29zZSk7XG5cbiAgZGVidWcoJ2NvbXBhcmF0b3InLCBjb21wLCBsb29zZSk7XG4gIHRoaXMubG9vc2UgPSBsb29zZTtcbiAgdGhpcy5wYXJzZShjb21wKTtcblxuICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSlcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIGVsc2VcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5vcGVyYXRvciArIHRoaXMuc2VtdmVyLnZlcnNpb247XG5cbiAgZGVidWcoJ2NvbXAnLCB0aGlzKTtcbn1cblxudmFyIEFOWSA9IHt9O1xuQ29tcGFyYXRvci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihjb21wKSB7XG4gIHZhciByID0gdGhpcy5sb29zZSA/IHJlW0NPTVBBUkFUT1JMT09TRV0gOiByZVtDT01QQVJBVE9SXTtcbiAgdmFyIG0gPSBjb21wLm1hdGNoKHIpO1xuXG4gIGlmICghbSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNvbXBhcmF0b3I6ICcgKyBjb21wKTtcblxuICB0aGlzLm9wZXJhdG9yID0gbVsxXTtcbiAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICc9JylcbiAgICB0aGlzLm9wZXJhdG9yID0gJyc7XG5cbiAgLy8gaWYgaXQgbGl0ZXJhbGx5IGlzIGp1c3QgJz4nIG9yICcnIHRoZW4gYWxsb3cgYW55dGhpbmcuXG4gIGlmICghbVsyXSlcbiAgICB0aGlzLnNlbXZlciA9IEFOWTtcbiAgZWxzZVxuICAgIHRoaXMuc2VtdmVyID0gbmV3IFNlbVZlcihtWzJdLCB0aGlzLmxvb3NlKTtcbn07XG5cbkNvbXBhcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlO1xufTtcblxuQ29tcGFyYXRvci5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uKHZlcnNpb24pIHtcbiAgZGVidWcoJ0NvbXBhcmF0b3IudGVzdCcsIHZlcnNpb24sIHRoaXMubG9vc2UpO1xuXG4gIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpXG4gICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5sb29zZSk7XG5cbiAgcmV0dXJuIGNtcCh2ZXJzaW9uLCB0aGlzLm9wZXJhdG9yLCB0aGlzLnNlbXZlciwgdGhpcy5sb29zZSk7XG59O1xuXG5Db21wYXJhdG9yLnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24oY29tcCwgbG9vc2UpIHtcbiAgaWYgKCEoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBDb21wYXJhdG9yIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICB2YXIgcmFuZ2VUbXA7XG5cbiAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgcmFuZ2VUbXAgPSBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgbG9vc2UpO1xuICAgIHJldHVybiBzYXRpc2ZpZXModGhpcy52YWx1ZSwgcmFuZ2VUbXAsIGxvb3NlKTtcbiAgfSBlbHNlIGlmIChjb21wLm9wZXJhdG9yID09PSAnJykge1xuICAgIHJhbmdlVG1wID0gbmV3IFJhbmdlKHRoaXMudmFsdWUsIGxvb3NlKTtcbiAgICByZXR1cm4gc2F0aXNmaWVzKGNvbXAuc2VtdmVyLCByYW5nZVRtcCwgbG9vc2UpO1xuICB9XG5cbiAgdmFyIHNhbWVEaXJlY3Rpb25JbmNyZWFzaW5nID1cbiAgICAodGhpcy5vcGVyYXRvciA9PT0gJz49JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPicpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc+PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJz4nKTtcbiAgdmFyIHNhbWVEaXJlY3Rpb25EZWNyZWFzaW5nID1cbiAgICAodGhpcy5vcGVyYXRvciA9PT0gJzw9JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPCcpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc8PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJzwnKTtcbiAgdmFyIHNhbWVTZW1WZXIgPSB0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uO1xuICB2YXIgZGlmZmVyZW50RGlyZWN0aW9uc0luY2x1c2l2ZSA9XG4gICAgKHRoaXMub3BlcmF0b3IgPT09ICc+PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJzw9JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJz49JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPD0nKTtcbiAgdmFyIG9wcG9zaXRlRGlyZWN0aW9uc0xlc3NUaGFuID1cbiAgICBjbXAodGhpcy5zZW12ZXIsICc8JywgY29tcC5zZW12ZXIsIGxvb3NlKSAmJlxuICAgICgodGhpcy5vcGVyYXRvciA9PT0gJz49JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPicpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc8PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJzwnKSk7XG4gIHZhciBvcHBvc2l0ZURpcmVjdGlvbnNHcmVhdGVyVGhhbiA9XG4gICAgY21wKHRoaXMuc2VtdmVyLCAnPicsIGNvbXAuc2VtdmVyLCBsb29zZSkgJiZcbiAgICAoKHRoaXMub3BlcmF0b3IgPT09ICc8PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJzwnKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPj0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc+JykpO1xuXG4gIHJldHVybiBzYW1lRGlyZWN0aW9uSW5jcmVhc2luZyB8fCBzYW1lRGlyZWN0aW9uRGVjcmVhc2luZyB8fFxuICAgIChzYW1lU2VtVmVyICYmIGRpZmZlcmVudERpcmVjdGlvbnNJbmNsdXNpdmUpIHx8XG4gICAgb3Bwb3NpdGVEaXJlY3Rpb25zTGVzc1RoYW4gfHwgb3Bwb3NpdGVEaXJlY3Rpb25zR3JlYXRlclRoYW47XG59O1xuXG5cbmV4cG9ydHMuUmFuZ2UgPSBSYW5nZTtcbmZ1bmN0aW9uIFJhbmdlKHJhbmdlLCBsb29zZSkge1xuICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgIGlmIChyYW5nZS5sb29zZSA9PT0gbG9vc2UpIHtcbiAgICAgIHJldHVybiByYW5nZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5yYXcsIGxvb3NlKTtcbiAgICB9XG4gIH1cblxuICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS52YWx1ZSwgbG9vc2UpO1xuICB9XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJhbmdlKSlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG5cbiAgdGhpcy5sb29zZSA9IGxvb3NlO1xuXG4gIC8vIEZpcnN0LCBzcGxpdCBiYXNlZCBvbiBib29sZWFuIG9yIHx8XG4gIHRoaXMucmF3ID0gcmFuZ2U7XG4gIHRoaXMuc2V0ID0gcmFuZ2Uuc3BsaXQoL1xccypcXHxcXHxcXHMqLykubWFwKGZ1bmN0aW9uKHJhbmdlKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VSYW5nZShyYW5nZS50cmltKCkpO1xuICB9LCB0aGlzKS5maWx0ZXIoZnVuY3Rpb24oYykge1xuICAgIC8vIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHJlbGV2YW50IGZvciB3aGF0ZXZlciByZWFzb25cbiAgICByZXR1cm4gYy5sZW5ndGg7XG4gIH0pO1xuXG4gIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBTZW1WZXIgUmFuZ2U6ICcgKyByYW5nZSk7XG4gIH1cblxuICB0aGlzLmZvcm1hdCgpO1xufVxuXG5SYW5nZS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmFuZ2UgPSB0aGlzLnNldC5tYXAoZnVuY3Rpb24oY29tcHMpIHtcbiAgICByZXR1cm4gY29tcHMuam9pbignICcpLnRyaW0oKTtcbiAgfSkuam9pbignfHwnKS50cmltKCk7XG4gIHJldHVybiB0aGlzLnJhbmdlO1xufTtcblxuUmFuZ2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnJhbmdlO1xufTtcblxuUmFuZ2UucHJvdG90eXBlLnBhcnNlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkge1xuICB2YXIgbG9vc2UgPSB0aGlzLmxvb3NlO1xuICByYW5nZSA9IHJhbmdlLnRyaW0oKTtcbiAgZGVidWcoJ3JhbmdlJywgcmFuZ2UsIGxvb3NlKTtcbiAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gIHZhciBociA9IGxvb3NlID8gcmVbSFlQSEVOUkFOR0VMT09TRV0gOiByZVtIWVBIRU5SQU5HRV07XG4gIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSk7XG4gIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKTtcbiAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVtDT01QQVJBVE9SVFJJTV0sIGNvbXBhcmF0b3JUcmltUmVwbGFjZSk7XG4gIGRlYnVnKCdjb21wYXJhdG9yIHRyaW0nLCByYW5nZSwgcmVbQ09NUEFSQVRPUlRSSU1dKTtcblxuICAvLyBgfiAxLjIuM2AgPT4gYH4xLjIuM2BcbiAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW1RJTERFVFJJTV0sIHRpbGRlVHJpbVJlcGxhY2UpO1xuXG4gIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSk7XG5cbiAgLy8gbm9ybWFsaXplIHNwYWNlc1xuICByYW5nZSA9IHJhbmdlLnNwbGl0KC9cXHMrLykuam9pbignICcpO1xuXG4gIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gIC8vIHJlYWR5IHRvIGJlIHNwbGl0IGludG8gY29tcGFyYXRvcnMuXG5cbiAgdmFyIGNvbXBSZSA9IGxvb3NlID8gcmVbQ09NUEFSQVRPUkxPT1NFXSA6IHJlW0NPTVBBUkFUT1JdO1xuICB2YXIgc2V0ID0gcmFuZ2Uuc3BsaXQoJyAnKS5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgbG9vc2UpO1xuICB9KS5qb2luKCcgJykuc3BsaXQoL1xccysvKTtcbiAgaWYgKHRoaXMubG9vc2UpIHtcbiAgICAvLyBpbiBsb29zZSBtb2RlLCB0aHJvdyBvdXQgYW55IHRoYXQgYXJlIG5vdCB2YWxpZCBjb21wYXJhdG9yc1xuICAgIHNldCA9IHNldC5maWx0ZXIoZnVuY3Rpb24oY29tcCkge1xuICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChjb21wUmUpO1xuICAgIH0pO1xuICB9XG4gIHNldCA9IHNldC5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcihjb21wLCBsb29zZSk7XG4gIH0pO1xuXG4gIHJldHVybiBzZXQ7XG59O1xuXG5SYW5nZS5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uKHJhbmdlLCBsb29zZSkge1xuICBpZiAoIShyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnNldC5zb21lKGZ1bmN0aW9uKHRoaXNDb21wYXJhdG9ycykge1xuICAgIHJldHVybiB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoZnVuY3Rpb24odGhpc0NvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiByYW5nZS5zZXQuc29tZShmdW5jdGlvbihyYW5nZUNvbXBhcmF0b3JzKSB7XG4gICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KGZ1bmN0aW9uKHJhbmdlQ29tcGFyYXRvcikge1xuICAgICAgICAgIHJldHVybiB0aGlzQ29tcGFyYXRvci5pbnRlcnNlY3RzKHJhbmdlQ29tcGFyYXRvciwgbG9vc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8vIE1vc3RseSBqdXN0IGZvciB0ZXN0aW5nIGFuZCBsZWdhY3kgQVBJIHJlYXNvbnNcbmV4cG9ydHMudG9Db21wYXJhdG9ycyA9IHRvQ29tcGFyYXRvcnM7XG5mdW5jdGlvbiB0b0NvbXBhcmF0b3JzKHJhbmdlLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSkuc2V0Lm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIGNvbXAubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH0pLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgfSk7XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmZ1bmN0aW9uIHBhcnNlQ29tcGFyYXRvcihjb21wLCBsb29zZSkge1xuICBkZWJ1ZygnY29tcCcsIGNvbXApO1xuICBjb21wID0gcmVwbGFjZUNhcmV0cyhjb21wLCBsb29zZSk7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXApO1xuICBjb21wID0gcmVwbGFjZVRpbGRlcyhjb21wLCBsb29zZSk7XG4gIGRlYnVnKCd0aWxkZXMnLCBjb21wKTtcbiAgY29tcCA9IHJlcGxhY2VYUmFuZ2VzKGNvbXAsIGxvb3NlKTtcbiAgZGVidWcoJ3hyYW5nZScsIGNvbXApO1xuICBjb21wID0gcmVwbGFjZVN0YXJzKGNvbXAsIGxvb3NlKTtcbiAgZGVidWcoJ3N0YXJzJywgY29tcCk7XG4gIHJldHVybiBjb21wO1xufVxuXG5mdW5jdGlvbiBpc1goaWQpIHtcbiAgcmV0dXJuICFpZCB8fCBpZC50b0xvd2VyQ2FzZSgpID09PSAneCcgfHwgaWQgPT09ICcqJztcbn1cblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyB+Mi4wLCB+Mi4wLngsIH4+Mi4wLCB+PjIuMC54IC0tPiA+PTIuMC4wIDwyLjEuMFxuLy8gfjEuMiwgfjEuMi54LCB+PjEuMiwgfj4xLjIueCAtLT4gPj0xLjIuMCA8MS4zLjBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjBcbi8vIH4xLjIuMCwgfj4xLjIuMCAtLT4gPj0xLjIuMCA8MS4zLjBcbmZ1bmN0aW9uIHJlcGxhY2VUaWxkZXMoY29tcCwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXAudHJpbSgpLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uKGNvbXApIHtcbiAgICByZXR1cm4gcmVwbGFjZVRpbGRlKGNvbXAsIGxvb3NlKTtcbiAgfSkuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlVGlsZGUoY29tcCwgbG9vc2UpIHtcbiAgdmFyIHIgPSBsb29zZSA/IHJlW1RJTERFTE9PU0VdIDogcmVbVElMREVdO1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIGZ1bmN0aW9uKF8sIE0sIG0sIHAsIHByKSB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpO1xuICAgIHZhciByZXQ7XG5cbiAgICBpZiAoaXNYKE0pKVxuICAgICAgcmV0ID0gJyc7XG4gICAgZWxzZSBpZiAoaXNYKG0pKVxuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLjAuMCA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIGVsc2UgaWYgKGlzWChwKSlcbiAgICAgIC8vIH4xLjIgPT0gPj0xLjIuMCA8MS4zLjBcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuMCA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcik7XG4gICAgICBpZiAocHIuY2hhckF0KDApICE9PSAnLScpXG4gICAgICAgIHByID0gJy0nICsgcHI7XG4gICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgcHIgK1xuICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgfSBlbHNlXG4gICAgICAvLyB+MS4yLjMgPT0gPj0xLjIuMyA8MS4zLjBcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgK1xuICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KTtcbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyBeMi4wLCBeMi4wLnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyBeMS4yLCBeMS4yLnggLS0+ID49MS4yLjAgPDIuMC4wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wXG4vLyBeMS4yLjAgLS0+ID49MS4yLjAgPDIuMC4wXG5mdW5jdGlvbiByZXBsYWNlQ2FyZXRzKGNvbXAsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VDYXJldChjb21wLCBsb29zZSk7XG4gIH0pLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNhcmV0KGNvbXAsIGxvb3NlKSB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIGxvb3NlKTtcbiAgdmFyIHIgPSBsb29zZSA/IHJlW0NBUkVUTE9PU0VdIDogcmVbQ0FSRVRdO1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIGZ1bmN0aW9uKF8sIE0sIG0sIHAsIHByKSB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpO1xuICAgIHZhciByZXQ7XG5cbiAgICBpZiAoaXNYKE0pKVxuICAgICAgcmV0ID0gJyc7XG4gICAgZWxzZSBpZiAoaXNYKG0pKVxuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLjAuMCA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgaWYgKE0gPT09ICcwJylcbiAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4wIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4wIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VDYXJldCBwcicsIHByKTtcbiAgICAgIGlmIChwci5jaGFyQXQoMCkgIT09ICctJylcbiAgICAgICAgcHIgPSAnLScgKyBwcjtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJylcbiAgICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgcHIgK1xuICAgICAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgbSArICcuJyArICgrcCArIDEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArIHByICtcbiAgICAgICAgICAgICAgICAnIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgcHIgK1xuICAgICAgICAgICAgICAnIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdubyBwcicpO1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKVxuICAgICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgK1xuICAgICAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgbSArICcuJyArICgrcCArIDEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArXG4gICAgICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArXG4gICAgICAgICAgICAgICcgPCcgKyAoK00gKyAxKSArICcuMC4wJztcbiAgICB9XG5cbiAgICBkZWJ1ZygnY2FyZXQgcmV0dXJuJywgcmV0KTtcbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVhSYW5nZXMoY29tcCwgbG9vc2UpIHtcbiAgZGVidWcoJ3JlcGxhY2VYUmFuZ2VzJywgY29tcCwgbG9vc2UpO1xuICByZXR1cm4gY29tcC5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VYUmFuZ2UoY29tcCwgbG9vc2UpO1xuICB9KS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VYUmFuZ2UoY29tcCwgbG9vc2UpIHtcbiAgY29tcCA9IGNvbXAudHJpbSgpO1xuICB2YXIgciA9IGxvb3NlID8gcmVbWFJBTkdFTE9PU0VdIDogcmVbWFJBTkdFXTtcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCBmdW5jdGlvbihyZXQsIGd0bHQsIE0sIG0sIHAsIHByKSB7XG4gICAgZGVidWcoJ3hSYW5nZScsIGNvbXAsIHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpO1xuICAgIHZhciB4TSA9IGlzWChNKTtcbiAgICB2YXIgeG0gPSB4TSB8fCBpc1gobSk7XG4gICAgdmFyIHhwID0geG0gfHwgaXNYKHApO1xuICAgIHZhciBhbnlYID0geHA7XG5cbiAgICBpZiAoZ3RsdCA9PT0gJz0nICYmIGFueVgpXG4gICAgICBndGx0ID0gJyc7XG5cbiAgICBpZiAoeE0pIHtcbiAgICAgIGlmIChndGx0ID09PSAnPicgfHwgZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgYWxsb3dlZFxuICAgICAgICByZXQgPSAnPDAuMC4wJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgZm9yYmlkZGVuXG4gICAgICAgIHJldCA9ICcqJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGd0bHQgJiYgYW55WCkge1xuICAgICAgLy8gcmVwbGFjZSBYIHdpdGggMFxuICAgICAgaWYgKHhtKVxuICAgICAgICBtID0gMDtcbiAgICAgIGlmICh4cClcbiAgICAgICAgcCA9IDA7XG5cbiAgICAgIGlmIChndGx0ID09PSAnPicpIHtcbiAgICAgICAgLy8gPjEgPT4gPj0yLjAuMFxuICAgICAgICAvLyA+MS4yID0+ID49MS4zLjBcbiAgICAgICAgLy8gPjEuMi4zID0+ID49IDEuMi40XG4gICAgICAgIGd0bHQgPSAnPj0nO1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxO1xuICAgICAgICAgIG0gPSAwO1xuICAgICAgICAgIHAgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHhwKSB7XG4gICAgICAgICAgbSA9ICttICsgMTtcbiAgICAgICAgICBwID0gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndGx0ID09PSAnPD0nKSB7XG4gICAgICAgIC8vIDw9MC43LnggaXMgYWN0dWFsbHkgPDAuOC4wLCBzaW5jZSBhbnkgMC43Lnggc2hvdWxkXG4gICAgICAgIC8vIHBhc3MuICBTaW1pbGFybHksIDw9Ny54IGlzIGFjdHVhbGx5IDw4LjAuMCwgZXRjLlxuICAgICAgICBndGx0ID0gJzwnO1xuICAgICAgICBpZiAoeG0pXG4gICAgICAgICAgTSA9ICtNICsgMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG0gPSArbSArIDE7XG4gICAgICB9XG5cbiAgICAgIHJldCA9IGd0bHQgKyBNICsgJy4nICsgbSArICcuJyArIHA7XG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLjAuMCA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuMCA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgfVxuXG4gICAgZGVidWcoJ3hSYW5nZSByZXR1cm4nLCByZXQpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG5cbi8vIEJlY2F1c2UgKiBpcyBBTkQtZWQgd2l0aCBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGNvbXBhcmF0b3IsXG4vLyBhbmQgJycgbWVhbnMgXCJhbnkgdmVyc2lvblwiLCBqdXN0IHJlbW92ZSB0aGUgKnMgZW50aXJlbHkuXG5mdW5jdGlvbiByZXBsYWNlU3RhcnMoY29tcCwgbG9vc2UpIHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIGxvb3NlKTtcbiAgLy8gTG9vc2VuZXNzIGlzIGlnbm9yZWQgaGVyZS4gIHN0YXIgaXMgYWx3YXlzIGFzIGxvb3NlIGFzIGl0IGdldHMhXG4gIHJldHVybiBjb21wLnRyaW0oKS5yZXBsYWNlKHJlW1NUQVJdLCAnJyk7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW0hZUEhFTlJBTkdFXSlcbi8vIE0sIG0sIHBhdGNoLCBwcmVyZWxlYXNlLCBidWlsZFxuLy8gMS4yIC0gMy40LjUgPT4gPj0xLjIuMCA8PTMuNC41XG4vLyAxLjIuMyAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMCBBbnkgMy40Lnggd2lsbCBkb1xuLy8gMS4yIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wXG5mdW5jdGlvbiBoeXBoZW5SZXBsYWNlKCQwLFxuICAgICAgICAgICAgICAgICAgICAgICBmcm9tLCBmTSwgZm0sIGZwLCBmcHIsIGZiLFxuICAgICAgICAgICAgICAgICAgICAgICB0bywgdE0sIHRtLCB0cCwgdHByLCB0Yikge1xuXG4gIGlmIChpc1goZk0pKVxuICAgIGZyb20gPSAnJztcbiAgZWxzZSBpZiAoaXNYKGZtKSlcbiAgICBmcm9tID0gJz49JyArIGZNICsgJy4wLjAnO1xuICBlbHNlIGlmIChpc1goZnApKVxuICAgIGZyb20gPSAnPj0nICsgZk0gKyAnLicgKyBmbSArICcuMCc7XG4gIGVsc2VcbiAgICBmcm9tID0gJz49JyArIGZyb207XG5cbiAgaWYgKGlzWCh0TSkpXG4gICAgdG8gPSAnJztcbiAgZWxzZSBpZiAoaXNYKHRtKSlcbiAgICB0byA9ICc8JyArICgrdE0gKyAxKSArICcuMC4wJztcbiAgZWxzZSBpZiAoaXNYKHRwKSlcbiAgICB0byA9ICc8JyArIHRNICsgJy4nICsgKCt0bSArIDEpICsgJy4wJztcbiAgZWxzZSBpZiAodHByKVxuICAgIHRvID0gJzw9JyArIHRNICsgJy4nICsgdG0gKyAnLicgKyB0cCArICctJyArIHRwcjtcbiAgZWxzZVxuICAgIHRvID0gJzw9JyArIHRvO1xuXG4gIHJldHVybiAoZnJvbSArICcgJyArIHRvKS50cmltKCk7XG59XG5cblxuLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuUmFuZ2UucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbih2ZXJzaW9uKSB7XG4gIGlmICghdmVyc2lvbilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJylcbiAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLmxvb3NlKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHRlc3RTZXQodGhpcy5zZXRbaV0sIHZlcnNpb24pKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gdGVzdFNldChzZXQsIHZlcnNpb24pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAvLyBGaW5kIHRoZSBzZXQgb2YgdmVyc2lvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIHByZXJlbGVhc2VzXG4gICAgLy8gRm9yIGV4YW1wbGUsIF4xLjIuMy1wci4xIGRlc3VnYXJzIHRvID49MS4yLjMtcHIuMSA8Mi4wLjBcbiAgICAvLyBUaGF0IHNob3VsZCBhbGxvdyBgMS4yLjMtcHIuMmAgdG8gcGFzcy5cbiAgICAvLyBIb3dldmVyLCBgMS4yLjQtYWxwaGEubm90cmVhZHlgIHNob3VsZCBOT1QgYmUgYWxsb3dlZCxcbiAgICAvLyBldmVuIHRob3VnaCBpdCdzIHdpdGhpbiB0aGUgcmFuZ2Ugc2V0IGJ5IHRoZSBjb21wYXJhdG9ycy5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgZGVidWcoc2V0W2ldLnNlbXZlcik7XG4gICAgICBpZiAoc2V0W2ldLnNlbXZlciA9PT0gQU5ZKVxuICAgICAgICBjb250aW51ZTtcblxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBhbGxvd2VkID0gc2V0W2ldLnNlbXZlcjtcbiAgICAgICAgaWYgKGFsbG93ZWQubWFqb3IgPT09IHZlcnNpb24ubWFqb3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQubWlub3IgPT09IHZlcnNpb24ubWlub3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQucGF0Y2ggPT09IHZlcnNpb24ucGF0Y2gpXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVyc2lvbiBoYXMgYSAtcHJlLCBidXQgaXQncyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGxpa2UuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydHMuc2F0aXNmaWVzID0gc2F0aXNmaWVzO1xuZnVuY3Rpb24gc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBsb29zZSkge1xuICB0cnkge1xuICAgIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiByYW5nZS50ZXN0KHZlcnNpb24pO1xufVxuXG5leHBvcnRzLm1heFNhdGlzZnlpbmcgPSBtYXhTYXRpc2Z5aW5nO1xuZnVuY3Rpb24gbWF4U2F0aXNmeWluZyh2ZXJzaW9ucywgcmFuZ2UsIGxvb3NlKSB7XG4gIHZhciBtYXggPSBudWxsO1xuICB2YXIgbWF4U1YgPSBudWxsO1xuICB0cnkge1xuICAgIHZhciByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpO1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZlcnNpb25zLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkgeyAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIGxvb3NlKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHsgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHY7XG4gICAgICAgIG1heFNWID0gbmV3IFNlbVZlcihtYXgsIGxvb3NlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXg7XG59XG5cbmV4cG9ydHMubWluU2F0aXNmeWluZyA9IG1pblNhdGlzZnlpbmc7XG5mdW5jdGlvbiBtaW5TYXRpc2Z5aW5nKHZlcnNpb25zLCByYW5nZSwgbG9vc2UpIHtcbiAgdmFyIG1pbiA9IG51bGw7XG4gIHZhciBtaW5TViA9IG51bGw7XG4gIHRyeSB7XG4gICAgdmFyIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7IC8vIHNhdGlzZmllcyh2LCByYW5nZSwgbG9vc2UpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7IC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2O1xuICAgICAgICBtaW5TViA9IG5ldyBTZW1WZXIobWluLCBsb29zZSk7XG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluO1xufVxuXG5leHBvcnRzLnZhbGlkUmFuZ2UgPSB2YWxpZFJhbmdlO1xuZnVuY3Rpb24gdmFsaWRSYW5nZShyYW5nZSwgbG9vc2UpIHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpLnJhbmdlIHx8ICcqJztcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBsZXNzIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2VcbmV4cG9ydHMubHRyID0gbHRyO1xuZnVuY3Rpb24gbHRyKHZlcnNpb24sIHJhbmdlLCBsb29zZSkge1xuICByZXR1cm4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJzwnLCBsb29zZSk7XG59XG5cbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZS5cbmV4cG9ydHMuZ3RyID0gZ3RyO1xuZnVuY3Rpb24gZ3RyKHZlcnNpb24sIHJhbmdlLCBsb29zZSkge1xuICByZXR1cm4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJz4nLCBsb29zZSk7XG59XG5cbmV4cG9ydHMub3V0c2lkZSA9IG91dHNpZGU7XG5mdW5jdGlvbiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBsb29zZSkge1xuICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCBsb29zZSk7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG5cbiAgdmFyIGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcDtcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3Q7XG4gICAgICBsdGVmbiA9IGx0ZTtcbiAgICAgIGx0Zm4gPSBsdDtcbiAgICAgIGNvbXAgPSAnPic7XG4gICAgICBlY29tcCA9ICc+PSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdDtcbiAgICAgIGx0ZWZuID0gZ3RlO1xuICAgICAgbHRmbiA9IGd0O1xuICAgICAgY29tcCA9ICc8JztcbiAgICAgIGVjb21wID0gJzw9JztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpO1xuICB9XG5cbiAgLy8gSWYgaXQgc2F0aXNpZmVzIHRoZSByYW5nZSBpdCBpcyBub3Qgb3V0c2lkZVxuICBpZiAoc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBsb29zZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNvbXBhcmF0b3JzID0gcmFuZ2Uuc2V0W2ldO1xuXG4gICAgdmFyIGhpZ2ggPSBudWxsO1xuICAgIHZhciBsb3cgPSBudWxsO1xuXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaChmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvcjtcbiAgICAgIGxvdyA9IGxvdyB8fCBjb21wYXJhdG9yO1xuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBsb29zZSkpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3I7XG4gICAgICB9IGVsc2UgaWYgKGx0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGxvdy5zZW12ZXIsIGxvb3NlKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSWYgdGhlIGVkZ2UgdmVyc2lvbiBjb21wYXJhdG9yIGhhcyBhIG9wZXJhdG9yIHRoZW4gb3VyIHZlcnNpb25cbiAgICAvLyBpc24ndCBvdXRzaWRlIGl0XG4gICAgaWYgKGhpZ2gub3BlcmF0b3IgPT09IGNvbXAgfHwgaGlnaC5vcGVyYXRvciA9PT0gZWNvbXApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0cy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZTtcbmZ1bmN0aW9uIHByZXJlbGVhc2UodmVyc2lvbiwgbG9vc2UpIHtcbiAgdmFyIHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIGxvb3NlKTtcbiAgcmV0dXJuIChwYXJzZWQgJiYgcGFyc2VkLnByZXJlbGVhc2UubGVuZ3RoKSA/IHBhcnNlZC5wcmVyZWxlYXNlIDogbnVsbDtcbn1cblxuZXhwb3J0cy5pbnRlcnNlY3RzID0gaW50ZXJzZWN0cztcbmZ1bmN0aW9uIGludGVyc2VjdHMocjEsIHIyLCBsb29zZSkge1xuICByMSA9IG5ldyBSYW5nZShyMSwgbG9vc2UpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBsb29zZSlcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJ1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgdHlwb2YgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlcnNpb24gc3RyaW5nLlxuICogQHBhcmFtICB7U3RyaW5nfSBWZXJzaW9uLiBpZTogMSwgMS4wLCAxLjAuMFxuICogQHJldHVybiB7U3RyaW5nfSBWZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVWZXJzaW9uICh2KSB7XG4gIGNvbnN0IGlzVmFsaWQgPSBzZW12ZXIudmFsaWQodilcbiAgaWYgKGlzVmFsaWQpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgdiA9IHR5cGVvZiAodikgPT09ICdzdHJpbmcnID8gdiA6ICcnXG4gIGNvbnN0IHNwbGl0ID0gdi5zcGxpdCgnLicpXG4gIGxldCBpID0gMFxuICBjb25zdCByZXN1bHQgPSBbXVxuXG4gIHdoaWxlIChpIDwgMykge1xuICAgIGNvbnN0IHMgPSB0eXBlb2YgKHNwbGl0W2ldKSA9PT0gJ3N0cmluZycgJiYgc3BsaXRbaV0gPyBzcGxpdFtpXSA6ICcwJ1xuICAgIHJlc3VsdC5wdXNoKHMpXG4gICAgaSsrXG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmpvaW4oJy4nKVxufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbnMgZnJvbSBkaWZmZXJlbnQgZXJyb3Iga2V5LiBMaWtlOlxuICogLSBjb2RlXG4gKiAtIGVycm9yTWVzc2FnZVxuICogLSBlcnJvclR5cGVcbiAqIC0gaXNEb3duZ3JhZGVcbiAqIEBwYXJhbSAge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZhbFxuICogQHBhcmFtICB7c3RyaW5nfSBjcml0ZXJpYVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3IgKGtleSwgdmFsLCBjcml0ZXJpYSkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IHRydWUsXG4gICAgZXJyb3JUeXBlOiAxLFxuICAgIGNvZGU6IDEwMDBcbiAgfVxuICBjb25zdCBnZXRNc2cgPSBmdW5jdGlvbiAoa2V5LCB2YWwsIGNyaXRlcmlhKSB7XG4gICAgcmV0dXJuICdEb3duZ3JhZGVbJyArIGtleSArICddIDo6IGRldmljZUluZm8gJ1xuICAgICAgKyB2YWwgKyAnIG1hdGNoZWQgY3JpdGVyaWEgJyArIGNyaXRlcmlhXG4gIH1cbiAgY29uc3QgX2tleSA9IGtleS50b0xvd2VyQ2FzZSgpXG5cbiAgcmVzdWx0LmVycm9yTWVzc2FnZSA9IGdldE1zZyhrZXksIHZhbCwgY3JpdGVyaWEpXG5cbiAgaWYgKF9rZXkuaW5kZXhPZignb3N2ZXJzaW9uJykgPj0gMCkge1xuICAgIHJlc3VsdC5jb2RlID0gMTAwMVxuICB9XG4gIGVsc2UgaWYgKF9rZXkuaW5kZXhPZignYXBwdmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDJcbiAgfVxuICBlbHNlIGlmIChfa2V5LmluZGV4T2YoJ3dlZXh2ZXJzaW9uJykgPj0gMCkge1xuICAgIHJlc3VsdC5jb2RlID0gMTAwM1xuICB9XG4gIGVsc2UgaWYgKF9rZXkuaW5kZXhPZignZGV2aWNlbW9kZWwnKSA+PSAwKSB7XG4gICAgcmVzdWx0LmNvZGUgPSAxMDA0XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogV0VFWCBmcmFtZXdvcmsgaW5wdXQoZGV2aWNlSW5mbylcbiAqIHtcbiAqICAgcGxhdGZvcm06ICdpT1MnIG9yICdhbmRyb2lkJ1xuICogICBvc1ZlcnNpb246ICcxLjAuMCcgb3IgJzEuMCcgb3IgJzEnXG4gKiAgIGFwcFZlcnNpb246ICcxLjAuMCcgb3IgJzEuMCcgb3IgJzEnXG4gKiAgIHdlZXhWZXJzaW9uOiAnMS4wLjAnIG9yICcxLjAnIG9yICcxJ1xuICogICBkRGV2aWNlTW9kZWw6ICdNT0RFTF9OQU1FJ1xuICogfVxuICpcbiAqIGRvd25ncmFkZSBjb25maWcoY29uZmlnKVxuICoge1xuICogICBpb3M6IHtcbiAqICAgICBvc1ZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIGFwcFZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIHdlZXhWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBkZXZpY2VNb2RlbDogWydtb2RlbEEnLCAnbW9kZWxCJywgLi4uXVxuICogICB9LFxuICogICBhbmRyb2lkOiB7XG4gKiAgICAgb3NWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBhcHBWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICB3ZWV4VmVyc2lvbjogJz4xLjAuMCcgb3IgJz49MS4wLjAnIG9yICc8MS4wLjAnIG9yICc8PTEuMC4wJyBvciAnMS4wLjAnXG4gKiAgICAgZGV2aWNlTW9kZWw6IFsnbW9kZWxBJywgJ21vZGVsQicsIC4uLl1cbiAqICAgfVxuICogfVxuICpcbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRldmljZUluZm8gV2VleCBTREsgZnJhbWV3b3JrIGlucHV0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbmZpZyAgICAgdXNlciBpbnB1dFxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgIHsgaXNEb3duZ3JhZGU6IHRydWUvZmFsc2UsIGVycm9yTWVzc2FnZS4uLiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayAoY29uZmlnLCBkZXZpY2VJbmZvKSB7XG4gIGRldmljZUluZm8gPSBkZXZpY2VJbmZvIHx8IGdsb2JhbC5XWEVudmlyb25tZW50XG4gIGRldmljZUluZm8gPSBpc1BsYWluT2JqZWN0KGRldmljZUluZm8pID8gZGV2aWNlSW5mbyA6IHt9XG5cbiAgbGV0IHJlc3VsdCA9IHtcbiAgICBpc0Rvd25ncmFkZTogZmFsc2UgLy8gZGVmYXV0bCBpcyBwYXNzXG4gIH1cblxuICBpZiAodHlwb2YoY29uZmlnKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxldCBjdXN0b21Eb3duZ3JhZGUgPSBjb25maWcuY2FsbCh0aGlzLCBkZXZpY2VJbmZvLCB7XG4gICAgICBzZW12ZXI6IHNlbXZlcixcbiAgICAgIG5vcm1hbGl6ZVZlcnNpb25cbiAgICB9KVxuXG4gICAgY3VzdG9tRG93bmdyYWRlID0gISFjdXN0b21Eb3duZ3JhZGVcblxuICAgIHJlc3VsdCA9IGN1c3RvbURvd25ncmFkZSA/IGdldEVycm9yKCdjdXN0b20nLCAnJywgJ2N1c3RvbSBwYXJhbXMnKSA6IHJlc3VsdFxuICB9XG4gIGVsc2Uge1xuICAgIGNvbmZpZyA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG5cbiAgICBjb25zdCBwbGF0Zm9ybSA9IGRldmljZUluZm8ucGxhdGZvcm0gfHwgJ3Vua25vdydcbiAgICBjb25zdCBkUGxhdGZvcm0gPSBwbGF0Zm9ybS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgY09iaiA9IGNvbmZpZ1tkUGxhdGZvcm1dIHx8IHt9XG5cbiAgICBmb3IgKGNvbnN0IGkgaW4gZGV2aWNlSW5mbykge1xuICAgICAgY29uc3Qga2V5ID0gaVxuICAgICAgY29uc3Qga2V5TG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKVxuICAgICAgY29uc3QgdmFsID0gZGV2aWNlSW5mb1tpXVxuICAgICAgY29uc3QgaXNWZXJzaW9uID0ga2V5TG93ZXIuaW5kZXhPZigndmVyc2lvbicpID49IDBcbiAgICAgIGNvbnN0IGlzRGV2aWNlTW9kZWwgPSBrZXlMb3dlci5pbmRleE9mKCdkZXZpY2Vtb2RlbCcpID49IDBcbiAgICAgIGNvbnN0IGNyaXRlcmlhID0gY09ialtpXVxuXG4gICAgICBpZiAoY3JpdGVyaWEgJiYgaXNWZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IGMgPSBub3JtYWxpemVWZXJzaW9uKGNyaXRlcmlhKVxuICAgICAgICBjb25zdCBkID0gbm9ybWFsaXplVmVyc2lvbihkZXZpY2VJbmZvW2ldKVxuXG4gICAgICAgIGlmIChzZW12ZXIuc2F0aXNmaWVzKGQsIGMpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZ2V0RXJyb3Ioa2V5LCB2YWwsIGNyaXRlcmlhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzRGV2aWNlTW9kZWwpIHtcbiAgICAgICAgY29uc3QgX2NyaXRlcmlhID0gdHlwb2YoY3JpdGVyaWEpID09PSAnYXJyYXknID8gY3JpdGVyaWEgOiBbY3JpdGVyaWFdXG4gICAgICAgIGlmIChfY3JpdGVyaWEuaW5kZXhPZih2YWwpID49IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBnZXRFcnJvcihrZXksIHZhbCwgY3JpdGVyaWEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZpZXdwb3J0IChhcHAsIGNvbmZpZ3MgPSB7fSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gU2V0IHZpZXdwb3J0ICh3aWR0aDogJHtjb25maWdzLndpZHRofSkgZm9yIGFwcCMke2FwcC5pZH0uYClcbiAgICB2YWxpZGF0ZVZpZXdwb3J0KGNvbmZpZ3MpXG4gIH1cblxuICAvLyBTZW5kIHZpZXdwb3J0IGNvbmZpZ3MgdG8gbmF0aXZlXG4gIGlmIChhcHAgJiYgYXBwLmNhbGxUYXNrcykge1xuICAgIHJldHVybiBhcHAuY2FsbFRhc2tzKFt7XG4gICAgICBtb2R1bGU6ICdtZXRhJyxcbiAgICAgIG1ldGhvZDogJ3NldFZpZXdwb3J0JyxcbiAgICAgIGFyZ3M6IFtjb25maWdzXVxuICAgIH1dKVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIENhbid0IGZpbmQgXCJjYWxsVGFza3NcIiBtZXRob2Qgb24gY3VycmVudCBhcHAuYClcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoZSB2aWV3cG9ydCBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVWaWV3cG9ydCAoY29uZmlncyA9IHt9KSB7XG4gIGNvbnN0IHsgd2lkdGggfSA9IGNvbmZpZ3NcbiAgaWYgKHdpZHRoKSB7XG4gICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gJ251bWJlcicgJiYgd2lkdGggIT09ICdkZXZpY2Utd2lkdGgnKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIE5vdCBzdXBwb3J0IHRvIHVzZSAke3dpZHRofSBhcyB2aWV3cG9ydCB3aWR0aC5gKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSB0aGUgdmlld3BvcnQgY29uZmlnIHNob3VsZCBjb250YWluIHRoZSBcIndpZHRoXCIgcHJvcGVydHkuJylcbiAgcmV0dXJuIGZhbHNlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJ1xuaW1wb3J0IFZtIGZyb20gJy4uLy4uL3ZtL2luZGV4J1xuaW1wb3J0ICogYXMgZG93bmdyYWRlIGZyb20gJy4uL2Rvd25ncmFkZSdcbmltcG9ydCB7IHNldFZpZXdwb3J0IH0gZnJvbSAnLi4vdmlld3BvcnQnXG5pbXBvcnQge1xuICByZXF1aXJlQ3VzdG9tQ29tcG9uZW50XG59IGZyb20gJy4uL3JlZ2lzdGVyJ1xuaW1wb3J0IHtcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNXZWV4Q29tcG9uZW50LFxuICBpc05wbU1vZHVsZSxcbiAgcmVtb3ZlV2VleFByZWZpeCxcbiAgcmVtb3ZlSlNTdXJmaXhcbn0gZnJvbSAnLi4vLi4vdXRpbC9pbmRleCdcblxuLyoqXG4gKiBib290c3RyYXAgYXBwIGZyb20gYSBjZXJ0YWluIGN1c3RvbSBjb21wb25lbnQgd2l0aCBjb25maWcgJiBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXAgKGFwcCwgbmFtZSwgY29uZmlnLCBkYXRhKSB7XG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIGJvb3RzdHJhcCBmb3IgJHtuYW1lfWApXG5cbiAgLy8gMS4gdmFsaWRhdGUgY3VzdG9tIGNvbXBvbmVudCBuYW1lIGZpcnN0XG4gIGxldCBjbGVhbk5hbWVcbiAgaWYgKGlzV2VleENvbXBvbmVudChuYW1lKSkge1xuICAgIGNsZWFuTmFtZSA9IHJlbW92ZVdlZXhQcmVmaXgobmFtZSlcbiAgfVxuICBlbHNlIGlmIChpc05wbU1vZHVsZShuYW1lKSkge1xuICAgIGNsZWFuTmFtZSA9IHJlbW92ZUpTU3VyZml4KG5hbWUpXG4gICAgLy8gY2hlY2sgaWYgZGVmaW5lIGJ5IG9sZCAnZGVmaW5lJyBtZXRob2RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXJlcXVpcmVDdXN0b21Db21wb25lbnQoYXBwLCBjbGVhbk5hbWUpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKGBJdCdzIG5vdCBhIGNvbXBvbmVudDogJHtuYW1lfWApXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYFdyb25nIGNvbXBvbmVudCBuYW1lOiAke25hbWV9YClcbiAgfVxuXG4gIC8vIDIuIHZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgY29uZmlnID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgLy8gMi4xIHRyYW5zZm9ybWVyIHZlcnNpb24gY2hlY2tcbiAgaWYgKHR5cGVvZiBjb25maWcudHJhbnNmb3JtZXJWZXJzaW9uID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uID09PSAnc3RyaW5nJyAmJlxuICAgICFzZW12ZXIuc2F0aXNmaWVzKGNvbmZpZy50cmFuc2Zvcm1lclZlcnNpb24sXG4gICAgICBnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYEpTIEJ1bmRsZSB2ZXJzaW9uOiAke2NvbmZpZy50cmFuc2Zvcm1lclZlcnNpb259IGAgK1xuICAgICAgYG5vdCBjb21wYXRpYmxlIHdpdGggJHtnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9ufWApXG4gIH1cbiAgLy8gMi4yIGRvd25ncmFkZSB2ZXJzaW9uIGNoZWNrXG4gIGNvbnN0IGRvd25ncmFkZVJlc3VsdCA9IGRvd25ncmFkZS5jaGVjayhjb25maWcuZG93bmdyYWRlKVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGRvd25ncmFkZVJlc3VsdC5pc0Rvd25ncmFkZSkge1xuICAgIGFwcC5jYWxsVGFza3MoW3tcbiAgICAgIG1vZHVsZTogJ2luc3RhbmNlV3JhcCcsXG4gICAgICBtZXRob2Q6ICdlcnJvcicsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIGRvd25ncmFkZVJlc3VsdC5lcnJvclR5cGUsXG4gICAgICAgIGRvd25ncmFkZVJlc3VsdC5jb2RlLFxuICAgICAgICBkb3duZ3JhZGVSZXN1bHQuZXJyb3JNZXNzYWdlXG4gICAgICBdXG4gICAgfV0pXG4gICAgcmV0dXJuIG5ldyBFcnJvcihgRG93bmdyYWRlWyR7ZG93bmdyYWRlUmVzdWx0LmNvZGV9XTogJHtkb3duZ3JhZGVSZXN1bHQuZXJyb3JNZXNzYWdlfWApXG4gIH1cblxuICAvLyBzZXQgdmlld3BvcnRcbiAgaWYgKGNvbmZpZy52aWV3cG9ydCkge1xuICAgIHNldFZpZXdwb3J0KGFwcCwgY29uZmlnLnZpZXdwb3J0KVxuICB9XG5cbiAgLy8gMy4gY3JlYXRlIGEgbmV3IFZtIHdpdGggY3VzdG9tIGNvbXBvbmVudCBuYW1lIGFuZCBkYXRhXG4gIGFwcC52bSA9IG5ldyBWbShjbGVhbk5hbWUsIG51bGwsIHsgX2FwcDogYXBwIH0sIG51bGwsIGRhdGEpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIGlzV2VleENvbXBvbmVudCxcbiAgaXNXZWV4TW9kdWxlLFxuICBpc05vcm1hbE1vZHVsZSxcbiAgaXNOcG1Nb2R1bGUsXG4gIHJlbW92ZVdlZXhQcmVmaXgsXG4gIHJlbW92ZUpTU3VyZml4XG59IGZyb20gJy4uLy4uL3V0aWwvaW5kZXgnXG5pbXBvcnQge1xuICByZWdpc3RlckN1c3RvbUNvbXBvbmVudCxcbiAgcmVxdWlyZUN1c3RvbUNvbXBvbmVudCxcbiAgaW5pdE1vZHVsZXNcbn0gZnJvbSAnLi4vcmVnaXN0ZXInXG5cbi8qKlxuICogZGVmaW5lKG5hbWUsIGZhY3RvcnkpIGZvciBwcmltYXJ5IHVzYWdlXG4gKiBvclxuICogZGVmaW5lKG5hbWUsIGRlcHMsIGZhY3RvcnkpIGZvciBjb21wYXRpYmlsaXR5XG4gKiBOb3RpY2U6IERPIE5PVCB1c2UgZnVuY3Rpb24gZGVmaW5lKCkge30sXG4gKiBpdCB3aWxsIGNhdXNlIGVycm9yIGFmdGVyIGJ1aWxkZWQgYnkgd2VicGFja1xuICovXG5leHBvcnQgY29uc3QgZGVmaW5lRm4gPSBmdW5jdGlvbiAoYXBwLCBuYW1lLCAuLi5hcmdzKSB7XG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIGRlZmluZSBhIGNvbXBvbmVudCAke25hbWV9YClcblxuICAvLyBhZGFwdCBhcmdzOlxuICAvLyAxLiBuYW1lLCBkZXBzW10sIGZhY3RvcnkoKVxuICAvLyAyLiBuYW1lLCBmYWN0b3J5KClcbiAgLy8gMy4gbmFtZSwgZGVmaW5pdGlvbnt9XG4gIGxldCBmYWN0b3J5LCBkZWZpbml0aW9uXG4gIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICBkZWZpbml0aW9uID0gYXJnc1sxXVxuICB9XG4gIGVsc2Uge1xuICAgIGRlZmluaXRpb24gPSBhcmdzWzBdXG4gIH1cbiAgaWYgKHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZmFjdG9yeSA9IGRlZmluaXRpb25cbiAgICBkZWZpbml0aW9uID0gbnVsbFxuICB9XG5cbiAgLy8gcmVzb2x2ZSBkZWZpbml0aW9uIGZyb20gZmFjdG9yeVxuICBpZiAoZmFjdG9yeSkge1xuICAgIGNvbnN0IHIgPSAobmFtZSkgPT4ge1xuICAgICAgaWYgKGlzV2VleENvbXBvbmVudChuYW1lKSkge1xuICAgICAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVXZWV4UHJlZml4KG5hbWUpXG4gICAgICAgIHJldHVybiByZXF1aXJlQ3VzdG9tQ29tcG9uZW50KGFwcCwgY2xlYW5OYW1lKVxuICAgICAgfVxuICAgICAgaWYgKGlzV2VleE1vZHVsZShuYW1lKSkge1xuICAgICAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVXZWV4UHJlZml4KG5hbWUpXG4gICAgICAgIHJldHVybiBhcHAucmVxdWlyZU1vZHVsZShjbGVhbk5hbWUpXG4gICAgICB9XG4gICAgICBpZiAoaXNOb3JtYWxNb2R1bGUobmFtZSkgfHwgaXNOcG1Nb2R1bGUobmFtZSkpIHtcbiAgICAgICAgY29uc3QgY2xlYW5OYW1lID0gcmVtb3ZlSlNTdXJmaXgobmFtZSlcbiAgICAgICAgcmV0dXJuIGFwcC5jb21tb25Nb2R1bGVzW2NsZWFuTmFtZV1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbSA9IHsgZXhwb3J0czoge319XG4gICAgZmFjdG9yeShyLCBtLmV4cG9ydHMsIG0pXG4gICAgZGVmaW5pdGlvbiA9IG0uZXhwb3J0c1xuICB9XG5cbiAgLy8gYXBwbHkgZGVmaW5pdGlvblxuICBpZiAoaXNXZWV4Q29tcG9uZW50KG5hbWUpKSB7XG4gICAgY29uc3QgY2xlYW5OYW1lID0gcmVtb3ZlV2VleFByZWZpeChuYW1lKVxuICAgIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50KGFwcCwgY2xlYW5OYW1lLCBkZWZpbml0aW9uKVxuICB9XG4gIGVsc2UgaWYgKGlzV2VleE1vZHVsZShuYW1lKSkge1xuICAgIGNvbnN0IGNsZWFuTmFtZSA9IHJlbW92ZVdlZXhQcmVmaXgobmFtZSlcbiAgICBpbml0TW9kdWxlcyh7IFtjbGVhbk5hbWVdOiBkZWZpbml0aW9uIH0pXG4gIH1cbiAgZWxzZSBpZiAoaXNOb3JtYWxNb2R1bGUobmFtZSkpIHtcbiAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVKU1N1cmZpeChuYW1lKVxuICAgIGFwcC5jb21tb25Nb2R1bGVzW2NsZWFuTmFtZV0gPSBkZWZpbml0aW9uXG4gIH1cbiAgZWxzZSBpZiAoaXNOcG1Nb2R1bGUobmFtZSkpIHtcbiAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVKU1N1cmZpeChuYW1lKVxuICAgIGlmIChkZWZpbml0aW9uLnRlbXBsYXRlIHx8XG4gICAgICAgIGRlZmluaXRpb24uc3R5bGUgfHxcbiAgICAgICAgZGVmaW5pdGlvbi5tZXRob2RzKSB7XG4gICAgICAvLyBkb3duZ3JhZGUgdG8gb2xkIGRlZmluZSBtZXRob2QgKGRlZmluZSgnY29tcG9uZW50TmFtZScsIGZhY3RvcnkpKVxuICAgICAgLy8gdGhlIGV4cG9ydHMgY29udGFpbiBvbmUga2V5IG9mIHRlbXBsYXRlLCBzdHlsZSBvciBtZXRob2RzXG4gICAgICAvLyBidXQgaXQgaGFzIHJpc2shISFcbiAgICAgIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50KGFwcCwgY2xlYW5OYW1lLCBkZWZpbml0aW9uKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGFwcC5jb21tb25Nb2R1bGVzW2NsZWFuTmFtZV0gPSBkZWZpbml0aW9uXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyIChhcHAsIHR5cGUsIG9wdGlvbnMpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBSZWdpc3RlciBpcyBkZXByZWNhdGVkLCBwbGVhc2UgaW5zdGFsbCBsYXN0ZXN0IHRyYW5zZm9ybWVyLicpXG4gIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50KGFwcCwgdHlwZSwgb3B0aW9ucylcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBhcGkgdGhhdCBpbnZva2VkIGJ5IGpzIGJ1bmRsZSBjb2RlXG4gKlxuICogLSBkZWZpbmUobmFtZSwgZmFjdG9yeSk6IGRlZmluZSBhIG5ldyBjb21wb3NlZCBjb21wb25lbnQgdHlwZVxuICogLSBib290c3RyYXAodHlwZSwgY29uZmlnLCBkYXRhKTogcmVxdWlyZSBhIGNlcnRhaW4gdHlwZSAmXG4gKiAgICAgICAgIHJlbmRlciB3aXRoIChvcHRpb25hbCkgZGF0YVxuICpcbiAqIGRlcHJlY2F0ZWQ6XG4gKiAtIHJlZ2lzdGVyKHR5cGUsIG9wdGlvbnMpOiByZWdpc3RlciBhIG5ldyBjb21wb3NlZCBjb21wb25lbnQgdHlwZVxuICogLSByZW5kZXIodHlwZSwgZGF0YSk6IHJlbmRlciBieSBhIGNlcnRhaW4gdHlwZSB3aXRoIChvcHRpb25hbCkgZGF0YVxuICogLSByZXF1aXJlKHR5cGUpKGRhdGEpOiByZXF1aXJlIGEgdHlwZSB0aGVuIHJlbmRlciB3aXRoIGRhdGFcbiAqL1xuXG5leHBvcnQgeyBib290c3RyYXAgfSBmcm9tICcuL2Jvb3RzdHJhcCdcbmV4cG9ydCB7IGRlZmluZUZuLCByZWdpc3RlciB9IGZyb20gJy4vZGVmaW5lJ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIGluc3RhbmNlIGNvbnRyb2xzIGZyb20gbmF0aXZlXG4gKlxuICogLSBmaXJlIGV2ZW50XG4gKiAtIGNhbGxiYWNrXG4gKiAtIHJlZnJlc2hcbiAqIC0gZGVzdHJveVxuICpcbiAqIGNvcnJlc3BvbmRlZCB3aXRoIHRoZSBBUEkgb2YgaW5zdGFuY2UgbWFuYWdlciAoZnJhbWV3b3JrLmpzKVxuICovXG5pbXBvcnQgeyBleHRlbmQsIHR5cG9mIH0gZnJvbSAnLi4vLi4vdXRpbC9pbmRleCdcblxuLyoqXG4gKiBSZWZyZXNoIGFuIGFwcCB3aXRoIGRhdGEgdG8gaXRzIHJvb3QgY29tcG9uZW50IG9wdGlvbnMuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHBhcmFtICB7YW55fSAgICBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoIChhcHAsIGRhdGEpIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gUmVmcmVzaCB3aXRoYCwgZGF0YSxcbiAgICAgICAgICAgIGBpbiBpbnN0YW5jZVske2FwcC5pZH1dYClcbiAgY29uc3Qgdm0gPSBhcHAudm1cbiAgaWYgKHZtICYmIGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIHZtLnJlZnJlc2hEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2bS5yZWZyZXNoRGF0YShkYXRhKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV4dGVuZCh2bSwgZGF0YSlcbiAgICB9XG4gICAgYXBwLmRpZmZlci5mbHVzaCgpXG4gICAgYXBwLmRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAncmVmcmVzaEZpbmlzaCcgfSwgW10pXG4gICAgcmV0dXJuXG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBkYXRhIFwiJHtkYXRhfVwiYClcbn1cblxuLyoqXG4gKiBEZXN0cm95IGFuIGFwcC5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95IChhcHApIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gRGVzdG9yeSBhbiBpbnN0YW5jZSgke2FwcC5pZH0pYClcblxuICBpZiAoYXBwLnZtKSB7XG4gICAgZGVzdHJveVZtKGFwcC52bSlcbiAgfVxuXG4gIGFwcC5pZCA9ICcnXG4gIGFwcC5vcHRpb25zID0gbnVsbFxuICBhcHAuYmxvY2tzID0gbnVsbFxuICBhcHAudm0gPSBudWxsXG4gIGFwcC5kb2MudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKVxuICBhcHAuZG9jLmRlc3Ryb3koKVxuICBhcHAuZG9jID0gbnVsbFxuICBhcHAuY3VzdG9tQ29tcG9uZW50TWFwID0gbnVsbFxuICBhcHAuY29tbW9uTW9kdWxlcyA9IG51bGxcbn1cblxuLyoqXG4gKiBEZXN0cm95IGFuIFZtLlxuICogQHBhcmFtIHtvYmplY3R9IHZtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95Vm0gKHZtKSB7XG4gIGRlbGV0ZSB2bS5fYXBwXG4gIGRlbGV0ZSB2bS5fY29tcHV0ZWRcbiAgZGVsZXRlIHZtLl9jc3NcbiAgZGVsZXRlIHZtLl9kYXRhXG4gIGRlbGV0ZSB2bS5faWRzXG4gIGRlbGV0ZSB2bS5fbWV0aG9kc1xuICBkZWxldGUgdm0uX29wdGlvbnNcbiAgZGVsZXRlIHZtLl9wYXJlbnRcbiAgZGVsZXRlIHZtLl9wYXJlbnRFbFxuICBkZWxldGUgdm0uX3Jvb3RFbFxuXG4gIC8vIHJlbW92ZSBhbGwgd2F0Y2hlcnNcbiAgaWYgKHZtLl93YXRjaGVycykge1xuICAgIGxldCB3YXRjaGVyQ291bnQgPSB2bS5fd2F0Y2hlcnMubGVuZ3RoXG4gICAgd2hpbGUgKHdhdGNoZXJDb3VudC0tKSB7XG4gICAgICB2bS5fd2F0Y2hlcnNbd2F0Y2hlckNvdW50XS50ZWFyZG93bigpXG4gICAgfVxuICAgIGRlbGV0ZSB2bS5fd2F0Y2hlcnNcbiAgfVxuXG4gIC8vIGRlc3Ryb3kgY2hpbGQgdm1zIHJlY3Vyc2l2ZWx5XG4gIGlmICh2bS5fY2hpbGRyZW5WbXMpIHtcbiAgICBsZXQgdm1Db3VudCA9IHZtLl9jaGlsZHJlblZtcy5sZW5ndGhcbiAgICB3aGlsZSAodm1Db3VudC0tKSB7XG4gICAgICBkZXN0cm95Vm0odm0uX2NoaWxkcmVuVm1zW3ZtQ291bnRdKVxuICAgIH1cbiAgICBkZWxldGUgdm0uX2NoaWxkcmVuVm1zXG4gIH1cblxuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBcImRlc3Ryb3llZFwiIGxpZmVjeWNsZSBpbiBWbSgke3ZtLl90eXBlfSlgKVxuICB2bS4kZW1pdCgnaG9vazpkZXN0cm95ZWQnKVxuXG4gIGRlbGV0ZSB2bS5fdHlwZVxuICBkZWxldGUgdm0uX3ZtRXZlbnRzXG59XG5cbi8qKlxuICogR2V0IGEgSlNPTiBvYmplY3QgdG8gZGVzY3JpYmUgdGhlIGRvY3VtZW50IGJvZHkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vdEVsZW1lbnQgKGFwcCkge1xuICBjb25zdCBkb2MgPSBhcHAuZG9jIHx8IHt9XG4gIGNvbnN0IGJvZHkgPSBkb2MuYm9keSB8fCB7fVxuICByZXR1cm4gYm9keS50b0pTT04gPyBib2R5LnRvSlNPTigpIDoge31cbn1cblxuLyoqXG4gKiBGaXJlIGFuIGV2ZW50IGZyb20gcmVuZGVyZXIuIFRoZSBldmVudCBoYXMgdHlwZSwgYW4gZXZlbnQgb2JqZWN0IGFuZCBhblxuICogZWxlbWVudCByZWYuIElmIHRoZSBldmVudCBjb21lcyB3aXRoIHNvbWUgdmlydHVhbC1ET00gY2hhbmdlcywgaXQgc2hvdWxkXG4gKiBoYXZlIG9uZSBtb3JlIHBhcmFtZXRlciB0byBkZXNjcmliZSB0aGUgY2hhbmdlcy5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHJlZlxuICogQHBhcmFtICB7dHlwZX0gICB0eXBlXG4gKiBAcGFyYW0gIHtvYmplY3R9IGVcbiAqIEBwYXJhbSAge29iamVjdH0gZG9tQ2hhbmdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyZUV2ZW50IChhcHAsIHJlZiwgdHlwZSwgZSwgZG9tQ2hhbmdlcykge1xuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBGaXJlIGEgXCIke3R5cGV9XCIgZXZlbnQgb24gYW4gZWxlbWVudCgke3JlZn0pIGluIGluc3RhbmNlKCR7YXBwLmlkfSlgKVxuICBpZiAoQXJyYXkuaXNBcnJheShyZWYpKSB7XG4gICAgcmVmLnNvbWUoKHJlZikgPT4ge1xuICAgICAgcmV0dXJuIGZpcmVFdmVudChhcHAsIHJlZiwgdHlwZSwgZSkgIT09IGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBlbCA9IGFwcC5kb2MuZ2V0UmVmKHJlZilcbiAgaWYgKGVsKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXBwLmRvYy5maXJlRXZlbnQoZWwsIHR5cGUsIGUsIGRvbUNoYW5nZXMpXG4gICAgYXBwLmRpZmZlci5mbHVzaCgpXG4gICAgYXBwLmRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAndXBkYXRlRmluaXNoJyB9LCBbXSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcIiR7cmVmfVwiYClcbn1cblxuLyoqXG4gKiBNYWtlIGEgY2FsbGJhY2sgZm9yIGEgY2VydGFpbiBhcHAuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgYXBwXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgY2FsbGJhY2tJZFxuICogQHBhcmFtICB7YW55fSAgICAgIGRhdGFcbiAqIEBwYXJhbSAge2Jvb2xlYW59ICBpZktlZXBBbGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsbGJhY2sgKGFwcCwgY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gSW52b2tlIGEgY2FsbGJhY2soJHtjYWxsYmFja0lkfSkgd2l0aGAsIGRhdGEsXG4gICAgICAgICAgICBgaW4gaW5zdGFuY2UoJHthcHAuaWR9KWApXG4gIGNvbnN0IHJlc3VsdCA9IGFwcC5kb2MudGFza0NlbnRlci5jYWxsYmFjayhjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSlcbiAgdXBkYXRlQWN0aW9ucyhhcHApXG4gIGFwcC5kb2MudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ3VwZGF0ZUZpbmlzaCcgfSwgW10pXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFsbCB2aXJ0dWFsLURPTSBtdXRhdGlvbnMgdG9nZXRoZXIgYW5kIHNlbmQgdGhlbSB0byByZW5kZXJlci5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBY3Rpb25zIChhcHApIHtcbiAgYXBwLmRpZmZlci5mbHVzaCgpXG59XG5cbi8qKlxuICogQ2FsbCBhbGwgdGFza3MgZnJvbSBhbiBhcHAgdG8gcmVuZGVyZXIgKG5hdGl2ZSkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHBhcmFtICB7YXJyYXl9ICB0YXNrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsbFRhc2tzIChhcHAsIHRhc2tzKSB7XG4gIGxldCByZXN1bHRcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwb2YodGFza3MpICE9PSAnYXJyYXknKSB7XG4gICAgdGFza3MgPSBbdGFza3NdXG4gIH1cblxuICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgIHJlc3VsdCA9IGFwcC5kb2MudGFza0NlbnRlci5zZW5kKFxuICAgICAgJ21vZHVsZScsXG4gICAgICB7XG4gICAgICAgIG1vZHVsZTogdGFzay5tb2R1bGUsXG4gICAgICAgIG1ldGhvZDogdGFzay5tZXRob2RcbiAgICAgIH0sXG4gICAgICB0YXNrLmFyZ3NcbiAgICApXG4gIH0pXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIGluc3RhbmNlIGNvbnRyb2xzIGZyb20gbmF0aXZlXG4gKlxuICogLSBpbml0IGJ1bmRsZVxuICpcbiAqIGNvcnJlc3BvbmRlZCB3aXRoIHRoZSBBUEkgb2YgaW5zdGFuY2UgbWFuYWdlciAoZnJhbWV3b3JrLmpzKVxuICovXG5cbmltcG9ydCBWbSBmcm9tICcuLi8uLi92bS9pbmRleCdcbmltcG9ydCB7IHJlbW92ZVdlZXhQcmVmaXggfSBmcm9tICcuLi8uLi91dGlsL2luZGV4J1xuaW1wb3J0IHtcbiAgZGVmaW5lRm4sXG4gIGJvb3RzdHJhcCxcbiAgcmVnaXN0ZXJcbn0gZnJvbSAnLi4vYnVuZGxlL2luZGV4J1xuaW1wb3J0IHsgdXBkYXRlQWN0aW9ucyB9IGZyb20gJy4vbWlzYydcblxuLyoqXG4gKiBJbml0IGFuIGFwcCBieSBydW4gY29kZSB3aXRnaCBkYXRhXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKGFwcCwgY29kZSwgZGF0YSwgc2VydmljZXMpIHtcbiAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gSW50aWFsaXplIGFuIGluc3RhbmNlIHdpdGg6XFxuJywgZGF0YSlcbiAgbGV0IHJlc3VsdFxuXG4gIC8vIHByZXBhcmUgYXBwIGVudiBtZXRob2RzXG4gIGNvbnN0IGJ1bmRsZURlZmluZSA9ICguLi5hcmdzKSA9PiBkZWZpbmVGbihhcHAsIC4uLmFyZ3MpXG4gIGNvbnN0IGJ1bmRsZUJvb3RzdHJhcCA9IChuYW1lLCBjb25maWcsIF9kYXRhKSA9PiB7XG4gICAgcmVzdWx0ID0gYm9vdHN0cmFwKGFwcCwgbmFtZSwgY29uZmlnLCBfZGF0YSB8fCBkYXRhKVxuICAgIHVwZGF0ZUFjdGlvbnMoYXBwKVxuICAgIGFwcC5kb2MubGlzdGVuZXIuY3JlYXRlRmluaXNoKClcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBBZnRlciBpbnRpYWxpemVkIGFuIGluc3RhbmNlKCR7YXBwLmlkfSlgKVxuICB9XG4gIGNvbnN0IGJ1bmRsZVZtID0gVm1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgY29uc3QgYnVuZGxlUmVnaXN0ZXIgPSAoLi4uYXJncykgPT4gcmVnaXN0ZXIoYXBwLCAuLi5hcmdzKVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdCBidW5kbGVSZW5kZXIgPSAobmFtZSwgX2RhdGEpID0+IHtcbiAgICByZXN1bHQgPSBib290c3RyYXAoYXBwLCBuYW1lLCB7fSwgX2RhdGEpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgY29uc3QgYnVuZGxlUmVxdWlyZSA9IG5hbWUgPT4gX2RhdGEgPT4ge1xuICAgIHJlc3VsdCA9IGJvb3RzdHJhcChhcHAsIG5hbWUsIHt9LCBfZGF0YSlcbiAgfVxuICBjb25zdCBidW5kbGVEb2N1bWVudCA9IGFwcC5kb2NcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgY29uc3QgYnVuZGxlUmVxdWlyZU1vZHVsZSA9IG5hbWUgPT4gYXBwLnJlcXVpcmVNb2R1bGUocmVtb3ZlV2VleFByZWZpeChuYW1lKSlcblxuICBjb25zdCB3ZWV4R2xvYmFsT2JqZWN0ID0ge1xuICAgIGNvbmZpZzogYXBwLm9wdGlvbnMsXG4gICAgZGVmaW5lOiBidW5kbGVEZWZpbmUsXG4gICAgYm9vdHN0cmFwOiBidW5kbGVCb290c3RyYXAsXG4gICAgcmVxdWlyZU1vZHVsZTogYnVuZGxlUmVxdWlyZU1vZHVsZSxcbiAgICBkb2N1bWVudDogYnVuZGxlRG9jdW1lbnQsXG4gICAgVm06IGJ1bmRsZVZtXG4gIH1cblxuICBPYmplY3QuZnJlZXplKHdlZXhHbG9iYWxPYmplY3QpXG5cbiAgLy8gcHJlcGFyZSBjb2RlXG4gIGxldCBmdW5jdGlvbkJvZHlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgY29kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIGBmdW5jdGlvbiAoKSB7Li4ufWAgLT4gYHsuLi59YFxuICAgIC8vIG5vdCB2ZXJ5IHN0cmljdFxuICAgIGZ1bmN0aW9uQm9keSA9IGNvZGUudG9TdHJpbmcoKS5zdWJzdHIoMTIpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZWxzZSBpZiAoY29kZSkge1xuICAgIGZ1bmN0aW9uQm9keSA9IGNvZGUudG9TdHJpbmcoKVxuICB9XG4gIC8vIHdyYXAgSUZGRSBhbmQgdXNlIHN0cmljdCBtb2RlXG4gIGZ1bmN0aW9uQm9keSA9IGAoZnVuY3Rpb24oZ2xvYmFsKXtcXG5cXG5cInVzZSBzdHJpY3RcIjtcXG5cXG4gJHtmdW5jdGlvbkJvZHl9IFxcblxcbn0pKE9iamVjdC5jcmVhdGUodGhpcykpYFxuXG4gIC8vIHJ1biBjb2RlIGFuZCBnZXQgcmVzdWx0XG4gIGNvbnN0IHsgV1hFbnZpcm9ubWVudCB9ID0gZ2xvYmFsXG4gIGNvbnN0IHRpbWVyQVBJcyA9IHt9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChXWEVudmlyb25tZW50ICYmIFdYRW52aXJvbm1lbnQucGxhdGZvcm0gIT09ICdXZWInKSB7XG4gICAgLy8gdGltZXIgQVBJcyBwb2x5ZmlsbCBpbiBuYXRpdmVcbiAgICBjb25zdCB0aW1lciA9IGFwcC5yZXF1aXJlTW9kdWxlKCd0aW1lcicpXG4gICAgT2JqZWN0LmFzc2lnbih0aW1lckFQSXMsIHtcbiAgICAgIHNldFRpbWVvdXQ6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXJnc1swXSguLi5hcmdzLnNsaWNlKDIpKVxuICAgICAgICB9XG4gICAgICAgIHRpbWVyLnNldFRpbWVvdXQoaGFuZGxlciwgYXJnc1sxXSlcbiAgICAgICAgcmV0dXJuIGFwcC5kb2MudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIHNldEludGVydmFsOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFyZ3NbMF0oLi4uYXJncy5zbGljZSgyKSlcbiAgICAgICAgfVxuICAgICAgICB0aW1lci5zZXRJbnRlcnZhbChoYW5kbGVyLCBhcmdzWzFdKVxuICAgICAgICByZXR1cm4gYXBwLmRvYy50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpXG4gICAgICB9LFxuICAgICAgY2xlYXJUaW1lb3V0OiAobikgPT4ge1xuICAgICAgICB0aW1lci5jbGVhclRpbWVvdXQobilcbiAgICAgIH0sXG4gICAgICBjbGVhckludGVydmFsOiAobikgPT4ge1xuICAgICAgICB0aW1lci5jbGVhckludGVydmFsKG4pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvLyBydW4gY29kZSBhbmQgZ2V0IHJlc3VsdFxuICBjb25zdCBnbG9iYWxPYmplY3RzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgZGVmaW5lOiBidW5kbGVEZWZpbmUsXG4gICAgcmVxdWlyZTogYnVuZGxlUmVxdWlyZSxcbiAgICBib290c3RyYXA6IGJ1bmRsZUJvb3RzdHJhcCxcbiAgICByZWdpc3RlcjogYnVuZGxlUmVnaXN0ZXIsXG4gICAgcmVuZGVyOiBidW5kbGVSZW5kZXIsXG4gICAgX193ZWV4X2RlZmluZV9fOiBidW5kbGVEZWZpbmUsIC8vIGFsaWFzIGZvciBkZWZpbmVcbiAgICBfX3dlZXhfYm9vdHN0cmFwX186IGJ1bmRsZUJvb3RzdHJhcCwgLy8gYWxpYXMgZm9yIGJvb3RzdHJhcFxuICAgIF9fd2VleF9kb2N1bWVudF9fOiBidW5kbGVEb2N1bWVudCxcbiAgICBfX3dlZXhfcmVxdWlyZV9fOiBidW5kbGVSZXF1aXJlTW9kdWxlLFxuICAgIF9fd2VleF92aWV3bW9kZWxfXzogYnVuZGxlVm0sXG4gICAgd2VleDogd2VleEdsb2JhbE9iamVjdFxuICB9LCB0aW1lckFQSXMsIHNlcnZpY2VzKVxuICBpZiAoIWNhbGxGdW5jdGlvbk5hdGl2ZShnbG9iYWxPYmplY3RzLCBmdW5jdGlvbkJvZHkpKSB7XG4gICAgLy8gSWYgZmFpbGVkIHRvIGNvbXBpbGUgZnVuY3Rpb25Cb2R5IG9uIG5hdGl2ZSBzaWRlLFxuICAgIC8vIGZhbGxiYWNrIHRvIGNhbGxGdW5jdGlvbi5cbiAgICBjYWxsRnVuY3Rpb24oZ2xvYmFsT2JqZWN0cywgZnVuY3Rpb25Cb2R5KVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIENhbGwgYSBuZXcgZnVuY3Rpb24gYm9keSB3aXRoIHNvbWUgZ2xvYmFsIG9iamVjdHMuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGdsb2JhbE9iamVjdHNcbiAqIEBwYXJhbSAge3N0cmluZ30gY29kZVxuICogQHJldHVybiB7YW55fVxuICovXG5mdW5jdGlvbiBjYWxsRnVuY3Rpb24gKGdsb2JhbE9iamVjdHMsIGJvZHkpIHtcbiAgY29uc3QgZ2xvYmFsS2V5cyA9IFtdXG4gIGNvbnN0IGdsb2JhbFZhbHVlcyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIGdsb2JhbE9iamVjdHMpIHtcbiAgICBnbG9iYWxLZXlzLnB1c2goa2V5KVxuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSlcbiAgfVxuICBnbG9iYWxLZXlzLnB1c2goYm9keSlcblxuICBjb25zdCByZXN1bHQgPSBuZXcgRnVuY3Rpb24oLi4uZ2xvYmFsS2V5cylcbiAgcmV0dXJuIHJlc3VsdCguLi5nbG9iYWxWYWx1ZXMpXG59XG5cbi8qKlxuICogQ2FsbCBhIG5ldyBmdW5jdGlvbiBnZW5lcmF0ZWQgb24gdGhlIFY4IG5hdGl2ZSBzaWRlLlxuICogQHBhcmFtICB7b2JqZWN0fSBnbG9iYWxPYmplY3RzXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGJvZHlcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybiB0cnVlIGlmIG5vIGVycm9yIG9jY3VycmVkLlxuICovXG5mdW5jdGlvbiBjYWxsRnVuY3Rpb25OYXRpdmUgKGdsb2JhbE9iamVjdHMsIGJvZHkpIHtcbiAgaWYgKHR5cGVvZiBjb21waWxlQW5kUnVuQnVuZGxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBsZXQgZm4gPSB2b2lkIDBcbiAgbGV0IGlzTmF0aXZlQ29tcGlsZU9rID0gZmFsc2VcbiAgbGV0IHNjcmlwdCA9ICcoZnVuY3Rpb24gKCdcbiAgY29uc3QgZ2xvYmFsS2V5cyA9IFtdXG4gIGNvbnN0IGdsb2JhbFZhbHVlcyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIGdsb2JhbE9iamVjdHMpIHtcbiAgICBnbG9iYWxLZXlzLnB1c2goa2V5KVxuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSlcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGdsb2JhbEtleXMubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgc2NyaXB0ICs9IGdsb2JhbEtleXNbaV1cbiAgICBzY3JpcHQgKz0gJywnXG4gIH1cbiAgc2NyaXB0ICs9IGdsb2JhbEtleXNbZ2xvYmFsS2V5cy5sZW5ndGggLSAxXVxuICBzY3JpcHQgKz0gJykgeydcbiAgc2NyaXB0ICs9IGJvZHlcbiAgc2NyaXB0ICs9ICd9ICknXG5cbiAgdHJ5IHtcbiAgICBjb25zdCB3ZWV4ID0gZ2xvYmFsT2JqZWN0cy53ZWV4IHx8IHt9XG4gICAgY29uc3QgY29uZmlnID0gd2VleC5jb25maWcgfHwge31cbiAgICBmbiA9IGNvbXBpbGVBbmRSdW5CdW5kbGUoc2NyaXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYnVuZGxlVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYnVuZGxlRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY29kZUNhY2hlUGF0aClcbiAgICBpZiAoZm4gJiYgdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmbiguLi5nbG9iYWxWYWx1ZXMpXG4gICAgICBpc05hdGl2ZUNvbXBpbGVPayA9IHRydWVcbiAgICB9XG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGUpXG4gIH1cblxuICByZXR1cm4gaXNOYXRpdmVDb21waWxlT2tcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBpbnN0YW5jZSBjb250cm9scyBmcm9tIG5hdGl2ZVxuICpcbiAqIC0gaW5pdCBidW5kbGVcbiAqIC0gZmlyZSBldmVudFxuICogLSBjYWxsYmFja1xuICogLSBkZXN0cm95XG4gKlxuICogY29ycmVzcG9uZGVkIHdpdGggdGhlIEFQSSBvZiBpbnN0YW5jZSBtYW5hZ2VyIChmcmFtZXdvcmsuanMpXG4gKi9cbmV4cG9ydCB7IGluaXQgfSBmcm9tICcuL2luaXQnXG5cbmV4cG9ydCB7XG4gIHJlZnJlc2gsXG4gIGRlc3Ryb3ksXG4gIGdldFJvb3RFbGVtZW50LFxuICBmaXJlRXZlbnQsXG4gIGNhbGxiYWNrLFxuICB1cGRhdGVBY3Rpb25zLFxuICBjYWxsVGFza3Ncbn0gZnJvbSAnLi9taXNjJ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWZmZXIge1xuICBjb25zdHJ1Y3RvciAoaWQpIHtcbiAgICB0aGlzLmlkID0gaWRcbiAgICB0aGlzLm1hcCA9IFtdXG4gICAgdGhpcy5ob29rcyA9IFtdXG4gIH1cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmxlbmd0aCA9PT0gMFxuICB9XG4gIGFwcGVuZCAodHlwZSwgZGVwdGgsIHJlZiwgaGFuZGxlcikge1xuICAgIGlmICghdGhpcy5oYXNUaW1lcikge1xuICAgICAgdGhpcy5oYXNUaW1lciA9IHRydWVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhhc1RpbWVyID0gZmFsc2VcbiAgICAgICAgdGhpcy5mbHVzaCh0cnVlKVxuICAgICAgfSwgMClcbiAgICB9XG4gICAgY29uc3QgbWFwID0gdGhpcy5tYXBcbiAgICBpZiAoIW1hcFtkZXB0aF0pIHtcbiAgICAgIG1hcFtkZXB0aF0gPSB7fVxuICAgIH1cbiAgICBjb25zdCBncm91cCA9IG1hcFtkZXB0aF1cbiAgICBpZiAoIWdyb3VwW3R5cGVdKSB7XG4gICAgICBncm91cFt0eXBlXSA9IHt9XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnZWxlbWVudCcpIHtcbiAgICAgIGlmICghZ3JvdXBbdHlwZV1bcmVmXSkge1xuICAgICAgICBncm91cFt0eXBlXVtyZWZdID0gW11cbiAgICAgIH1cbiAgICAgIGdyb3VwW3R5cGVdW3JlZl0ucHVzaChoYW5kbGVyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGdyb3VwW3R5cGVdW3JlZl0gPSBoYW5kbGVyXG4gICAgfVxuICB9XG4gIGZsdXNoIChpc1RpbWVvdXQpIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLm1hcC5zbGljZSgpXG4gICAgdGhpcy5tYXAubGVuZ3RoID0gMFxuICAgIG1hcC5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgY2FsbFR5cGVNYXAoZ3JvdXAsICdyZXBlYXQnKVxuICAgICAgY2FsbFR5cGVNYXAoZ3JvdXAsICdzaG93bicpXG4gICAgICBjYWxsVHlwZUxpc3QoZ3JvdXAsICdlbGVtZW50JylcbiAgICB9KVxuXG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmhvb2tzLnNsaWNlKClcbiAgICB0aGlzLmhvb2tzLmxlbmd0aCA9IDBcbiAgICBob29rcy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgZm4oKVxuICAgIH0pXG5cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmZsdXNoKClcbiAgICB9XG4gIH1cbiAgdGhlbiAoZm4pIHtcbiAgICB0aGlzLmhvb2tzLnB1c2goZm4pXG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbFR5cGVNYXAgKGdyb3VwLCB0eXBlKSB7XG4gIGNvbnN0IG1hcCA9IGdyb3VwW3R5cGVdXG4gIGZvciAoY29uc3QgcmVmIGluIG1hcCkge1xuICAgIG1hcFtyZWZdKClcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsVHlwZUxpc3QgKGdyb3VwLCB0eXBlKSB7XG4gIGNvbnN0IG1hcCA9IGdyb3VwW3R5cGVdXG4gIGZvciAoY29uc3QgcmVmIGluIG1hcCkge1xuICAgIGNvbnN0IGxpc3QgPSBtYXBbcmVmXVxuICAgIGxpc3QuZm9yRWFjaCgoaGFuZGxlcikgPT4geyBoYW5kbGVyKCkgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFdlZXggQXBwIGNvbnN0cnVjdG9yICYgZGVmaW5pdGlvblxuICovXG5cbmltcG9ydCBEaWZmZXIgZnJvbSAnLi9kaWZmZXInXG5pbXBvcnQgcmVuZGVyZXIgZnJvbSAnLi4vY29uZmlnJ1xuXG4vKipcbiAqIEFwcCBjb25zdHJ1Y3RvciBmb3IgV2VleCBmcmFtZXdvcmsuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCAoaWQsIG9wdGlvbnMpIHtcbiAgdGhpcy5pZCA9IGlkXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy52bSA9IG51bGxcbiAgdGhpcy5jdXN0b21Db21wb25lbnRNYXAgPSB7fVxuICB0aGlzLmNvbW1vbk1vZHVsZXMgPSB7fVxuXG4gIC8vIGRvY3VtZW50XG4gIHRoaXMuZG9jID0gbmV3IHJlbmRlcmVyLkRvY3VtZW50KFxuICAgIGlkLFxuICAgIHRoaXMub3B0aW9ucy5idW5kbGVVcmwsXG4gICAgbnVsbCxcbiAgICByZW5kZXJlci5MaXN0ZW5lclxuICApXG4gIHRoaXMuZGlmZmVyID0gbmV3IERpZmZlcihpZClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBXZWV4IGluc3RhbmNlIGNvbnN0cnVjdG9yICYgZGVmaW5pdGlvblxuICovXG5cbmltcG9ydCB7IHJlcXVpcmVNb2R1bGUgfSBmcm9tICcuL3JlZ2lzdGVyJ1xuaW1wb3J0IHsgdXBkYXRlQWN0aW9ucywgY2FsbFRhc2tzIH0gZnJvbSAnLi9jdHJsL2luZGV4J1xuaW1wb3J0IEFwcCBmcm9tICcuL2luc3RhbmNlJ1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbkFwcC5wcm90b3R5cGUucmVxdWlyZU1vZHVsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiByZXF1aXJlTW9kdWxlKHRoaXMsIG5hbWUpXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuQXBwLnByb3RvdHlwZS51cGRhdGVBY3Rpb25zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdXBkYXRlQWN0aW9ucyh0aGlzKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbkFwcC5wcm90b3R5cGUuY2FsbFRhc2tzID0gZnVuY3Rpb24gKHRhc2tzKSB7XG4gIHJldHVybiBjYWxsVGFza3ModGhpcywgdGFza3MpXG59XG5cbi8qKlxuICogUHJldmVudCBtb2RpZmljYXRpb24gb2YgQXBwIGFuZCBBcHAucHJvdG90eXBlXG4gKi9cbk9iamVjdC5mcmVlemUoQXBwKVxuT2JqZWN0LmZyZWV6ZShBcHAucHJvdG90eXBlKVxuXG5leHBvcnQgZGVmYXVsdCBBcHBcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlTWFwID0ge31cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IEFwcCBmcm9tICcuLi9hcHAvaW5kZXgnXG5pbXBvcnQgeyBpbnN0YW5jZU1hcCB9IGZyb20gJy4vbWFwJ1xuaW1wb3J0IHsgaW5pdCBhcyBpbml0QXBwIH0gZnJvbSAnLi4vYXBwL2N0cmwvaW5kZXgnXG5pbXBvcnQgeyByZXNldFRhcmdldCB9IGZyb20gJy4uL2NvcmUvZGVwJ1xuXG4vKipcbiAqIENyZWF0ZSBhIFdlZXggaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnNcbiAqICAgICAgICAgb3B0aW9uIGBIQVNfTE9HYCBlbmFibGUgcHJpbnQgbG9nXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGFcbiAqIEBwYXJhbSAge29iamVjdH0gaW5mbyB7IGNyZWF0ZWQsIC4uLiBzZXJ2aWNlcyB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSAoaWQsIGNvZGUsIG9wdGlvbnMsIGRhdGEsIGluZm8pIHtcbiAgY29uc3QgeyBzZXJ2aWNlcyB9ID0gaW5mbyB8fCB7fVxuICByZXNldFRhcmdldCgpXG4gIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlTWFwW2lkXVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICBsZXQgcmVzdWx0XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICBpbnN0YW5jZSA9IG5ldyBBcHAoaWQsIG9wdGlvbnMpXG4gICAgaW5zdGFuY2VNYXBbaWRdID0gaW5zdGFuY2VcbiAgICByZXN1bHQgPSBpbml0QXBwKGluc3RhbmNlLCBjb2RlLCBkYXRhLCBzZXJ2aWNlcylcbiAgfVxuICBlbHNlIHtcbiAgICByZXN1bHQgPSBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuICByZXR1cm4gKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSA/IHJlc3VsdCA6IGluc3RhbmNlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuaW1wb3J0IHtcbiAgcmVmcmVzaCxcbiAgZGVzdHJveVxufSBmcm9tICcuLi9hcHAvY3RybC9pbmRleCdcbmltcG9ydCB7IGluc3RhbmNlTWFwIH0gZnJvbSAnLi9tYXAnXG5pbXBvcnQgeyByZXNldFRhcmdldCB9IGZyb20gJy4uL2NvcmUvZGVwJ1xuXG4vKipcbiAqIEluaXQgY29uZmlnIGluZm9ybWF0aW9ucyBmb3IgV2VleCBmcmFtZXdvcmtcbiAqIEBwYXJhbSAge29iamVjdH0gY2ZnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0IChjZmcpIHtcbiAgY29uZmlnLkRvY3VtZW50ID0gY2ZnLkRvY3VtZW50XG4gIGNvbmZpZy5FbGVtZW50ID0gY2ZnLkVsZW1lbnRcbiAgY29uZmlnLkNvbW1lbnQgPSBjZmcuQ29tbWVudFxuICBjb25maWcuc2VuZFRhc2tzID0gY2ZnLnNlbmRUYXNrc1xuICBjb25maWcuTGlzdGVuZXIgPSBjZmcuTGlzdGVuZXJcbn1cblxuLyoqXG4gKiBSZWZyZXNoIGEgV2VleCBpbnN0YW5jZSB3aXRoIGRhdGEuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHBhcmFtICB7b2JqZWN0fSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoSW5zdGFuY2UgKGlkLCBkYXRhKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGxldCByZXN1bHRcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmVzdWx0ID0gcmVmcmVzaChpbnN0YW5jZSwgZGF0YSlcbiAgfVxuICBlbHNlIHtcbiAgICByZXN1bHQgPSBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogRGVzdHJveSBhIFdlZXggaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGlkKSB7XG4gIC8vIE1hcmt1cCBzb21lIGdsb2JhbCBzdGF0ZSBpbiBuYXRpdmUgc2lkZVxuICBpZiAodHlwZW9mIG1hcmt1cFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWFya3VwU3RhdGUoKVxuICB9XG5cbiAgcmVzZXRUYXJnZXQoKVxuICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlTWFwW2lkXVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBpbnN0YW5jZSBpZCBcIiR7aWR9XCJgKVxuICB9XG4gIGRlc3Ryb3koaW5zdGFuY2UpXG4gIGRlbGV0ZSBpbnN0YW5jZU1hcFtpZF1cbiAgLy8gbm90aWZ5Q29udGV4dERpc3Bvc2VkIGlzIHVzZWQgdG8gdGVsbCB2OCB0byBkbyBhIGZ1bGwgR0MsXG4gIC8vIGJ1dCB0aGlzIHdvdWxkIGhhdmUgYSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gd2VleCxcbiAgLy8gYmVjYXVzZSBhbGwgdGhlIGlubGluZSBjYWNoZSBpbiB2OCB3b3VsZCBnZXQgY2xlYXJlZFxuICAvLyBkdXJpbmcgYSBmdWxsIEdDLlxuICAvLyBUbyB0YWtlIGNhcmUgb2YgYm90aCBtZW1vcnkgYW5kIHBlcmZvcm1hbmNlLCBqdXN0IHRlbGwgdjhcbiAgLy8gdG8gZG8gYSBmdWxsIEdDIGV2ZXJ5IGVpZ2h0ZWVuIHRpbWVzLlxuICBjb25zdCBpZE51bSA9IE1hdGgucm91bmQoaWQpXG4gIGNvbnN0IHJvdW5kID0gMThcbiAgaWYgKGlkTnVtID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGlkTnVtICUgcm91bmRcbiAgICBpZiAoIXJlbWFpbmRlciAmJiB0eXBlb2Ygbm90aWZ5VHJpbU1lbW9yeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbm90aWZ5VHJpbU1lbW9yeSgpXG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0YW5jZU1hcFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgVm0gZnJvbSAnLi4vdm0vaW5kZXgnXG5pbXBvcnQgY29uZmlnIGZyb20gJy4uL2NvbmZpZydcbmltcG9ydCB7XG4gIGluaXRNb2R1bGVzLFxuICBpbml0TWV0aG9kc1xufSBmcm9tICcuLi9hcHAvcmVnaXN0ZXInXG5cbmNvbnN0IHtcbiAgbmF0aXZlQ29tcG9uZW50TWFwXG59ID0gY29uZmlnXG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgb2YgZWFjaCBuYXRpdmUgY29tcG9uZW50LlxuICogQHBhcmFtICB7YXJyYXl9IGNvbXBvbmVudHMgYXJyYXkgb2YgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzIChjb21wb25lbnRzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudHMpKSB7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIHJlZ2lzdGVyIChuYW1lKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmF0aXZlQ29tcG9uZW50TWFwW25hbWVdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmFtZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYXRpdmVDb21wb25lbnRNYXBbbmFtZS50eXBlXSA9IG5hbWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBtb2R1bGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG1vZHVsZXMgYSBvYmplY3Qgb2YgbW9kdWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVzIChtb2R1bGVzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gJ29iamVjdCcpIHtcbiAgICBpbml0TW9kdWxlcyhtb2R1bGVzKVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBhcGkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwaXMgYSBvYmplY3Qgb2YgYXBpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZXRob2RzIChtZXRob2RzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgbWV0aG9kcyA9PT0gJ29iamVjdCcpIHtcbiAgICBpbml0TWV0aG9kcyhWbSwgbWV0aG9kcylcbiAgfVxufVxuXG4vLyBAdG9kbzogSGFjayBmb3IgdGhpcyBmcmFtZXdvcmsgb25seS4gV2lsbCBiZSByZS1kZXNpZ25lZCBvciByZW1vdmVkIGxhdGVyLlxuZ2xvYmFsLnJlZ2lzdGVyTWV0aG9kcyA9IHJlZ2lzdGVyTWV0aG9kc1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBpbnN0YW5jZU1hcCB9IGZyb20gJy4vbWFwJ1xuaW1wb3J0IHtcbiAgZmlyZUV2ZW50LFxuICBjYWxsYmFja1xufSBmcm9tICcuLi9hcHAvY3RybC9pbmRleCdcblxuY29uc3QganNIYW5kbGVycyA9IHtcbiAgZmlyZUV2ZW50OiAoaWQsIC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gZmlyZUV2ZW50KGluc3RhbmNlTWFwW2lkXSwgLi4uYXJncylcbiAgfSxcbiAgY2FsbGJhY2s6IChpZCwgLi4uYXJncykgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhpbnN0YW5jZU1hcFtpZF0sIC4uLmFyZ3MpXG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0gIHthcnJheX0gdGFza3MgbGlzdCB3aXRoIGBtZXRob2RgIGFuZCBgYXJnc2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVUYXNrcyAoaWQsIHRhc2tzKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGlmIChpbnN0YW5jZSAmJiBBcnJheS5pc0FycmF5KHRhc2tzKSkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXVxuICAgIHRhc2tzLmZvckVhY2goKHRhc2spID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBqc0hhbmRsZXJzW3Rhc2subWV0aG9kXVxuICAgICAgY29uc3QgYXJncyA9IFsuLi50YXNrLmFyZ3NdXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChpZClcbiAgICAgICAgcmVzdWx0cy5wdXNoKGhhbmRsZXIoLi4uYXJncykpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG4gIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiIG9yIHRhc2tzYClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgaW5zdGFuY2VNYXAgfSBmcm9tICcuL21hcCdcbmltcG9ydCB7XG4gIGdldFJvb3RFbGVtZW50XG59IGZyb20gJy4uL2FwcC9jdHJsL2luZGV4J1xuXG4vKipcbiAqIEdldCBhIHdob2xlIGVsZW1lbnQgdHJlZSBvZiBhbiBpbnN0YW5jZSBmb3IgZGVidWdnaW5nLlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7b2JqZWN0fSBhIHZpcnR1YWwgZG9tIHRyZWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3QgKGlkKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGxldCByZXN1bHRcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmVzdWx0ID0gZ2V0Um9vdEVsZW1lbnQoaW5zdGFuY2UpXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzdWx0ID0gbmV3IEVycm9yKGBpbnZhbGlkIGluc3RhbmNlIGlkIFwiJHtpZH1cImApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgV2VleCBmcmFtZXdvcmsgZW50cnkuXG4gKi9cblxuaW1wb3J0ICogYXMgbWV0aG9kcyBmcm9tICcuL2FwaS9tZXRob2RzJ1xuXG5pbXBvcnQgVm0gZnJvbSAnLi92bSdcbmV4cG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSAnLi9zdGF0aWMvY3JlYXRlJ1xuZXhwb3J0IHsgaW5pdCwgcmVmcmVzaEluc3RhbmNlLCBkZXN0cm95SW5zdGFuY2UgfSBmcm9tICcuL3N0YXRpYy9saWZlJ1xuaW1wb3J0IHsgcmVnaXN0ZXJDb21wb25lbnRzLCByZWdpc3Rlck1vZHVsZXMsIHJlZ2lzdGVyTWV0aG9kcyB9IGZyb20gJy4vc3RhdGljL3JlZ2lzdGVyJ1xuZXhwb3J0IHsgcmVjZWl2ZVRhc2tzIH0gZnJvbSAnLi9zdGF0aWMvYnJpZGdlJ1xuZXhwb3J0IHsgZ2V0Um9vdCB9IGZyb20gJy4vc3RhdGljL21pc2MnXG5cbi8vIHJlZ2lzdGVyIHNwZWNpYWwgbWV0aG9kcyBmb3IgV2VleCBmcmFtZXdvcmtcbnJlZ2lzdGVyTWV0aG9kcyhtZXRob2RzKVxuXG4vKipcbiAqIFByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIFZtIGFuZCBWbS5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmZyZWV6ZShWbSlcblxuZXhwb3J0IHsgcmVnaXN0ZXJDb21wb25lbnRzLCByZWdpc3Rlck1vZHVsZXMsIHJlZ2lzdGVyTWV0aG9kcyB9XG4iLCJtb2R1bGUuZXhwb3J0cyA9IC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL25vZGVfbW9kdWxlcy9ldmVudC10YXJnZXQtc2hpbS9saWIvY29tbW9ucy5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmlxdWUga2V5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQSBuYW1lIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIHtzeW1ib2x8c3RyaW5nfSBHZW5lcmF0ZWQgdW5pcXVlIGtleS5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBjcmVhdGVVbmlxdWVLZXkgPSBtb2R1bGUuZXhwb3J0cy5jcmVhdGVVbmlxdWVLZXkgPSAoXG4gICAgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbCA6IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIC8qIG90aGVyd2lzZSAqLyBmdW5jdGlvbiBjcmVhdGVVbmlxdWVLZXkobmFtZSkge1xuICAgICAgICByZXR1cm4gXCJbW1wiICsgbmFtZSArIFwiX1wiICsgTWF0aC5yYW5kb20oKS50b0ZpeGVkKDgpLnNsaWNlKDIpICsgXCJdXVwiXG4gICAgfVxuKVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdCBvciBub3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHggLSBUaGUgdmFsdWUgdG8gYmUgY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBpc09iamVjdCA9IG1vZHVsZS5leHBvcnRzLmlzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiB4ICE9PSBudWxsXG59XG5cbi8qKlxuICogVGhlIGtleSBvZiBsaXN0ZW5lcnMuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cy5MSVNURU5FUlMgPSBjcmVhdGVVbmlxdWVLZXkoXCJsaXN0ZW5lcnNcIilcblxuLyoqXG4gKiBBIHZhbHVlIG9mIGtpbmQgZm9yIGxpc3RlbmVycyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgY2FwdHVyaW5nIHBoYXNlLlxuICpcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cy5DQVBUVVJFID0gMVxuXG4vKipcbiAqIEEgdmFsdWUgb2Yga2luZCBmb3IgbGlzdGVuZXJzIHdoaWNoIGFyZSByZWdpc3RlcmVkIGluIHRoZSBidWJibGluZyBwaGFzZS5cbiAqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMuQlVCQkxFID0gMlxuXG4vKipcbiAqIEEgdmFsdWUgb2Yga2luZCBmb3IgbGlzdGVuZXJzIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMuQVRUUklCVVRFID0gM1xuXG4vKipcbiAqIEB0eXBlZGVmIG9iamVjdCBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGxpc3RlbmVyIC0gQSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBraW5kIC0gVGhlIGtpbmQgb2YgdGhlIGxpc3RlbmVyLlxuICogQHByb3BlcnR5IHtMaXN0ZW5lck5vZGV8bnVsbH0gbmV4dCAtIFRoZSBuZXh0IG5vZGUuXG4gKiAgICAgIElmIHRoaXMgbm9kZSBpcyB0aGUgbGFzdCwgdGhpcyBpcyBgbnVsbGAuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbm9kZSBvZiBzaW5nbHkgbGlua2VkIGxpc3QgZm9yIGEgbGlzdCBvZiBsaXN0ZW5lcnMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBBIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGtpbmQgLSBUaGUga2luZCBvZiB0aGUgbGlzdGVuZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm9uY2VdIC0gVGhlIGZsYWcgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBhdCB0aGUgZmlyc3QgY2FsbC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGFzc2l2ZV0gLSBUaGUgZmxhZyB0byBpZ25vcmUgYGV2ZW50LnByZXZlbnREZWZhdWx0YCBtZXRob2QuXG4gKiBAcmV0dXJucyB7TGlzdGVuZXJOb2RlfSBUaGUgY3JlYXRlZCBsaXN0ZW5lciBub2RlLlxuICovXG5tb2R1bGUuZXhwb3J0cy5uZXdOb2RlID0gZnVuY3Rpb24gbmV3Tm9kZShsaXN0ZW5lciwga2luZCwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBpc09iamVjdChvcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBvbmNlOiBvYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICBwYXNzaXZlOiBvYmogJiYgQm9vbGVhbihvcHRpb25zLnBhc3NpdmUpLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgIH1cbn1cblxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL2VtaXR0ZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBFdmVudEVtaXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRFbWl0dGVyKTtcblxuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2VcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRFbWl0dGVyLCBbe1xuICAgIGtleTogXCJfYWRkTGlzdGVuZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gfHwgW107XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaCh7IGxpc3RlbmVyOiBsaXN0ZW5lciwgb25jZTogb25jZSB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRFbWl0dGVyIGZvciBjaGFpbmluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRFbWl0dGVyIGZvciBjaGFpbmluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIC8vIGFsaWFzXG4gICAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZmlsdGVyKGZ1bmN0aW9uIChfbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuICEoX2xpc3RlbmVyLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIHNwZWNpZmllZCBldmVudC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGluc3RhbmNlIG9mIEV2ZW50RW1pdHRlciBmb3IgY2hhaW5pbmcuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtaXQodHlwZSwgcGF5bG9hZCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZm9yRWFjaChmdW5jdGlvbiAoX2xpc3RlbmVyKSB7XG4gICAgICAgIF9saXN0ZW5lci5saXN0ZW5lci5hcHBseShfdGhpcywgW3BheWxvYWRdKTtcbiAgICAgICAgaWYgKF9saXN0ZW5lci5vbmNlKSB7XG4gICAgICAgICAgX3RoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgX2xpc3RlbmVyLmxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRFbWl0dGVyO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvbm9kZV9tb2R1bGVzL2V2ZW50LXRhcmdldC1zaGltL2xpYi9ldmVudC10YXJnZXQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVxdWlyZW1lbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKmdsb2JhbHMgd2luZG93ICovXG5cbnZhciBDb21tb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb21tb25zICovIDApXG52YXIgQ3VzdG9tRXZlbnRUYXJnZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2N1c3RvbS1ldmVudC10YXJnZXQgKi8gMTUpXG52YXIgRXZlbnRXcmFwcGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9ldmVudC13cmFwcGVyICovIDE2KVxudmFyIGlzT2JqZWN0ID0gQ29tbW9ucy5pc09iamVjdFxudmFyIExJU1RFTkVSUyA9IENvbW1vbnMuTElTVEVORVJTXG52YXIgQ0FQVFVSRSA9IENvbW1vbnMuQ0FQVFVSRVxudmFyIEJVQkJMRSA9IENvbW1vbnMuQlVCQkxFXG52YXIgQVRUUklCVVRFID0gQ29tbW9ucy5BVFRSSUJVVEVcbnZhciBuZXdOb2RlID0gQ29tbW9ucy5uZXdOb2RlXG52YXIgZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQgPSBDdXN0b21FdmVudFRhcmdldC5kZWZpbmVDdXN0b21FdmVudFRhcmdldFxudmFyIGNyZWF0ZUV2ZW50V3JhcHBlciA9IEV2ZW50V3JhcHBlci5jcmVhdGVFdmVudFdyYXBwZXJcbnZhciBTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHID0gRXZlbnRXcmFwcGVyLlNUT1BfSU1NRURJQVRFX1BST1BBR0FUSU9OX0ZMQUdcbnZhciBQQVNTSVZFX0xJU1RFTkVSX0ZMQUcgPSBFdmVudFdyYXBwZXIuUEFTU0lWRV9MSVNURU5FUl9GTEFHXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQSBmbGFnIHdoaWNoIHNob3dzIHRoZXJlIGlzIHRoZSBuYXRpdmUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2Ugb2JqZWN0LlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xudmFyIEhBU19FVkVOVFRBUkdFVF9JTlRFUkZBQ0UgPSAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiB3aW5kb3cuRXZlbnRUYXJnZXQgIT09IFwidW5kZWZpbmVkXCJcbilcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBJbnRlcmZhY2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gZm9yIGBFdmVudFRhcmdldGAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG52YXIgRXZlbnRUYXJnZXQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgLy8gdGhpc1tMSVNURU5FUlNdIGlzIGEgTWFwLlxuICAgICAgICAvLyBJdHMga2V5IGlzIGV2ZW50IHR5cGUuXG4gICAgICAgIC8vIEl0cyB2YWx1ZSBpcyBMaXN0ZW5lck5vZGUgb2JqZWN0IG9yIG51bGwuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGludGVyZmFjZSBMaXN0ZW5lck5vZGUge1xuICAgICAgICAvLyAgICAgdmFyIGxpc3RlbmVyOiBGdW5jdGlvblxuICAgICAgICAvLyAgICAgdmFyIGtpbmQ6IENBUFRVUkV8QlVCQkxFfEFUVFJJQlVURVxuICAgICAgICAvLyAgICAgdmFyIG5leHQ6IExpc3RlbmVyTm9kZXxudWxsXG4gICAgICAgIC8vIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIExJU1RFTkVSUywge3ZhbHVlOiBPYmplY3QuY3JlYXRlKG51bGwpfSlcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KEV2ZW50VGFyZ2V0LCBhcmd1bWVudHNbMF0pXG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gdXNlIHRvIGV4dGVuZCB3aXRoIGF0dHJpYnV0ZSBsaXN0ZW5lciBwcm9wZXJ0aWVzLlxuICAgICAgICAvLyBlLmcuXG4gICAgICAgIC8vICAgICBjbGFzcyBNeUN1c3RvbU9iamVjdCBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiLCBcImVycm9yXCIpIHtcbiAgICAgICAgLy8gICAgICAgICAvLy4uLlxuICAgICAgICAvLyAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoRXZlbnRUYXJnZXQsIHR5cGVzKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKVxuICAgIH1cbn1cblxuRXZlbnRUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShcbiAgICAoSEFTX0VWRU5UVEFSR0VUX0lOVEVSRkFDRSA/IHdpbmRvdy5FdmVudFRhcmdldCA6IE9iamVjdCkucHJvdG90eXBlLFxuICAgIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgbGlzdGVuZXIgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlxcXCJsaXN0ZW5lclxcXCIgaXMgbm90IGFuIG9iamVjdC5cIilcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGlzT2JqZWN0KG9wdGlvbnMpID8gQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpIDogQm9vbGVhbihvcHRpb25zKVxuICAgICAgICAgICAgICAgIHZhciBraW5kID0gKGNhcHR1cmUgPyBDQVBUVVJFIDogQlVCQkxFKVxuICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpc1tMSVNURU5FUlNdW3R5cGVdXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW0xJU1RFTkVSU11bdHlwZV0gPSBuZXdOb2RlKGxpc3RlbmVyLCBraW5kLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gbnVsbFxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmIG5vZGUua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGlnbm9yZSBhIGR1cGxpY2F0ZWQgbGlzdGVuZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZVxuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZShsaXN0ZW5lciwga2luZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKSA/IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKSA6IEJvb2xlYW4ob3B0aW9ucylcbiAgICAgICAgICAgICAgICB2YXIga2luZCA9IChjYXB0dXJlID8gQ0FQVFVSRSA6IEJVQkJMRSlcbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IG51bGxcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXNbTElTVEVORVJTXVt0eXBlXVxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmIG5vZGUua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbTElTVEVORVJTXVt0eXBlXSA9IG5vZGUubmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIGRpc3BhdGNoRXZlbnQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBldmVudC50eXBlXG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzW0xJU1RFTkVSU11bdHlwZV1cbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgY2Fubm90IHJld3JpdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzLCBzbyB3cmFwIG9iamVjdC5cbiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlZCA9IGNyZWF0ZUV2ZW50V3JhcHBlcihldmVudCwgdGhpcylcblxuICAgICAgICAgICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBwYXJ0aWNpcGF0aW5nIGluIGEgdHJlZS5cbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IG51bGxcbiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxpc3RlbmVyIGlmIGl0J3Mgb25jZVxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tMSVNURU5FUlNdW3R5cGVdID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBub2RlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlZFtQQVNTSVZFX0xJU1RFTkVSX0ZMQUddID0gbm9kZS5wYXNzaXZlXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS5saXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmNhbGwodGhpcywgd3JhcHBlZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmtpbmQgIT09IEFUVFJJQlVURSAmJiB0eXBlb2Ygbm9kZS5saXN0ZW5lci5oYW5kbGVFdmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50KHdyYXBwZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBpZiBgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uYCB3YXMgY2FsbGVkLlxuICAgICAgICAgICAgICAgICAgICBpZiAod3JhcHBlZFtTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIXdyYXBwZWQuZGVmYXVsdFByZXZlbnRlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH1cbilcblxuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9pbmRleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLmdldEluc3RhbmNlID0gZ2V0SW5zdGFuY2U7XG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5yZWdpc3RlckNvbXBvbmVudHMgPSByZWdpc3RlckNvbXBvbmVudHM7XG5leHBvcnRzLnJlZ2lzdGVyTWV0aG9kcyA9IHJlZ2lzdGVyTWV0aG9kcztcbmV4cG9ydHMucmVnaXN0ZXJNb2R1bGVzID0gcmVnaXN0ZXJNb2R1bGVzO1xuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlO1xuZXhwb3J0cy5yZWZyZXNoSW5zdGFuY2UgPSByZWZyZXNoSW5zdGFuY2U7XG5leHBvcnRzLmRlc3Ryb3lJbnN0YW5jZSA9IGRlc3Ryb3lJbnN0YW5jZTtcbmV4cG9ydHMuZ2V0Um9vdCA9IGdldFJvb3Q7XG5leHBvcnRzLnJlY2VpdmVUYXNrcyA9IHJlY2VpdmVUYXNrcztcblxudmFyIF9idWlsdGluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9idWlsdGluICovIDQpO1xuXG52YXIgX2VtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2VtaXR0ZXIgKi8gMSk7XG5cbnZhciBfZW1pdHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbWl0dGVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIE5hdGl2ZUNvbXBvbmVudHMgPSB7fTtcbnZhciBOYXRpdmVNb2R1bGVzID0ge307XG5cbnZhciBEb2N1bWVudCA9IHZvaWQgMDtcbnZhciBFbGVtZW50ID0gdm9pZCAwO1xudmFyIENvbW1lbnQgPSB2b2lkIDA7XG5cbnZhciBNT0RVTEVfTkFNRV9QUkVGSVggPSAnQHdlZXgtbW9kdWxlLyc7XG52YXIgTU9EQUxfTU9EVUxFID0gTU9EVUxFX05BTUVfUFJFRklYICsgJ21vZGFsJztcbnZhciBOQVZJR0FUT1JfTU9EVUxFID0gTU9EVUxFX05BTUVfUFJFRklYICsgJ25hdmlnYXRvcic7XG4vLyBJbnN0YW5jZSBodWJcbnZhciBpbnN0YW5jZXMgPSB7fTtcbi8vIEJ1bmRsZXMgaHViXG52YXIgYnVuZGxlcyA9IHt9O1xudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRUb0luc3RhbmNlKGV2ZW50LCB0YXJnZXRPcmlnaW4pIHtcbiAgdmFyIGluc3RhbmNlO1xuICBmb3IgKHZhciBpIGluIGluc3RhbmNlcykge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIGluc3RhbmNlID0gaW5zdGFuY2VzW2ldO1xuICAgICAgaWYgKHRhcmdldE9yaWdpbiA9PT0gJyonIHx8IHRhcmdldE9yaWdpbiA9PT0gaW5zdGFuY2Uub3JpZ2luKSB7XG4gICAgICAgIGV2ZW50LnRhcmdldCA9IGluc3RhbmNlLndpbmRvdztcbiAgICAgICAgLy8gRklYTUU6IE5lZWQgYXN5bmM/XG4gICAgICAgIGluc3RhbmNlLndpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRmluaXNoKGRvYykge1xuICBkb2MudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ3VwZGF0ZUZpbmlzaCcgfSwgW10pO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZShpbnN0YW5jZUlkKSB7XG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgaWYgKCFpbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnN0YW5jZSBpZCBcIicgKyBpbnN0YW5jZUlkICsgJ1wiJyk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBpbml0KGNvbmZpZykge1xuICBEb2N1bWVudCA9IGNvbmZpZy5Eb2N1bWVudDtcbiAgRWxlbWVudCA9IGNvbmZpZy5FbGVtZW50O1xuICBDb21tZW50ID0gY29uZmlnLkNvbW1lbnQ7XG59XG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgb2YgZWFjaCBuYXRpdmUgY29tcG9uZW50XG4gKiBAcGFyYW0gIHthcnJheX0gY29tcG9uZW50cyBhcnJheSBvZiBuYW1lXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50cyhjb21wb25lbnRzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudHMpKSB7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIHJlZ2lzdGVyKG5hbWUpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgTmF0aXZlQ29tcG9uZW50c1tuYW1lXSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmFtZSkpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmFtZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBOYXRpdmVDb21wb25lbnRzW25hbWUudHlwZV0gPSBuYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBhcGlcbiAqIEBwYXJhbSAge29iamVjdH0gYXBpcyBhIG9iamVjdCBvZiBhcGlzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTWV0aG9kcyhhcGlzKSB7fVxuLy8gTm9vcFxuXG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBtb2R1bGVcbiAqIEBwYXJhbSAge29iamVjdH0gbW9kdWxlcyBhIG9iamVjdCBvZiBtb2R1bGVzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlcyhuZXdNb2R1bGVzKSB7XG4gIGlmICgodHlwZW9mIG5ld01vZHVsZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5ld01vZHVsZXMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIG5ld01vZHVsZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV3TW9kdWxlcywgbmFtZSkpIHtcbiAgICAgICAgTmF0aXZlTW9kdWxlc1tuYW1lXSA9IG5ld01vZHVsZXNbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbkJ1aWx0aW5Nb2R1bGVzKG1vZHVsZXMsIG1vZHVsZUZhY3RvcmllcywgY29udGV4dCkge1xuICBmb3IgKHZhciBtb2R1bGVOYW1lIGluIG1vZHVsZUZhY3Rvcmllcykge1xuICAgIG1vZHVsZXNbbW9kdWxlTmFtZV0gPSB7XG4gICAgICBmYWN0b3J5OiBtb2R1bGVGYWN0b3JpZXNbbW9kdWxlTmFtZV0uYmluZChjb250ZXh0KSxcbiAgICAgIG1vZHVsZTogeyBleHBvcnRzOiB7fSB9LFxuICAgICAgaXNJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIHJldHVybiBtb2R1bGVzO1xufVxuXG5mdW5jdGlvbiBnZW5OYXRpdmVNb2R1bGVzKG1vZHVsZXMsIGRvY3VtZW50KSB7XG4gIGlmICgodHlwZW9mIE5hdGl2ZU1vZHVsZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKE5hdGl2ZU1vZHVsZXMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChuYW1lKSB7XG4gICAgICB2YXIgbW9kdWxlTmFtZSA9IE1PRFVMRV9OQU1FX1BSRUZJWCArIG5hbWU7XG4gICAgICBtb2R1bGVzW21vZHVsZU5hbWVdID0ge1xuICAgICAgICBtb2R1bGU6IHsgZXhwb3J0czoge30gfSxcbiAgICAgICAgaXNJbml0aWFsaXplZDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgTmF0aXZlTW9kdWxlc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbWV0aG9kID0ge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IG1ldGhvZC5uYW1lO1xuXG4gICAgICAgIG1vZHVsZXNbbW9kdWxlTmFtZV0ubW9kdWxlLmV4cG9ydHNbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICB2YXIgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdEFyZyAmJiAodHlwZW9mIGxhc3RBcmcgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGxhc3RBcmcpKSA9PT0gJ29iamVjdCcgJiYgbGFzdEFyZy5fX3dlZXhfb3B0aW9uc19fKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gbGFzdEFyZy5fX3dlZXhfb3B0aW9uc19fO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGluIGFyZ3NcbiAgICAgICAgICAgIGFyZ3MucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGliYWJhL3dlZXgvaXNzdWVzLzE2NzdcbiAgICAgICAgICByZXR1cm4gZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdtb2R1bGUnLCB7XG4gICAgICAgICAgICBtb2R1bGU6IG5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWVcbiAgICAgICAgICB9LCBhcmdzLCBvcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIE5hdGl2ZU1vZHVsZXMpIHtcbiAgICAgIF9sb29wKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2R1bGVzO1xufVxuXG4vKipcbiAqIGNyZWF0ZSBhIFdlZXggaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluc3RhbmNlSWRcbiAqIEBwYXJhbSAge3N0cmluZ30gX193ZWV4X2NvZGVfX1xuICogQHBhcmFtICB7b2JqZWN0fSBbX193ZWV4X29wdGlvbnNfX10ge2J1bmRsZVVybCwgZGVidWd9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGluc3RhbmNlSWQsIF9fd2VleF9jb2RlX18sIF9fd2VleF9vcHRpb25zX18sIF9fd2VleF9kYXRhX18sIF9fd2VleF9jb25maWdfXykge1xuICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gIGlmIChpbnN0YW5jZSA9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBNYXJrIHN0YXJ0IHRpbWVcbiAgICB2YXIgcmVzcG9uc2VFbmQgPSBEYXRlLm5vdygpO1xuICAgIHZhciBfX3dlZXhfZW52X18gPSAodHlwZW9mIFdYRW52aXJvbm1lbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKFdYRW52aXJvbm1lbnQpKSA9PT0gJ29iamVjdCcgJiYgV1hFbnZpcm9ubWVudCB8fCB7fTtcbiAgICAvLyBGb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHVzZSBidWlsdC1pbiBwcm9taXNlIGZpcnN0XG4gICAgdmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJ1bnRpbWUtc2hhcmVkL2Rpc3Qvc2hhcmVkLmZ1bmN0aW9uICovIDYpKCk7XG5cbiAgICB2YXIgX1Byb21pc2UgPSB0eXBlb2YgX1Byb21pc2UgPT09ICdmdW5jdGlvbicgPyBfUHJvbWlzZSA6IHNoYXJlZC5Qcm9taXNlO1xuICAgIHZhciBfU3ltYm9sID0gdHlwZW9mIF9TeW1ib2wgPT09ICdmdW5jdGlvbicgPyBfU3ltYm9sIDogc2hhcmVkLlN5bWJvbDtcbiAgICB2YXIgX1NldCA9IHR5cGVvZiBfU2V0ID09PSAnZnVuY3Rpb24nID8gX1NldCA6IHNoYXJlZC5TZXQ7XG4gICAgdmFyIF9NYXAgPSB0eXBlb2YgX01hcCA9PT0gJ2Z1bmN0aW9uJyA/IF9NYXAgOiBzaGFyZWQuTWFwO1xuICAgIHZhciBfV2Vha01hcCA9IHR5cGVvZiBfV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IF9XZWFrTWFwIDogc2hhcmVkLldlYWtNYXA7XG4gICAgdmFyIF9XZWFrU2V0ID0gdHlwZW9mIF9XZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gX1dlYWtTZXQgOiBzaGFyZWQuV2Vha1NldDtcbiAgICB2YXIgVVJMID0gc2hhcmVkLlVSTCxcbiAgICAgICAgVVJMU2VhcmNoUGFyYW1zID0gc2hhcmVkLlVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgRm9udEZhY2UgPSBzaGFyZWQuRm9udEZhY2UsXG4gICAgICAgIG1hdGNoTWVkaWEgPSBzaGFyZWQubWF0Y2hNZWRpYTtcblxuICAgIHZhciBidW5kbGVVcmwgPSBfX3dlZXhfb3B0aW9uc19fLmJ1bmRsZVVybCB8fCAnYWJvdXQ6YmxhbmsnO1xuXG4gICAgaWYgKCFfX3dlZXhfb3B0aW9uc19fLmJ1bmRsZVVybCkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE11c3QgaGF2ZSBidW5kbGVVcmwgb3B0aW9uIHdoZW4gY3JlYXRlSW5zdGFuY2UsIGRvd25ncmFkZSB0byBcImFib3V0OmJsYW5rXCIuJyk7XG4gICAgfVxuXG4gICAgdmFyIGRvY3VtZW50ID0gbmV3IERvY3VtZW50KGluc3RhbmNlSWQsIGJ1bmRsZVVybCk7XG4gICAgdmFyIGRvY3VtZW50VVJMID0gbmV3IFVSTChidW5kbGVVcmwpO1xuICAgIHZhciBtb2R1bGVzID0ge307XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXSA9IHtcbiAgICAgIGRvY3VtZW50OiBkb2N1bWVudCxcbiAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsXG4gICAgICBidW5kbGVVcmw6IGJ1bmRsZVVybCxcbiAgICAgIGJ1bmRsZUNvZGU6IF9fd2VleF9jb2RlX18sXG4gICAgICBtb2R1bGVzOiBtb2R1bGVzLFxuICAgICAgb3JpZ2luOiBkb2N1bWVudFVSTC5vcmlnaW4sXG4gICAgICB1aWQ6IDBcbiAgICB9O1xuXG4gICAgLy8gR2VuZXJhdGUgbmF0aXZlIG1vZHVsZXMgbWFwIGF0IGluc3RhbmNlIGluaXRcbiAgICBnZW5OYXRpdmVNb2R1bGVzKG1vZHVsZXMsIGRvY3VtZW50KTtcbiAgICB2YXIgX193ZWV4X2RlZmluZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9kZWZpbmUud2VleCAqLyA3KShtb2R1bGVzKTtcbiAgICB2YXIgX193ZWV4X3JlcXVpcmVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcmVxdWlyZS53ZWV4ICovIDgpKG1vZHVsZXMpO1xuICAgIHZhciBfX3dlZXhfZG93bmdyYWRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Rvd25ncmFkZS53ZWV4ICovIDkpKF9fd2VleF9yZXF1aXJlX18pO1xuICAgIC8vIEV4dGVuZCBkb2N1bWVudFxuICAgIF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZG9jdW1lbnQud2VleCAqLyAxMSkoX193ZWV4X3JlcXVpcmVfXywgZG9jdW1lbnQpO1xuXG4gICAgdmFyIGxvY2F0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9sb2NhdGlvbi53ZWV4ICovIDEyKShfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudFVSTCk7XG5cbiAgICB2YXIgX3JlcXVpcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ZldGNoLndlZXggKi8gMTMpKF9fd2VleF9yZXF1aXJlX18sIF9Qcm9taXNlKSxcbiAgICAgICAgZmV0Y2ggPSBfcmVxdWlyZS5mZXRjaCxcbiAgICAgICAgSGVhZGVycyA9IF9yZXF1aXJlLkhlYWRlcnMsXG4gICAgICAgIFJlcXVlc3QgPSBfcmVxdWlyZS5SZXF1ZXN0LFxuICAgICAgICBSZXNwb25zZSA9IF9yZXF1aXJlLlJlc3BvbnNlO1xuXG4gICAgdmFyIFhNTEh0dHBSZXF1ZXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi94bWxodHRwcmVxdWVzdC53ZWV4ICovIDE0KShfX3dlZXhfcmVxdWlyZV9fKTtcbiAgICB2YXIgV2ViU29ja2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi93ZWJzb2NrZXQud2VleCAqLyAxNykoX193ZWV4X3JlcXVpcmVfXyk7XG5cbiAgICB2YXIgX3JlcXVpcmUyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi90aW1lci53ZWV4ICovIDE4KShfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCksXG4gICAgICAgIHNldFRpbWVvdXQgPSBfcmVxdWlyZTIuc2V0VGltZW91dCxcbiAgICAgICAgY2xlYXJUaW1lb3V0ID0gX3JlcXVpcmUyLmNsZWFyVGltZW91dCxcbiAgICAgICAgc2V0SW50ZXJ2YWwgPSBfcmVxdWlyZTIuc2V0SW50ZXJ2YWwsXG4gICAgICAgIGNsZWFySW50ZXJ2YWwgPSBfcmVxdWlyZTIuY2xlYXJJbnRlcnZhbCxcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gX3JlcXVpcmUyLnJlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBfcmVxdWlyZTIuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbiAgICB2YXIgX3JlcXVpcmUzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9iYXNlNjQud2VleCAqLyAxOSkoKSxcbiAgICAgICAgYXRvYiA9IF9yZXF1aXJlMy5hdG9iLFxuICAgICAgICBidG9hID0gX3JlcXVpcmUzLmJ0b2E7XG5cbiAgICB2YXIgcGVyZm9ybWFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3BlcmZvcm1hbmNlLndlZXggKi8gMjApKHJlc3BvbnNlRW5kKTtcblxuICAgIHZhciBfcmVxdWlyZTQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2V2ZW50LndlZXggKi8gMjEpKCksXG4gICAgICAgIEV2ZW50ID0gX3JlcXVpcmU0LkV2ZW50LFxuICAgICAgICBDdXN0b21FdmVudCA9IF9yZXF1aXJlNC5DdXN0b21FdmVudDtcblxuICAgIHZhciB3aW5kb3dFbWl0dGVyID0gbmV3IF9lbWl0dGVyMi5kZWZhdWx0KCk7XG5cbiAgICB2YXIgd2luZG93ID0ge1xuICAgICAgLy8gRVNcbiAgICAgIFByb21pc2U6IF9Qcm9taXNlLFxuICAgICAgU3ltYm9sOiBfU3ltYm9sLFxuICAgICAgTWFwOiBfTWFwLFxuICAgICAgU2V0OiBfU2V0LFxuICAgICAgV2Vha01hcDogX1dlYWtNYXAsXG4gICAgICBXZWFrU2V0OiBfV2Vha1NldCxcbiAgICAgIC8vIFczQzogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2Jyb3dzZXJzLmh0bWwjYnJvd3NpbmctY29udGV4dC1uYW1lXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIC8vIFRoaXMgcmVhZC1vbmx5IHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIHRoZSByZWZlcmVuY2VkIHdpbmRvdyBpcyBjbG9zZWQgb3Igbm90LlxuICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICAgIGF0b2I6IGF0b2IsXG4gICAgICBidG9hOiBidG9hLFxuICAgICAgcGVyZm9ybWFuY2U6IHBlcmZvcm1hbmNlLFxuICAgICAgLy8gVzNDXG4gICAgICBkb2N1bWVudDogZG9jdW1lbnQsXG4gICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1odG1sNS0yMDA5MDQyMy9icm93c2Vycy5odG1sI2RvbS1uYXZpZ2F0b3JcbiAgICAgIG5hdmlnYXRvcjoge1xuICAgICAgICBwcm9kdWN0OiAnV2VleCcsXG4gICAgICAgIHBsYXRmb3JtOiBfX3dlZXhfZW52X18ucGxhdGZvcm0sXG4gICAgICAgIGFwcE5hbWU6IF9fd2VleF9lbnZfXy5hcHBOYW1lLFxuICAgICAgICBhcHBWZXJzaW9uOiBfX3dlZXhfZW52X18uYXBwVmVyc2lvbixcbiAgICAgICAgLy8gV2VleC8wLjEyIGlPUy85LjMgKGlQaG9uZTcsMikgQXBwTmFtZS8wLjEyXG4gICAgICAgIHVzZXJBZ2VudDogJ1dlZXgvJyArIF9fd2VleF9lbnZfXy53ZWV4VmVyc2lvbiArICcgJyArIF9fd2VleF9lbnZfXy5wbGF0Zm9ybSArICcvJyArIF9fd2VleF9lbnZfXy5vc1ZlcnNpb24gKyAnICgnICsgX193ZWV4X2Vudl9fLmRldmljZU1vZGVsICsgJykgJyArIF9fd2VleF9lbnZfXy5hcHBOYW1lICsgJy8nICsgX193ZWV4X2Vudl9fLmFwcFZlcnNpb25cbiAgICAgIH0sXG4gICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20tdmlldy8jdGhlLXNjcmVlbi1pbnRlcmZhY2VcbiAgICAgIHNjcmVlbjoge1xuICAgICAgICB3aWR0aDogX193ZWV4X2Vudl9fLmRldmljZVdpZHRoLFxuICAgICAgICBoZWlnaHQ6IF9fd2VleF9lbnZfXy5kZXZpY2VIZWlnaHQsXG4gICAgICAgIGF2YWlsV2lkdGg6IF9fd2VleF9lbnZfXy5kZXZpY2VXaWR0aCxcbiAgICAgICAgYXZhaWxIZWlnaHQ6IF9fd2VleF9lbnZfXy5kZXZpY2VIZWlnaHQsXG4gICAgICAgIGNvbG9yRGVwdGg6IDI0LFxuICAgICAgICBwaXhlbERlcHRoOiAyNFxuICAgICAgfSxcbiAgICAgIGRldmljZVBpeGVsUmF0aW86IF9fd2VleF9lbnZfXy5zY2FsZSxcbiAgICAgIGZldGNoOiBmZXRjaCxcbiAgICAgIEhlYWRlcnM6IEhlYWRlcnMsXG4gICAgICBSZXNwb25zZTogUmVzcG9uc2UsXG4gICAgICBSZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgWE1MSHR0cFJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgVVJMOiBVUkwsXG4gICAgICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyxcbiAgICAgIEZvbnRGYWNlOiBGb250RmFjZSxcbiAgICAgIFdlYlNvY2tldDogV2ViU29ja2V0LFxuICAgICAgRXZlbnQ6IEV2ZW50LFxuICAgICAgQ3VzdG9tRXZlbnQ6IEN1c3RvbUV2ZW50LFxuICAgICAgbWF0Y2hNZWRpYTogbWF0Y2hNZWRpYSxcbiAgICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsXG4gICAgICBjbGVhclRpbWVvdXQ6IGNsZWFyVGltZW91dCxcbiAgICAgIHNldEludGVydmFsOiBzZXRJbnRlcnZhbCxcbiAgICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHJlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lOiBjYW5jZWxBbmltYXRpb25GcmFtZSxcbiAgICAgIGFsZXJ0OiBmdW5jdGlvbiBhbGVydChtZXNzYWdlKSB7XG4gICAgICAgIHZhciBtb2RhbCA9IF9fd2VleF9yZXF1aXJlX18oTU9EQUxfTU9EVUxFKTtcbiAgICAgICAgbW9kYWwuYWxlcnQoe1xuICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSxcbiAgICAgIG9wZW46IGZ1bmN0aW9uIG9wZW4odXJsKSB7XG4gICAgICAgIHZhciB3ZWV4TmF2aWdhdG9yID0gX193ZWV4X3JlcXVpcmVfXyhOQVZJR0FUT1JfTU9EVUxFKTtcbiAgICAgICAgd2VleE5hdmlnYXRvci5wdXNoKHtcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICBhbmltYXRlZDogdHJ1ZVxuICAgICAgICB9LCBub29wKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICAgIHZhciB3ZWV4TmF2aWdhdG9yID0gX193ZWV4X3JlcXVpcmVfXyhOQVZJR0FUT1JfTU9EVUxFKTtcbiAgICAgICAgd2VleE5hdmlnYXRvci5jbG9zZSh7XG4gICAgICAgICAgYW5pbWF0ZWQ6IHRydWVcbiAgICAgICAgfSwgbm9vcCwgbm9vcCk7XG4gICAgICB9LFxuICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRhcmdldE9yaWdpbikge1xuICAgICAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgICAgb3JpZ2luOiBsb2NhdGlvbi5vcmlnaW4sXG4gICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtZXNzYWdlKSksXG4gICAgICAgICAgdHlwZTogJ21lc3NhZ2UnLFxuICAgICAgICAgIHNvdXJjZTogd2luZG93IC8vIEZJWE1FOiBtYXliZSBub3QgZXhwb3J0IHdpbmRvd1xuICAgICAgICB9O1xuICAgICAgICBkaXNwYXRjaEV2ZW50VG9JbnN0YW5jZShldmVudCwgdGFyZ2V0T3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHdpbmRvd0VtaXR0ZXIub24odHlwZSwgbGlzdGVuZXIpO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgd2luZG93RW1pdHRlci5vZmYodHlwZSwgbGlzdGVuZXIpO1xuICAgICAgfSxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZSkge1xuICAgICAgICB3aW5kb3dFbWl0dGVyLmVtaXQoZS50eXBlLCBlKTtcbiAgICAgIH0sXG4gICAgICAvLyBNb2R1bGVKU1xuICAgICAgZGVmaW5lOiBfX3dlZXhfZGVmaW5lX18sXG4gICAgICByZXF1aXJlOiBfX3dlZXhfcmVxdWlyZV9fLFxuICAgICAgLy8gV2VleFxuICAgICAgX193ZWV4X2RvY3VtZW50X186IGRvY3VtZW50LFxuICAgICAgX193ZWV4X2RlZmluZV9fOiBfX3dlZXhfZGVmaW5lX18sXG4gICAgICBfX3dlZXhfcmVxdWlyZV9fOiBfX3dlZXhfcmVxdWlyZV9fLFxuICAgICAgX193ZWV4X2Rvd25ncmFkZV9fOiBfX3dlZXhfZG93bmdyYWRlX18sXG4gICAgICBfX3dlZXhfZW52X186IF9fd2VleF9lbnZfXyxcbiAgICAgIF9fd2VleF9jb2RlX186IF9fd2VleF9jb2RlX18sXG4gICAgICBfX3dlZXhfb3B0aW9uc19fOiBfX3dlZXhfb3B0aW9uc19fLFxuICAgICAgX193ZWV4X2RhdGFfXzogX193ZWV4X2RhdGFfX1xuICAgIH07XG5cbiAgICBpbnN0YW5jZS53aW5kb3cgPSB3aW5kb3cuc2VsZiA9IHdpbmRvdy53aW5kb3cgPSB3aW5kb3c7XG5cbiAgICB2YXIgYnVpbHRpbkdsb2JhbHMgPSB7fTtcbiAgICB2YXIgYnVpbHRpbk1vZHVsZXMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgYnVpbHRpbkdsb2JhbHMgPSBfX3dlZXhfY29uZmlnX18uc2VydmljZXMuYnVpbHRpbkdsb2JhbHM7XG4gICAgICAvLyBNb2R1bGVzIHNob3VsZCB3cmFwIGFzIG1vZHVsZSBmYWN0b3J5IGZvcm1hdFxuICAgICAgYnVpbHRpbk1vZHVsZXMgPSBfX3dlZXhfY29uZmlnX18uc2VydmljZXMuYnVpbHRpbk1vZHVsZXM7XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIE9iamVjdC5hc3NpZ24od2luZG93LCBidWlsdGluR2xvYmFscyk7XG5cbiAgICB2YXIgbW9kdWxlRmFjdG9yaWVzID0gX2V4dGVuZHMoe30sIF9idWlsdGluLk1vZHVsZUZhY3RvcmllcywgYnVpbHRpbk1vZHVsZXMpO1xuICAgIGdlbkJ1aWx0aW5Nb2R1bGVzKG1vZHVsZXMsIG1vZHVsZUZhY3Rvcmllcywgd2luZG93KTtcbiAgICAvLyBJbiB3ZWV4IGlPUyBvciBBbmRyb2lkXG4gICAgaWYgKF9fd2VleF9lbnZfXy5wbGF0Zm9ybSAhPT0gJ1dlYicpIHtcbiAgICAgIHZhciB0aW1pbmcgPSBwZXJmb3JtYW5jZS50aW1pbmc7XG4gICAgICB0aW1pbmcuZG9tTG9hZGluZyA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIFVzZSB0aGUgY2FjaGVkIGluaXQgZnVuY3Rpb24sIGlmIGV4aXN0ZWQgaW4gYnVuZGxlc1xuICAgICAgdmFyIF9pbml0ID0gYnVuZGxlc1tfX3dlZXhfY29kZV9fXSA/IGJ1bmRsZXNbX193ZWV4X2NvZGVfX10gOiBuZXcgRnVuY3Rpb24oJ3dpdGgodGhpcyl7KGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7XFxuJyArIF9fd2VleF9jb2RlX18gKyAnXFxufSkuY2FsbCh0aGlzKX0nKTtcblxuICAgICAgX2luaXQuY2FsbChcbiAgICAgIC8vIENvbnRleHQgaXMgd2luZG93XG4gICAgICB3aW5kb3cpO1xuXG4gICAgICB0aW1pbmcuZG9tSW50ZXJhY3RpdmUgPSB0aW1pbmcuZG9tQ29tcGxldGUgPSB0aW1pbmcuZG9tSW50ZXJhY3RpdmUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYWNoZSB0aGUgaW5pdCBmdW5jdGlvblxuICAgICAgYnVuZGxlc1tfX3dlZXhfY29kZV9fXSA9IF9pbml0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiB3ZWV4IGg1XG4gICAgICB2YXIgX2luaXQyID0gbmV3IEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjtcXG4nICsgX193ZWV4X2NvZGVfXyk7XG5cbiAgICAgIF9pbml0Mi5jYWxsKHdpbmRvdyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5zdGFuY2UgaWQgXCInICsgaW5zdGFuY2VJZCArICdcIiBleGlzdGVkIHdoZW4gY3JlYXRlIGluc3RhbmNlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiByZWZyZXNoIGEgV2VleCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gaW5zdGFuY2VJZFxuICogQHBhcmFtICB7b2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHJlZnJlc2hJbnN0YW5jZShpbnN0YW5jZUlkLCBkYXRhKSB7XG4gIHZhciBpbnN0YW5jZSA9IGdldEluc3RhbmNlKGluc3RhbmNlSWQpO1xuICB2YXIgZG9jdW1lbnQgPSBpbnN0YW5jZS5kb2N1bWVudDtcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmZpcmVFdmVudCgncmVmcmVzaCcsIHtcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgZGF0YTogZGF0YVxuICB9KTtcbiAgZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ3JlZnJlc2hGaW5pc2gnIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBkZXN0cm95IGEgV2VleCBpbnN0YW5jZVxuICogQHBhcmFtICB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZUlkKSB7XG4gIHZhciBpbnN0YW5jZSA9IGdldEluc3RhbmNlKGluc3RhbmNlSWQpO1xuICB2YXIgYnVuZGxlQ29kZSA9IGluc3RhbmNlLmJ1bmRsZUNvZGU7XG4gIGluc3RhbmNlLndpbmRvdy5jbG9zZWQgPSB0cnVlO1xuXG4gIHZhciBkb2N1bWVudCA9IGluc3RhbmNlLmRvY3VtZW50O1xuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZmlyZUV2ZW50KCdkZXN0b3J5Jywge1xuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9KTtcblxuICBpZiAoZG9jdW1lbnQuZGVzdHJveSkge1xuICAgIGRvY3VtZW50LmRlc3Ryb3koKTtcbiAgfVxuXG4gIGlmIChkb2N1bWVudC50YXNrQ2VudGVyICYmIGRvY3VtZW50LnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKSB7XG4gICAgZG9jdW1lbnQudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKTtcbiAgfVxuXG4gIGRlbGV0ZSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gIGRlbGV0ZSBidW5kbGVzW2J1bmRsZUNvZGVdO1xufVxuXG4vKipcbiAqIGdldCBhIHdob2xlIGVsZW1lbnQgdHJlZSBvZiBhbiBpbnN0YW5jZVxuICogZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtICB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IGEgdmlydHVhbCBkb20gdHJlZVxuICovXG5mdW5jdGlvbiBnZXRSb290KGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoaW5zdGFuY2VJZCk7XG4gIHZhciBkb2N1bWVudCA9IGluc3RhbmNlLmRvY3VtZW50O1xuICByZXR1cm4gZG9jdW1lbnQudG9KU09OID8gZG9jdW1lbnQudG9KU09OKCkgOiB7fTtcbn1cblxuZnVuY3Rpb24gZmlyZUV2ZW50KGRvYywgcmVmLCB0eXBlLCBlLCBkb21DaGFuZ2VzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlZikpIHtcbiAgICByZWYuc29tZShmdW5jdGlvbiAocmVmKSB7XG4gICAgICByZXR1cm4gZmlyZUV2ZW50KGRvYywgcmVmLCB0eXBlLCBlKSAhPT0gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGVsID0gZG9jLmdldFJlZihyZWYpO1xuXG4gIGlmIChlbCkge1xuICAgIHZhciByZXN1bHQgPSBkb2MuZmlyZUV2ZW50KGVsLCB0eXBlLCBlLCBkb21DaGFuZ2VzKTtcbiAgICB1cGRhdGVGaW5pc2goZG9jKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcIicgKyByZWYgKyAnXCInKTtcbn1cblxuLyoqXG4gKiBhY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gaW5zdGFuY2VJZFxuICogQHBhcmFtICB7YXJyYXl9IHRhc2tzIGxpc3Qgd2l0aCBgbWV0aG9kYCBhbmQgYGFyZ3NgXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhpbnN0YW5jZUlkLCB0YXNrcykge1xuICB2YXIgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZShpbnN0YW5jZUlkKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gaW5zdGFuY2UuZG9jdW1lbnQ7XG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgIHZhciByZXN1bHQgPSB2b2lkIDA7XG4gICAgICBpZiAodGFzay5tZXRob2QgPT09ICdmaXJlRXZlbnQnKSB7XG4gICAgICAgIHZhciBfdGFzayRhcmdzID0gX3NsaWNlZFRvQXJyYXkodGFzay5hcmdzLCA0KSxcbiAgICAgICAgICAgIG5vZGVJZCA9IF90YXNrJGFyZ3NbMF0sXG4gICAgICAgICAgICB0eXBlID0gX3Rhc2skYXJnc1sxXSxcbiAgICAgICAgICAgIGRhdGEgPSBfdGFzayRhcmdzWzJdLFxuICAgICAgICAgICAgZG9tQ2hhbmdlcyA9IF90YXNrJGFyZ3NbM107XG5cbiAgICAgICAgcmVzdWx0ID0gZmlyZUV2ZW50KGRvY3VtZW50LCBub2RlSWQsIHR5cGUsIGRhdGEsIGRvbUNoYW5nZXMpO1xuICAgICAgfSBlbHNlIGlmICh0YXNrLm1ldGhvZCA9PT0gJ2NhbGxiYWNrJykge1xuICAgICAgICB2YXIgX3Rhc2skYXJnczIgPSBfc2xpY2VkVG9BcnJheSh0YXNrLmFyZ3MsIDMpLFxuICAgICAgICAgICAgdWlkID0gX3Rhc2skYXJnczJbMF0sXG4gICAgICAgICAgICBfZGF0YSA9IF90YXNrJGFyZ3MyWzFdLFxuICAgICAgICAgICAgaWZLZWVwQWxpdmUgPSBfdGFzayRhcmdzMlsyXTtcblxuICAgICAgICByZXN1bHQgPSBkb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrKHVpZCwgX2RhdGEsIGlmS2VlcEFsaXZlKTtcbiAgICAgICAgdXBkYXRlRmluaXNoKGRvY3VtZW50KTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbi8vIEZJWE1FOiBIYWNrIGZvciByb2xsdXAgYnVpbGQgXCJpbXBvcnQgUmF4IGZyb20gJ3dlZXgtcmF4LWZyYW1ld29yaydcIiwgaW4gcm9sbHVwIGlmIGBtb2R1bGUuZXhwb3J0c2AgaGFzIGBfX2VzTW9kdWxlYCBrZXkgbXVzdCByZXR1cm4gYnkgZXhwb3J0IGRlZmF1bHRcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHM7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvYnVpbHRpbi5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBNb2R1bGVGYWN0b3JpZXMgPSBleHBvcnRzLk1vZHVsZUZhY3RvcmllcyA9IHtcbiAgJ3JheCc6IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJheC9kaXN0L3JheC5mYWN0b3J5ICovIDUpXG59O1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3JheC9kaXN0L3JheC5mYWN0b3J5LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG4gIHZhciBfX3dlZXhfZG9jdW1lbnRfXyA9IHRoaXNbXCJfX3dlZXhfZG9jdW1lbnRfX1wiXTtcbnZhciBkb2N1bWVudCA9IHRoaXNbXCJkb2N1bWVudFwiXTtcbiAgbW9kdWxlLmV4cG9ydHMgPSAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLypcbiAqIFN0YXRlZnVsIHRoaW5ncyBpbiBydW50aW1lXG4gKi9cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgY29tcG9uZW50OiBudWxsLFxuICBtb3VudElEOiAxLFxuICBzYW5kYm94OiB0cnVlLFxuICAvLyBSb290c1xuICByb290Q29tcG9uZW50czoge30sXG4gIHJvb3RJbnN0YW5jZXM6IHt9LFxuICAvLyBJbmplY3RcbiAgaG9vazogbnVsbCxcbiAgZHJpdmVyOiBudWxsLFxuICBtb25pdG9yOiBudWxsXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxudmFyIF9lbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VubW91bnRDb21wb25lbnRBdE5vZGUpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW50aWF0ZUNvbXBvbmVudCk7XG5cbnZhciBfc2hvdWxkVXBkYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hvdWxkVXBkYXRlQ29tcG9uZW50KTtcblxudmFyIF9yb290ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5cbnZhciBfcm9vdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yb290KTtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuLyoqXG4gKiBJbnN0YW5jZSBtYW5hZ2VyXG4gKi9cbnZhciBLRVkgPSAnJCRpbnN0YW5jZSc7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgc2V0OiBmdW5jdGlvbiBzZXQobm9kZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoIW5vZGVbS0VZXSkge1xuICAgICAgbm9kZVtLRVldID0gaW5zdGFuY2U7XG4gICAgICAvLyBSZWNvcmQgcm9vdCBpbnN0YW5jZSB0byByb290cyBtYXBcbiAgICAgIGlmIChpbnN0YW5jZS5yb290SUQpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQucm9vdEluc3RhbmNlc1tpbnN0YW5jZS5yb290SURdID0gaW5zdGFuY2U7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzW2luc3RhbmNlLnJvb3RJRF0gPSBpbnN0YW5jZS5faW50ZXJuYWw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBnZXQ6IGZ1bmN0aW9uIGdldChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVbS0VZXTtcbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobm9kZSkge1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZ2V0KG5vZGUpO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgbm9kZVtLRVldID0gbnVsbDtcbiAgICAgIGlmIChpbnN0YW5jZS5yb290SUQpIHtcbiAgICAgICAgZGVsZXRlIF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzW2luc3RhbmNlLnJvb3RJRF07XG4gICAgICAgIGRlbGV0ZSBfaG9zdDIuZGVmYXVsdC5yb290SW5zdGFuY2VzW2luc3RhbmNlLnJvb3RJRF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIpIHtcbiAgICBpZiAoZmFsc2UpIHtcbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLmJlZm9yZVJlbmRlcigpO1xuICAgIH1cblxuICAgIC8vIEJlZm9yZSByZW5kZXIgY2FsbGJhY2tcbiAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYmVmb3JlUmVuZGVyICYmIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5iZWZvcmVSZW5kZXIoKTtcblxuICAgIC8vIFJlYWwgbmF0aXZlIHJvb3Qgbm9kZSBpcyBib2R5XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICBjb250YWluZXIgPSBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuY3JlYXRlQm9keSgpO1xuICAgIH1cblxuICAgIHZhciBwcmV2Um9vdEluc3RhbmNlID0gdGhpcy5nZXQoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzUHJldlJvb3RJbnN0YW5jZSA9IHByZXZSb290SW5zdGFuY2UgJiYgcHJldlJvb3RJbnN0YW5jZS5pc1Jvb3RDb21wb25lbnQ7XG5cbiAgICBpZiAoaGFzUHJldlJvb3RJbnN0YW5jZSkge1xuICAgICAgdmFyIHByZXZSZW5kZXJlZENvbXBvbmVudCA9IHByZXZSb290SW5zdGFuY2UuZ2V0UmVuZGVyZWRDb21wb25lbnQoKTtcbiAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZSZW5kZXJlZENvbXBvbmVudC5fY3VycmVudEVsZW1lbnQ7XG4gICAgICBpZiAoKDAsIF9zaG91bGRVcGRhdGVDb21wb25lbnQyLmRlZmF1bHQpKHByZXZFbGVtZW50LCBlbGVtZW50KSkge1xuICAgICAgICB2YXIgcHJldlVubWFza2VkQ29udGV4dCA9IHByZXZSZW5kZXJlZENvbXBvbmVudC5fY29udGV4dDtcbiAgICAgICAgcHJldlJlbmRlcmVkQ29tcG9uZW50LnVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgZWxlbWVudCwgcHJldlVubWFza2VkQ29udGV4dCwgcHJldlVubWFza2VkQ29udGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHByZXZSb290SW5zdGFuY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Um9vdEluc3RhbmNlKTtcbiAgICAgICAgKDAsIF91bm1vdW50Q29tcG9uZW50QXROb2RlMi5kZWZhdWx0KShjb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudFxuICAgIGlmIChfdW5pdmVyc2FsRW52LmlzV2ViICYmIGNvbnRhaW5lci5jaGlsZE5vZGVzKSB7XG4gICAgICAvLyBDbG9uZSBjaGlsZE5vZGVzLCBCZWNhdXNlIHJlbW92ZUNoaWxkIHdpbGwgY2F1c2luZyBjaGFuZ2UgaW4gY2hpbGROb2RlcyBsZW5ndGhcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjb250YWluZXIuY2hpbGROb2RlcykpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJvb3RDaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgICBpZiAocm9vdENoaWxkTm9kZS5oYXNBdHRyaWJ1dGUgJiYgcm9vdENoaWxkTm9kZS5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVuZGVyZWQnKSkge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZChyb290Q2hpbGROb2RlLCBjb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHdyYXBwZWRFbGVtZW50ID0gKDAsIF9lbGVtZW50LmNyZWF0ZUVsZW1lbnQpKF9yb290Mi5kZWZhdWx0LCBudWxsLCBlbGVtZW50KTtcbiAgICB2YXIgcmVuZGVyZWRDb21wb25lbnQgPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KSh3cmFwcGVkRWxlbWVudCk7XG4gICAgdmFyIGRlZmF1bHRDb250ZXh0ID0ge307XG4gICAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlbmRlcmVkQ29tcG9uZW50Lm1vdW50Q29tcG9uZW50KGNvbnRhaW5lciwgZGVmYXVsdENvbnRleHQpO1xuICAgIHRoaXMuc2V0KGNvbnRhaW5lciwgcm9vdEluc3RhbmNlKTtcblxuICAgIC8vIEFmdGVyIHJlbmRlciBjYWxsYmFja1xuICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hZnRlclJlbmRlciAmJiBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYWZ0ZXJSZW5kZXIocm9vdEluc3RhbmNlKTtcblxuICAgIC8vIERldnRvb2wgcmVuZGVyIG5ldyByb290IGhvb2tcbiAgICBfaG9zdDIuZGVmYXVsdC5ob29rLk1vdW50Ll9yZW5kZXJOZXdSb290Q29tcG9uZW50KHJvb3RJbnN0YW5jZS5faW50ZXJuYWwpO1xuXG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5hZnRlclJlbmRlcigpO1xuICAgIH1cblxuICAgIHJldHVybiByb290SW5zdGFuY2U7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBpbnN0YW50aWF0ZUNvbXBvbmVudChlbGVtZW50KSB7XG4gIHZhciBpbnN0YW5jZSA9IHZvaWQgMDtcblxuICBpZiAoZWxlbWVudCA9PT0gdW5kZWZpbmVkIHx8IGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gZmFsc2UgfHwgZWxlbWVudCA9PT0gdHJ1ZSkge1xuICAgIGluc3RhbmNlID0gbmV3IF9ob3N0Mi5kZWZhdWx0LkVtcHR5Q29tcG9uZW50KCk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgIGluc3RhbmNlID0gbmV3IF9ob3N0Mi5kZWZhdWx0LkZyYWdtZW50Q29tcG9uZW50KGVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKCh0eXBlb2YgZWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoZWxlbWVudCkpID09PSAnb2JqZWN0JyAmJiBlbGVtZW50LnR5cGUpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2Ugc3RyaW5nIHZhbHVlc1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgX2hvc3QyLmRlZmF1bHQuTmF0aXZlQ29tcG9uZW50KGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBfaG9zdDIuZGVmYXVsdC5Db21wb3NpdGVDb21wb25lbnQoZWxlbWVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxlbWVudCA9PT0gJ251bWJlcicpIHtcbiAgICBpbnN0YW5jZSA9IG5ldyBfaG9zdDIuZGVmYXVsdC5UZXh0Q29tcG9uZW50KGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQgdHlwZSAnICsgSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpO1xuICB9XG5cbiAgaW5zdGFuY2UuX21vdW50SW5kZXggPSAwO1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gaW5zdGFudGlhdGVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mMiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YyKG9iaik7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mMihvYmopO1xufTtcblxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNkb20tbmF2aWdhdG9yLWFwcGNvZGVuYW1lXG52YXIgaXNXZWIgPSBleHBvcnRzLmlzV2ViID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5hdmlnYXRvcikpID09PSAnb2JqZWN0JyAmJiAobmF2aWdhdG9yLmFwcENvZGVOYW1lID09PSAnTW96aWxsYScgfHwgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdHZWNrbycpO1xudmFyIGlzTm9kZSA9IGV4cG9ydHMuaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICEhKHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcbnZhciBpc1dlZXggPSBleHBvcnRzLmlzV2VleCA9IHR5cGVvZiBjYWxsTmF0aXZlID09PSAnZnVuY3Rpb24nO1xudmFyIGlzUmVhY3ROYXRpdmUgPSBleHBvcnRzLmlzUmVhY3ROYXRpdmUgPSB0eXBlb2YgX19mYkJhdGNoZWRCcmlkZ2VDb25maWcgIT09ICd1bmRlZmluZWQnO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSB7XG4gIC8vIFRPRE86IHByZXZFbGVtZW50IGFuZCBuZXh0RWxlbWVudCBjb3VsZCBiZSBhcnJheVxuICB2YXIgcHJldkVtcHR5ID0gcHJldkVsZW1lbnQgPT09IG51bGw7XG4gIHZhciBuZXh0RW1wdHkgPSBuZXh0RWxlbWVudCA9PT0gbnVsbDtcbiAgaWYgKHByZXZFbXB0eSB8fCBuZXh0RW1wdHkpIHtcbiAgICByZXR1cm4gcHJldkVtcHR5ID09PSBuZXh0RW1wdHk7XG4gIH1cblxuICB2YXIgcHJldlR5cGUgPSB0eXBlb2YgcHJldkVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHByZXZFbGVtZW50KTtcbiAgdmFyIG5leHRUeXBlID0gdHlwZW9mIG5leHRFbGVtZW50ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihuZXh0RWxlbWVudCk7XG4gIGlmIChwcmV2VHlwZSA9PT0gJ3N0cmluZycgfHwgcHJldlR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG5leHRUeXBlID09PSAnc3RyaW5nJyB8fCBuZXh0VHlwZSA9PT0gJ251bWJlcic7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZUeXBlID09PSAnb2JqZWN0JyAmJiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgcHJldkVsZW1lbnQudHlwZSA9PT0gbmV4dEVsZW1lbnQudHlwZSAmJiBwcmV2RWxlbWVudC5rZXkgPT09IG5leHRFbGVtZW50LmtleTtcbiAgfVxufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBzaG91bGRVcGRhdGVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICogQmFzZSBjb21wb25lbnQgY2xhc3MuXG4gKi9cbnZhciBDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnQpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5yZWZzID0ge307XG4gICAgdGhpcy51cGRhdGVyID0gdXBkYXRlcjtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDb21wb25lbnQsIFt7XG4gICAga2V5OiBcImlzQ29tcG9uZW50Q2xhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNDb21wb25lbnRDbGFzcygpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U3RhdGUocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLnNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JjZVVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZShjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgQ29tcG9uZW50VHJlZToge1xuICAgIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOiBmdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gICAgICByZXR1cm4gX2luc3RhbmNlMi5kZWZhdWx0LmdldChub2RlKTtcbiAgICB9LFxuICAgIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICAgICAgLy8gaW5zdCBpcyBhbiBpbnRlcm5hbCBpbnN0YW5jZSAoYnV0IGNvdWxkIGJlIGEgY29tcG9zaXRlKVxuICAgICAgd2hpbGUgKGluc3QuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICAgIGluc3QgPSBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3QpIHtcbiAgICAgICAgcmV0dXJuIGluc3QuX25hdGl2ZU5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIE1vdW50OiB7XG4gICAgX2luc3RhbmNlc0J5UmVhY3RSb290SUQ6IF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzLFxuXG4gICAgLy8gU3R1YiAtIFJlYWN0IERldlRvb2xzIGV4cGVjdHMgdG8gZmluZCB0aGlzIG1ldGhvZCBhbmQgcmVwbGFjZSBpdFxuICAgIC8vIHdpdGggYSB3cmFwcGVyIGluIG9yZGVyIHRvIG9ic2VydmUgbmV3IHJvb3QgY29tcG9uZW50cyBiZWluZyBhZGRlZFxuICAgIF9yZW5kZXJOZXdSb290Q29tcG9uZW50OiBmdW5jdGlvbiBfcmVuZGVyTmV3Um9vdENvbXBvbmVudCgpIHt9XG4gIH0sXG4gIFJlY29uY2lsZXI6IHtcbiAgICAvLyBTdHVicyAtIFJlYWN0IERldlRvb2xzIGV4cGVjdHMgdG8gZmluZCB0aGVzZSBtZXRob2RzIGFuZCByZXBsYWNlIHRoZW1cbiAgICAvLyB3aXRoIHdyYXBwZXJzIGluIG9yZGVyIHRvIG9ic2VydmUgY29tcG9uZW50cyBiZWluZyBtb3VudGVkLCB1cGRhdGVkIGFuZFxuICAgIC8vIHVubW91bnRlZFxuICAgIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiBtb3VudENvbXBvbmVudCgpIHt9LFxuICAgIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIHJlY2VpdmVDb21wb25lbnQoKSB7fSxcbiAgICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50KCkge31cbiAgfSxcbiAgLy8gbW9uaXRvciB0aGUgaW5mbyBvZiBhbGwgY29tcG9uZW50c1xuICBtb25pdG9yOiBudWxsXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQ7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQ7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxudmFyIF9mbGF0dGVuQ2hpbGRyZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcblxudmFyIF9mbGF0dGVuQ2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmxhdHRlbkNoaWxkcmVuKTtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRSZW5kZXJFcnJvckluZm8oKSB7XG4gIGlmIChfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQpIHtcbiAgICB2YXIgbmFtZSA9IF9ob3N0Mi5kZWZhdWx0LmNvbXBvbmVudC5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBwcm9wcywgb3duZXIpIHtcbiAgcHJvcHMgPSBmaWx0ZXJQcm9wcyh0eXBlLCBwcm9wcyk7XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFbGVtZW50O1xuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5TdHlsZShzdHlsZSkge1xuICBpZiAoIXN0eWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzdHlsZSkpIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gZmxhdHRlblN0eWxlKHN0eWxlW2ldKTtcbiAgICAgIGlmIChjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBjb21wdXRlZFN0eWxlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyBUT0RPOiBtb3ZlIHRvIHdlZXgtZHJ2aWVyXG5mdW5jdGlvbiBmaWx0ZXJQcm9wcyh0eXBlLCBwcm9wcykge1xuICAvLyBPbmx5IGZvciB3ZWV4IHRleHRcbiAgaWYgKF91bml2ZXJzYWxFbnYuaXNXZWV4ICYmIHR5cGUgPT09ICd0ZXh0Jykge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gICAgLy8gVmFsdWUgaXMgZmlyc3RcbiAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuam9pbignJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGNoaWxkcmVuICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjaGlsZHJlbiA9ICcnO1xuICAgICAgfVxuXG4gICAgICBwcm9wcy52YWx1ZSA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZykge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgRXJyb3IoJ2NyZWF0ZUVsZW1lbnQ6IHR5cGUgc2hvdWxkIG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nICsgZ2V0UmVuZGVyRXJyb3JJbmZvKCkpO1xuICB9XG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wTmFtZSA9IHZvaWQgMDtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIHJlZiA9IGNvbmZpZy5yZWYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcucmVmO1xuICAgIGtleSA9IGNvbmZpZy5rZXkgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoY29uZmlnLmtleSk7XG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoY29uZmlnLmhhc093blByb3BlcnR5KHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGNoaWxkcmVuID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGNoaWxkcmVuW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9ICgwLCBfZmxhdHRlbkNoaWxkcmVuMi5kZWZhdWx0KShjaGlsZHJlbik7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5zdHlsZSAmJiAoQXJyYXkuaXNBcnJheShwcm9wcy5zdHlsZSkgfHwgX3R5cGVvZihwcm9wcy5zdHlsZSkgPT09ICdvYmplY3QnKSkge1xuICAgIHByb3BzLnN0eWxlID0gZmxhdHRlblN0eWxlKHByb3BzLnN0eWxlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRWxlbWVudCh0eXBlLCBrZXksIHJlZiwgcHJvcHMsIF9ob3N0Mi5kZWZhdWx0LmNvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnkodHlwZSkge1xuICB2YXIgZmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgLy8gRXhwb3NlIHRoZSB0eXBlIG9uIHRoZSBmYWN0b3J5IGFuZCB0aGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY2FuIGJlXG4gIC8vIGVhc2lseSBhY2Nlc3NlZCBvbiBlbGVtZW50cy4gRS5nLiBgPEZvbyAvPi50eXBlID09PSBGb29gLlxuICAvLyBUaGlzIHNob3VsZCBub3QgYmUgbmFtZWQgYGNvbnN0cnVjdG9yYCBzaW5jZSB0aGlzIG1heSBub3QgYmUgdGhlIGZ1bmN0aW9uXG4gIC8vIHRoYXQgY3JlYXRlZCB0aGUgZWxlbWVudCwgYW5kIGl0IG1heSBub3QgZXZlbiBiZSBhIGNvbnN0cnVjdG9yLlxuICBmYWN0b3J5LnR5cGUgPSB0eXBlO1xuICByZXR1cm4gZmFjdG9yeTtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZykge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgdGhyb3cgRXJyb3IoJ2Nsb25lRWxlbWVudDogbm90IGEgdmFsaWQgZWxlbWVudC4nICsgZ2V0UmVuZGVyRXJyb3JJbmZvKCkpO1xuICB9XG5cbiAgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuICB2YXIgcHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTtcblxuICAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZykge1xuICAgIC8vIFNob3VsZCByZXNldCByZWYgYW5kIG93bmVyIGlmIGhhcyBhIG5ldyByZWZcbiAgICBpZiAoY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gU3RyaW5nKGNvbmZpZy5rZXkpO1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSB2b2lkIDA7XG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuICAgIHZhciBwcm9wTmFtZSA9IHZvaWQgMDtcbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGNvbmZpZy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBjaGlsZHJlbiA9IEFycmF5KF9sZW4yID4gMiA/IF9sZW4yIC0gMiA6IDApLCBfa2V5MiA9IDI7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBjaGlsZHJlbltfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9ICgwLCBfZmxhdHRlbkNoaWxkcmVuMi5kZWZhdWx0KShjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gbmV3IEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgcHJvcHMsIG93bmVyKTtcbn07XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBvYmplY3QgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iamVjdCkpID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LnR5cGUgJiYgb2JqZWN0LnByb3BzO1xufVxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVubW91bnRDb21wb25lbnRBdE5vZGU7XG5cbnZhciBfaW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG52YXIgX2luc3RhbmNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbmNlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEF0Tm9kZShub2RlKSB7XG4gIHZhciBjb21wb25lbnQgPSBfaW5zdGFuY2UyLmRlZmF1bHQuZ2V0KG5vZGUpO1xuXG4gIGlmICghY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2luc3RhbmNlMi5kZWZhdWx0LnJlbW92ZShub2RlKTtcbiAgY29tcG9uZW50Ll9pbnRlcm5hbC51bm1vdW50Q29tcG9uZW50KCk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbnZhciBfcmVmID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cbnZhciBfcmVmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZik7XG5cbnZhciBfaW5zdGFudGlhdGVDb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbnRpYXRlQ29tcG9uZW50KTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG52YXIgX3Nob3VsZFVwZGF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zaG91bGRVcGRhdGVDb21wb25lbnQpO1xuXG52YXIgX2dldEVsZW1lbnRLZXlOYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cbnZhciBfZ2V0RWxlbWVudEtleU5hbWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0RWxlbWVudEtleU5hbWUpO1xuXG52YXIgX2luc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxudmFyIF9pbnN0YW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW5jZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFRSRUUgPSAndHJlZSc7XG52YXIgRVZFTlRfUFJFRklYX1JFR0VYUCA9IC9vbltBLVpdLztcblxuLyoqXG4gKiBOYXRpdmUgQ29tcG9uZW50XG4gKi9cblxudmFyIE5hdGl2ZUNvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTmF0aXZlQ29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTmF0aXZlQ29tcG9uZW50KTtcblxuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhOYXRpdmVDb21wb25lbnQsIFt7XG4gICAga2V5OiAnbW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENvbXBvbmVudChwYXJlbnQsIGNvbnRleHQsIGNoaWxkTW91bnRlcikge1xuICAgICAgLy8gUGFyZW50IG5hdGl2ZSBlbGVtZW50XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMuX21vdW50SUQgPSBfaG9zdDIuZGVmYXVsdC5tb3VudElEKys7XG5cbiAgICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgICBfaW50ZXJuYWw6IHRoaXMsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHByb3BzOiBwcm9wc1xuICAgICAgfTtcbiAgICAgIHZhciBhcHBlbmRUeXBlID0gcHJvcHMuYXBwZW5kOyAvLyBEZWZhdWx0IGlzIG5vZGVcblxuICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgLy8gQ2xvbmUgYSBjb3B5IGZvciBzdHlsZSBkaWZmXG4gICAgICB0aGlzLl9wcmV2U3R5bGVDb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuc3R5bGUpO1xuXG4gICAgICB2YXIgbmF0aXZlTm9kZSA9IHRoaXMuZ2V0TmF0aXZlTm9kZSgpO1xuXG4gICAgICBpZiAoYXBwZW5kVHlwZSAhPT0gVFJFRSkge1xuICAgICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgICAgY2hpbGRNb3VudGVyKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFwcGVuZENoaWxkKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50ICYmIHRoaXMuX2N1cnJlbnRFbGVtZW50LnJlZikge1xuICAgICAgICBfcmVmMi5kZWZhdWx0LmF0dGFjaCh0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXIsIHRoaXMuX2N1cnJlbnRFbGVtZW50LnJlZiwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGVuZFR5cGUgPT09IFRSRUUpIHtcbiAgICAgICAgaWYgKGNoaWxkTW91bnRlcikge1xuICAgICAgICAgIGNoaWxkTW91bnRlcihuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hcHBlbmRDaGlsZChuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5tb3VudENvbXBvbmVudCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdW50Q2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0ge307XG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuSW1hZ2UgPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciByZW5kZXJlZENoaWxkID0gKDAsIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIuZGVmYXVsdCkoZWxlbWVudCk7XG4gICAgICAgIHZhciBuYW1lID0gKDAsIF9nZXRFbGVtZW50S2V5TmFtZTIuZGVmYXVsdCkocmVuZGVyZWRDaGlsZHJlbiwgZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuW25hbWVdID0gcmVuZGVyZWRDaGlsZDtcbiAgICAgICAgcmVuZGVyZWRDaGlsZC5fbW91bnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBNb3VudFxuICAgICAgICB2YXIgbW91bnRJbWFnZSA9IHJlbmRlcmVkQ2hpbGQubW91bnRDb21wb25lbnQoX3RoaXMuZ2V0TmF0aXZlTm9kZSgpLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1hZ2U7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGRyZW5JbWFnZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bm1vdW50Q2hpbGRyZW4obm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcblxuICAgICAgaWYgKHJlbmRlcmVkQ2hpbGRyZW4pIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiByZW5kZXJlZENoaWxkcmVuKSB7XG4gICAgICAgICAgdmFyIHJlbmRlcmVkQ2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW25hbWVdO1xuICAgICAgICAgIHJlbmRlcmVkQ2hpbGQudW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5tb3VudENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubW91bnRDb21wb25lbnQobm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlKSB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWY7XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICBfcmVmMi5kZWZhdWx0LmRldGFjaCh0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXIsIHJlZiwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBfaW5zdGFuY2UyLmRlZmF1bHQucmVtb3ZlKHRoaXMuX25hdGl2ZU5vZGUpO1xuICAgICAgICBpZiAoIW5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUNoaWxkKHRoaXMuX25hdGl2ZU5vZGUsIHRoaXMuX3BhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKHRoaXMuX25hdGl2ZU5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVubW91bnRDaGlsZHJlbihub3RSZW1vdmVDaGlsZCk7XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHRoaXMpO1xuXG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9uYXRpdmVOb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgIHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUNvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIHByZXZDb250ZXh0LCBuZXh0Q29udGV4dCkge1xuICAgICAgLy8gUmVwbGFjZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG5cbiAgICAgIF9yZWYyLmRlZmF1bHQudXBkYXRlKHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgdGhpcyk7XG5cbiAgICAgIHZhciBwcmV2UHJvcHMgPSBwcmV2RWxlbWVudC5wcm9wcztcbiAgICAgIHZhciBuZXh0UHJvcHMgPSBuZXh0RWxlbWVudC5wcm9wcztcblxuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0aWVzKHByZXZQcm9wcywgbmV4dFByb3BzKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obmV4dFByb3BzLmNoaWxkcmVuLCBuZXh0Q29udGV4dCk7XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZVByb3BlcnRpZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gICAgICB2YXIgcHJvcEtleSA9IHZvaWQgMDtcbiAgICAgIHZhciBzdHlsZU5hbWUgPSB2b2lkIDA7XG4gICAgICB2YXIgc3R5bGVVcGRhdGVzID0gdm9pZCAwO1xuICAgICAgZm9yIChwcm9wS2V5IGluIHByZXZQcm9wcykge1xuICAgICAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4gfHwgbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFwcmV2UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgcHJldlByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgICB2YXIgbGFzdFN0eWxlID0gdGhpcy5fcHJldlN0eWxlQ29weTtcbiAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKEVWRU5UX1BSRUZJWF9SRUdFWFAudGVzdChwcm9wS2V5KSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJldlByb3BzW3Byb3BLZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmdldE5hdGl2ZU5vZGUoKSwgcHJvcEtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBwcmV2UHJvcHNbcHJvcEtleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCBwcm9wS2V5LCBwcmV2UHJvcHNbcHJvcEtleV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgICAgICB2YXIgcHJldlByb3AgPSBwcm9wS2V5ID09PSBTVFlMRSA/IHRoaXMuX3ByZXZTdHlsZUNvcHkgOiBwcmV2UHJvcHMgIT0gbnVsbCA/IHByZXZQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOIHx8ICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IHByZXZQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgcHJldlByb3AgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBzdHlsZVxuICAgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAgIC8vIENsb25lIHByb3BlcnR5XG4gICAgICAgICAgICBuZXh0UHJvcCA9IHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBuZXh0UHJvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcmV2UHJvcCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBVbnNldCBzdHlsZXMgb24gYHByZXZQcm9wYCBidXQgbm90IG9uIGBuZXh0UHJvcGAuXG4gICAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBwcmV2UHJvcCkge1xuICAgICAgICAgICAgICBpZiAocHJldlByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgcHJldlByb3BgLlxuICAgICAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgcHJldlByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXNzaWduIG5leHQgcHJvcCB3aGVuIHByZXYgc3R5bGUgaXMgbnVsbFxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGV2ZW50IGJpbmRpbmdcbiAgICAgICAgfSBlbHNlIGlmIChFVkVOVF9QUkVGSVhfUkVHRVhQLnRlc3QocHJvcEtleSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHByZXZQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmdldE5hdGl2ZU5vZGUoKSwgcHJvcEtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBwcmV2UHJvcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5nZXROYXRpdmVOb2RlKCksIHByb3BLZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgb3RoZXIgcHJvcGVydHlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IHt9O1xuICAgICAgICAgIHBheWxvYWRbcHJvcEtleV0gPSBuZXh0UHJvcDtcbiAgICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnNldEF0dHJpYnV0ZSh0aGlzLmdldE5hdGl2ZU5vZGUoKSwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCBwcm9wS2V5LCBwcmV2UHJvcHNbcHJvcEtleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLnJlY29yZE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHRoaXMuX21vdW50SUQsXG4gICAgICAgICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIucmVjb3JkT3BlcmF0aW9uKHtcbiAgICAgICAgICAgIGluc3RhbmNlSUQ6IHRoaXMuX21vdW50SUQsXG4gICAgICAgICAgICB0eXBlOiAndXBkYXRlIHN0eWxlJyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHN0eWxlVXBkYXRlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5zZXRTdHlsZXModGhpcy5nZXROYXRpdmVOb2RlKCksIHN0eWxlVXBkYXRlcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndXBkYXRlQ2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihuZXh0Q2hpbGRyZW5FbGVtZW50cywgY29udGV4dCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIC8vIHByZXYgcmVuZGVyZWQgY2hpbGRyZW5cbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuXG4gICAgICBpZiAobmV4dENoaWxkcmVuRWxlbWVudHMgPT0gbnVsbCAmJiBwcmV2Q2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0Q2hpbGRyZW4gPSB7fTtcbiAgICAgIHZhciBvbGROb2RlcyA9IHt9O1xuXG4gICAgICBpZiAobmV4dENoaWxkcmVuRWxlbWVudHMgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV4dENoaWxkcmVuRWxlbWVudHMpKSB7XG4gICAgICAgICAgbmV4dENoaWxkcmVuRWxlbWVudHMgPSBbbmV4dENoaWxkcmVuRWxlbWVudHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIG5leHQgY2hpbGRyZW4gZWxlbWVudHNcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBuZXh0Q2hpbGRyZW5FbGVtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgdmFyIG5leHRFbGVtZW50ID0gbmV4dENoaWxkcmVuRWxlbWVudHNbaW5kZXhdO1xuICAgICAgICAgIHZhciBuYW1lID0gKDAsIF9nZXRFbGVtZW50S2V5TmFtZTIuZGVmYXVsdCkobmV4dENoaWxkcmVuLCBuZXh0RWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIHZhciBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW4gJiYgcHJldkNoaWxkcmVuW25hbWVdO1xuICAgICAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQuX2N1cnJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHByZXZDaGlsZCAhPSBudWxsICYmICgwLCBfc2hvdWxkVXBkYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBQYXNzIHRoZSBzYW1lIGNvbnRleHQgd2hlbiB1cGRhdGluZyBjaGlkcmVuXG4gICAgICAgICAgICBwcmV2Q2hpbGQudXBkYXRlQ29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCwgY29udGV4dCk7XG4gICAgICAgICAgICBuZXh0Q2hpbGRyZW5bbmFtZV0gPSBwcmV2Q2hpbGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVubW91bnQgdGhlIHByZXZDaGlsZCB3aGVuIG5leHRDaGlsZCBpcyBkaWZmZXJlbnQgZWxlbWVudCB0eXBlLlxuICAgICAgICAgICAgaWYgKHByZXZDaGlsZCkge1xuICAgICAgICAgICAgICB2YXIgb2xkTmF0aXZlTm9kZSA9IHByZXZDaGlsZC5nZXROYXRpdmVOb2RlKCk7XG4gICAgICAgICAgICAgIC8vIERlbGF5IHJlbW92ZSBjaGlsZFxuICAgICAgICAgICAgICBwcmV2Q2hpbGQudW5tb3VudENvbXBvbmVudCh0cnVlKTtcbiAgICAgICAgICAgICAgb2xkTm9kZXNbbmFtZV0gPSBvbGROYXRpdmVOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGNoaWxkIG11c3QgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBpdCdzIG1vdW50ZWQuXG4gICAgICAgICAgICBuZXh0Q2hpbGRyZW5bbmFtZV0gPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShuZXh0RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdFByZXZDaGlsZCA9IHZvaWQgMDtcbiAgICAgIHZhciBkZWxheVJlbW92ZUZpcnN0UHJldkNoaWxkID0gdm9pZCAwO1xuICAgICAgLy8gVW5tb3VudCBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudC5cbiAgICAgIGlmIChwcmV2Q2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBfbmFtZSBpbiBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoIXByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShfbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcHJldkNoaWxkID0gcHJldkNoaWxkcmVuW19uYW1lXTtcbiAgICAgICAgICB2YXIgc2hvdWxkUmVtb3ZlID0gIW5leHRDaGlsZHJlbltfbmFtZV07XG5cbiAgICAgICAgICAvLyBTdG9yZSBvbGQgZmlyc3QgY2hpbGQgcmVmIGZvciBhcHBlbmQgbm9kZSBhaGVhZCBhbmQgbWF5YmUgZGVsYXkgcmVtb3ZlIGl0XG4gICAgICAgICAgaWYgKCFmaXJzdFByZXZDaGlsZCkge1xuICAgICAgICAgICAgZmlyc3RQcmV2Q2hpbGQgPSBfcHJldkNoaWxkO1xuICAgICAgICAgICAgZGVsYXlSZW1vdmVGaXJzdFByZXZDaGlsZCA9IHNob3VsZFJlbW92ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFJlbW92ZSkge1xuICAgICAgICAgICAgX3ByZXZDaGlsZC51bm1vdW50Q29tcG9uZW50KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0Q2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGBuZXh0SW5kZXhgIHdpbGwgaW5jcmVtZW50IGZvciBlYWNoIGNoaWxkIGluIGBuZXh0Q2hpbGRyZW5gLCBidXRcbiAgICAgICAgICAvLyBgbGFzdEluZGV4YCB3aWxsIGJlIHRoZSBsYXN0IGluZGV4IHZpc2l0ZWQgaW4gYHByZXZDaGlsZHJlbmAuXG4gICAgICAgICAgdmFyIGxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgdmFyIG5leHRJbmRleCA9IDA7XG4gICAgICAgICAgdmFyIGxhc3RQbGFjZWROb2RlID0gbnVsbDtcbiAgICAgICAgICB2YXIgbmV4dE5hdGl2ZU5vZGUgPSBbXTtcblxuICAgICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9uYW1lMikge1xuICAgICAgICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkoX25hbWUyKSkge1xuICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5leHRDaGlsZCA9IG5leHRDaGlsZHJlbltfbmFtZTJdO1xuICAgICAgICAgICAgdmFyIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bX25hbWUyXTtcblxuICAgICAgICAgICAgaWYgKHByZXZDaGlsZCA9PT0gbmV4dENoaWxkKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Q2hpbGROYXRpdmVOb2RlID0gcHJldkNoaWxkLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBhcnJheSB0eXBlXG4gICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcmV2Q2hpbGROYXRpdmVOb2RlKSkge1xuICAgICAgICAgICAgICAgIHByZXZDaGlsZE5hdGl2ZU5vZGUgPSBbcHJldkNoaWxkTmF0aXZlTm9kZV07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBJZiB0aGUgaW5kZXggb2YgYGNoaWxkYCBpcyBsZXNzIHRoYW4gYGxhc3RJbmRleGAsIHRoZW4gaXQgbmVlZHMgdG9cbiAgICAgICAgICAgICAgLy8gYmUgbW92ZWQuIE90aGVyd2lzZSwgd2UgZG8gbm90IG5lZWQgdG8gbW92ZSBpdCBiZWNhdXNlIGEgY2hpbGQgd2lsbCBiZVxuICAgICAgICAgICAgICAvLyBpbnNlcnRlZCBvciBtb3ZlZCBiZWZvcmUgYGNoaWxkYC5cbiAgICAgICAgICAgICAgaWYgKHByZXZDaGlsZC5fbW91bnRJbmRleCA8IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhc3RQbGFjZWROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBsYXN0UGxhY2VkTm9kZVtsYXN0UGxhY2VkTm9kZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IHByZXZDaGlsZE5hdGl2ZU5vZGUubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2ktLSkge1xuICAgICAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmluc2VydEFmdGVyKHByZXZDaGlsZE5hdGl2ZU5vZGVbX2ldLCBsYXN0UGxhY2VkTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbmV4dE5hdGl2ZU5vZGUgPSBuZXh0TmF0aXZlTm9kZS5jb25jYXQocHJldkNoaWxkTmF0aXZlTm9kZSk7XG5cbiAgICAgICAgICAgICAgbGFzdEluZGV4ID0gTWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgpO1xuICAgICAgICAgICAgICBwcmV2Q2hpbGQuX21vdW50SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocHJldkNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYGxhc3RJbmRleGAgYmVmb3JlIGBfbW91bnRJbmRleGAgZ2V0cyB1bnNldCBieSB1bm1vdW50aW5nLlxuICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IE1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJbmRleCwgbGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBfdGhpczIuZ2V0TmF0aXZlTm9kZSgpO1xuICAgICAgICAgICAgICAvLyBGcmFnbWVudCBleHRlbmRlZCBuYXRpdmUgY29tcG9uZW50LCBzbyBpZiBwYXJlbnQgaXMgZnJhZ21lbnQgc2hvdWxkIGdldCB0aGlzLl9wYXJlbnRcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50KSkge1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IF90aGlzMi5fcGFyZW50O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbmV4dENoaWxkLm1vdW50Q29tcG9uZW50KHBhcmVudCwgY29udGV4dCwgZnVuY3Rpb24gKG5ld0NoaWxkLCBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXdvcmsgdGhlIGR1cGxpY2F0ZSBjb2RlXG4gICAgICAgICAgICAgICAgdmFyIG9sZENoaWxkID0gb2xkTm9kZXNbX25hbWUyXTtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICBuZXdDaGlsZCA9IFtuZXdDaGlsZF07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9sZENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGUgb2xkQ2hpbGQgb3IgbmV3Q2hpbGQgYWxsIG1heWJlIGZyYWdtZW50XG4gICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZENoaWxkID0gW29sZENoaWxkXTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gSWYgbmV3Q2hpbGQgY291bnQgbGFyZ2UgdGhlbiBvbGRDaGlsZFxuICAgICAgICAgICAgICAgICAgdmFyIGxhc3ROZXdDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5ld0NoaWxkLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRbX2kyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENoaWxkW19pMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVwbGFjZUNoaWxkKGNoaWxkLCBvbGRDaGlsZFtfaTJdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuaW5zZXJ0QWZ0ZXIoY2hpbGQsIGxhc3ROZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdE5ld0NoaWxkID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIG5ld0NoaWxkIGNvdW50IGxlc3MgdGhlbiBvbGRDaGlsZFxuICAgICAgICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmxlbmd0aCA8IG9sZENoaWxkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTMgPSBuZXdDaGlsZC5sZW5ndGg7IF9pMyA8IG9sZENoaWxkLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQ2hpbGQob2xkQ2hpbGRbX2kzXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGNoaWxkIGF0IGEgc3BlY2lmaWMgaW5kZXhcblxuICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGNoaWxkXG4gICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXN0UGxhY2VkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBsYXN0UGxhY2VkTm9kZVtsYXN0UGxhY2VkTm9kZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgdmFyIHByZXZGaXJzdE5hdGl2ZU5vZGUgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFByZXZDaGlsZCAmJiAhbGFzdFBsYWNlZE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldkZpcnN0TmF0aXZlTm9kZSA9IGZpcnN0UHJldkNoaWxkLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJldkZpcnN0TmF0aXZlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2Rmlyc3ROYXRpdmVOb2RlID0gcHJldkZpcnN0TmF0aXZlTm9kZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTQgPSBuZXdDaGlsZC5sZW5ndGggLSAxOyBfaTQgPj0gMDsgX2k0LS0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9jaGlsZCA9IG5ld0NoaWxkW19pNF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGxhY2VkTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5pbnNlcnRBZnRlcihfY2hpbGQsIGxhc3RQbGFjZWROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2Rmlyc3ROYXRpdmVOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmluc2VydEJlZm9yZShfY2hpbGQsIHByZXZGaXJzdE5hdGl2ZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hcHBlbmRDaGlsZChfY2hpbGQsIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBuZXh0TmF0aXZlTm9kZSA9IG5leHROYXRpdmVOb2RlLmNvbmNhdChuZXdDaGlsZCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZXh0Q2hpbGQuX21vdW50SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBuZXh0Q2hpbGQuZ2V0TmF0aXZlTm9kZSgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfbmFtZTIgaW4gbmV4dENoaWxkcmVuKSB7XG4gICAgICAgICAgICB2YXIgX3JldDIgPSBfbG9vcChfbmFtZTIpO1xuXG4gICAgICAgICAgICBpZiAoX3JldDIgPT09ICdjb250aW51ZScpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN5bmMgdXBkYXRlIG5hdGl2ZSByZWZzXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX3RoaXMyLl9uYXRpdmVOb2RlKSkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIGFuZCBwdXNoIHRoZSBuZXcgYXJyYXlcbiAgICAgICAgICAgIF90aGlzMi5fbmF0aXZlTm9kZS5zcGxpY2UoMCwgX3RoaXMyLl9uYXRpdmVOb2RlLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHROYXRpdmVOb2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIF90aGlzMi5fbmF0aXZlTm9kZS5wdXNoKG5leHROYXRpdmVOb2RlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWxheVJlbW92ZUZpcnN0UHJldkNoaWxkKSB7XG4gICAgICAgIGZpcnN0UHJldkNoaWxkLnVubW91bnRDb21wb25lbnQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG5leHRDaGlsZHJlbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXROYXRpdmVOb2RlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmF0aXZlTm9kZSgpIHtcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbmF0aXZlTm9kZSA9IF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5jcmVhdGVFbGVtZW50KHRoaXMuX2luc3RhbmNlKTtcbiAgICAgICAgX2luc3RhbmNlMi5kZWZhdWx0LnNldCh0aGlzLl9uYXRpdmVOb2RlLCB0aGlzLl9pbnN0YW5jZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFB1YmxpY0luc3RhbmNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmFtZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTmF0aXZlQ29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBOYXRpdmVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLypcbiAqIFJlZiBtYW5hZ2VyXG4gKi9cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIGNvbXBvbmVudCkge1xuICAgIHZhciBwcmV2UmVmID0gcHJldkVsZW1lbnQgIT0gbnVsbCAmJiBwcmV2RWxlbWVudC5yZWY7XG4gICAgdmFyIG5leHRSZWYgPSBuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnJlZjtcblxuICAgIC8vIFVwZGF0ZSByZWZzIGluIG93bmVyIGNvbXBvbmVudFxuICAgIGlmIChwcmV2UmVmICE9PSBuZXh0UmVmKSB7XG4gICAgICAvLyBEZXRhY2ggcHJldiBSZW5kZXJlZEVsZW1lbnQncyByZWZcbiAgICAgIHByZXZSZWYgIT0gbnVsbCAmJiB0aGlzLmRldGFjaChwcmV2RWxlbWVudC5fb3duZXIsIHByZXZSZWYsIGNvbXBvbmVudCk7XG4gICAgICAvLyBBdHRhY2ggbmV4dCBSZW5kZXJlZEVsZW1lbnQncyByZWZcbiAgICAgIG5leHRSZWYgIT0gbnVsbCAmJiB0aGlzLmF0dGFjaChuZXh0RWxlbWVudC5fb3duZXIsIG5leHRSZWYsIGNvbXBvbmVudCk7XG4gICAgfVxuICB9LFxuICBhdHRhY2g6IGZ1bmN0aW9uIGF0dGFjaChvd25lckNvbXBvbmVudCwgcmVmLCBjb21wb25lbnQpIHtcbiAgICBpZiAoIW93bmVyQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtaWdodCBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50XFwncyAnICsgJ2ByZW5kZXJgIG1ldGhvZCwgb3IgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJheCBsb2FkZWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGluc3RhbmNlID0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlZihpbnN0YW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bmVyQ29tcG9uZW50Ll9pbnN0YW5jZS5yZWZzW3JlZl0gPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0sXG4gIGRldGFjaDogZnVuY3Rpb24gZGV0YWNoKG93bmVyQ29tcG9uZW50LCByZWYsIGNvbXBvbmVudCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXaGVuIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgYW5kIHdoZW5ldmVyIHRoZSByZWYgY2hhbmdlcywgdGhlIG9sZCByZWYgd2lsbCBiZSBjYWxsZWQgd2l0aCBudWxsIGFzIGFuIGFyZ3VtZW50LlxuICAgICAgcmVmKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdXN0IG1hdGNoIGNvbXBvbmVudCBhbmQgcmVmIGNvdWxkIGRldGFjaCB0aGUgcmVmIG9uIG93bmVyIHdoZW4gQSdzIGJlZm9yZSByZWYgaXMgQidzIGN1cnJlbnQgcmVmXG4gICAgICB2YXIgaW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICAgIGlmIChvd25lckNvbXBvbmVudC5faW5zdGFuY2UucmVmc1tyZWZdID09PSBpbnN0YW5jZSkge1xuICAgICAgICBkZWxldGUgb3duZXJDb21wb25lbnQuX2luc3RhbmNlLnJlZnNbcmVmXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoY2hpbGRyZW4sIGVsZW1lbnQsIGluZGV4KSB7XG4gIHZhciBlbGVtZW50S2V5ID0gZWxlbWVudCAmJiBlbGVtZW50LmtleTtcbiAgdmFyIGhhc0tleSA9IHR5cGVvZiBlbGVtZW50S2V5ID09PSAnc3RyaW5nJztcbiAgdmFyIGRlZmF1bHROYW1lID0gJy4nICsgaW5kZXgudG9TdHJpbmcoMzYpO1xuXG4gIGlmIChoYXNLZXkpIHtcbiAgICB2YXIga2V5TmFtZSA9ICckJyArIGVsZW1lbnRLZXk7XG4gICAgLy8gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZS5cbiAgICB2YXIga2V5VW5pcXVlID0gY2hpbGRyZW5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZDtcbiAgICAvLyBPbmx5IHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQgd2hlbiBlbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXlcbiAgICBpZiAoIWtleVVuaXF1ZSkgY29uc29sZS53YXJuKCdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXkgXCInICsgZWxlbWVudEtleSArICdcIi4nKTtcblxuICAgIHJldHVybiBrZXlVbmlxdWUgPyBrZXlOYW1lIDogZGVmYXVsdE5hbWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlZmF1bHROYW1lO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc1JlbSA9IGlzUmVtO1xuZXhwb3J0cy5jYWxjUmVtID0gY2FsY1JlbTtcbmV4cG9ydHMuZ2V0UmVtID0gZ2V0UmVtO1xuZXhwb3J0cy5zZXRSZW0gPSBzZXRSZW07XG5leHBvcnRzLmlzVW5pdE51bWJlciA9IGlzVW5pdE51bWJlcjtcbmV4cG9ydHMuY29udmVydFVuaXQgPSBjb252ZXJ0VW5pdDtcbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgVU5JVExFU1NfTlVNQkVSX1BST1BTID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgLy8gV2UgbWFrZSBsaW5lSGVpZ2h0IGRlZmF1bHQgaXMgcHggdGhhdCBpcyBkaWZmIHdpdGggdzNjIHNwZWNcbiAgLy8gbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBXZWV4IG9ubHlcbiAgbGluZXM6IHRydWVcbn07XG52YXIgU1VGRklYID0gJ3JlbSc7XG52YXIgUkVNX1JFRyA9IC9bLStdP1xcZCpcXC4/XFxkK3JlbS9nO1xuXG52YXIgZGVmYXVsdFJlbSA9IHZvaWQgMDtcblxuLyoqXG4gKiBJcyBzdHJpbmcgY29udGFpbnMgcmVtXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNSZW0oc3RyKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIuaW5kZXhPZihTVUZGSVgpICE9PSAtMTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgcmVtIHRvIHBpeGVsczogJzEuMnJlbScgPT4gMS4yICogcmVtXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge051bWJlcn0gcmVtXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBjYWxjUmVtKHN0cikge1xuICB2YXIgcmVtID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBkZWZhdWx0UmVtO1xuXG4gIHJldHVybiBzdHIucmVwbGFjZShSRU1fUkVHLCBmdW5jdGlvbiAocmVtVmFsdWUpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChyZW1WYWx1ZSkgKiByZW0gKyAncHgnO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtKCkge1xuICByZXR1cm4gZGVmYXVsdFJlbTtcbn1cblxuZnVuY3Rpb24gc2V0UmVtKHJlbSkge1xuICBkZWZhdWx0UmVtID0gcmVtO1xufVxuXG5mdW5jdGlvbiBpc1VuaXROdW1iZXIodmFsLCBwcm9wKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhVU5JVExFU1NfTlVNQkVSX1BST1BTW3Byb3BdO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VW5pdCh2YWwsIHByb3ApIHtcbiAgaWYgKHByb3AgJiYgaXNVbml0TnVtYmVyKHZhbCwgcHJvcCkpIHtcbiAgICByZXR1cm4gdmFsICogZGVmYXVsdFJlbSArICdweCc7XG4gIH0gZWxzZSBpZiAoaXNSZW0odmFsKSkge1xuICAgIHJldHVybiBjYWxjUmVtKHZhbCk7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRyYW5zZm9ybVByb3BzQXR0cnNUb1N0eWxlID0gdHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGU7XG5leHBvcnRzLnJlbmFtZVByb3BzQXR0ciA9IHJlbmFtZVByb3BzQXR0cjtcbi8qKlxuICogdHJhbnNmb3JtUHJvcEF0dHJzVG9TdHlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtBcnJheX0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGUocHJvcHMsIGF0dHJzKSB7XG4gIHByb3BzLnN0eWxlID0gcHJvcHMuc3R5bGUgfHwge307XG5cbiAgYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgIGlmIChwcm9wc1thdHRyXSAmJiAhcHJvcHMuc3R5bGVbYXR0cl0pIHtcbiAgICAgIHByb3BzLnN0eWxlW2F0dHJdID0gcHJvcHNbYXR0cl07XG4gICAgICBkZWxldGUgcHJvcHNbYXR0cl07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcHJvcHM7XG59O1xuXG4vKipcbiAqIHJlbmFtZVByb3BzQXR0clxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtTdHJpbmd9IG9yaWdpbmFsQXR0ck5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuZXdBdHRyTmFtZVxuICovXG5mdW5jdGlvbiByZW5hbWVQcm9wc0F0dHIocHJvcHMsIG9yaWdpbmFsQXR0ck5hbWUsIG5ld0F0dHJOYW1lKSB7XG4gIGlmIChwcm9wc1tvcmlnaW5hbEF0dHJOYW1lXSAmJiAhcHJvcHNbbmV3QXR0ck5hbWVdKSB7XG4gICAgcHJvcHNbbmV3QXR0ck5hbWVdID0gcHJvcHNbb3JpZ2luYWxBdHRyTmFtZV07XG4gICAgZGVsZXRlIHByb3BzW29yaWdpbmFsQXR0ck5hbWVdO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufVxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gZmluZERPTU5vZGUoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIGEgbmF0aXZlIG5vZGUsIHdlZXggbWF5IG5vdCBleHBvcnQgb3duZXJEb2N1bWVudCBwcm9wZXJ0eVxuICBpZiAoaW5zdGFuY2Uub3duZXJEb2N1bWVudCB8fCBpbnN0YW5jZS5ub2RlVHlwZSkge1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8vIE5hdGl2ZSBjb21wb25lbnRcbiAgaWYgKGluc3RhbmNlLl9uYXRpdmVOb2RlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLl9uYXRpdmVOb2RlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuZ2V0RWxlbWVudEJ5SWQoaW5zdGFuY2UpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcGVhcnMgdG8gYmUgbmVpdGhlciBDb21wb25lbnQgbm9yIERPTU5vZGUuJyk7XG4gIH1cblxuICAvLyBDb21wb3NpdGUgY29tcG9uZW50XG4gIHZhciBpbnRlcm5hbCA9IGluc3RhbmNlLl9pbnRlcm5hbDtcblxuICBpZiAoaW50ZXJuYWwpIHtcbiAgICB3aGlsZSAoIWludGVybmFsLl9uYXRpdmVOb2RlKSB7XG4gICAgICBpbnRlcm5hbCA9IGludGVybmFsLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIC8vIElmIG5vdCBtb3VudGVkXG4gICAgICBpZiAoaW50ZXJuYWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGludGVybmFsLl9uYXRpdmVOb2RlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignZmluZERPTU5vZGUgd2FzIGNhbGxlZCBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZpbmRET01Ob2RlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudmVyc2lvbiA9IGV4cG9ydHMuc2V0TmF0aXZlUHJvcHMgPSBleHBvcnRzLmZpbmRDb21wb25lbnRJbnN0YW5jZSA9IGV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGV4cG9ydHMuZmluZERPTU5vZGUgPSBleHBvcnRzLnJlbmRlciA9IGV4cG9ydHMuUHJvcFR5cGVzID0gZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gZXhwb3J0cy5Db21wb25lbnQgPSBleHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBleHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBleHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbl9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXG52YXIgX2VsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG52YXIgX2NvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cbnZhciBfY29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudCk7XG5cbnZhciBfcHVyZWNvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXG52YXIgX3B1cmVjb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHVyZWNvbXBvbmVudCk7XG5cbnZhciBfcHJvcHR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cbnZhciBfcHJvcHR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3B0eXBlcyk7XG5cbnZhciBfcmVuZGVyMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpO1xuXG52YXIgX3JlbmRlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW5kZXIyKTtcblxudmFyIF9maW5kRE9NTm9kZTIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblxudmFyIF9maW5kRE9NTm9kZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9maW5kRE9NTm9kZTIpO1xuXG52YXIgX3VubW91bnRDb21wb25lbnRBdE5vZGUyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VubW91bnRDb21wb25lbnRBdE5vZGUyKTtcblxudmFyIF9maW5kQ29tcG9uZW50SW5zdGFuY2UyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mik7XG5cbnZhciBfZmluZENvbXBvbmVudEluc3RhbmNlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZpbmRDb21wb25lbnRJbnN0YW5jZTIpO1xuXG52YXIgX3NldE5hdGl2ZVByb3BzMiA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpO1xuXG52YXIgX3NldE5hdGl2ZVByb3BzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NldE5hdGl2ZVByb3BzMik7XG5cbnZhciBfdmVyc2lvbjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcblxudmFyIF92ZXJzaW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZlcnNpb24yKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gX2VsZW1lbnQuY3JlYXRlRWxlbWVudDtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gX2VsZW1lbnQuY2xvbmVFbGVtZW50O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IF9lbGVtZW50LmlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gX2VsZW1lbnQuY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuQ29tcG9uZW50ID0gX2NvbXBvbmVudDIuZGVmYXVsdDtcbmV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IF9wdXJlY29tcG9uZW50Mi5kZWZhdWx0O1xuZXhwb3J0cy5Qcm9wVHlwZXMgPSBfcHJvcHR5cGVzMi5kZWZhdWx0O1xuZXhwb3J0cy5yZW5kZXIgPSBfcmVuZGVyMy5kZWZhdWx0O1xuZXhwb3J0cy5maW5kRE9NTm9kZSA9IF9maW5kRE9NTm9kZTMuZGVmYXVsdDtcbmV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IF91bm1vdW50Q29tcG9uZW50QXROb2RlMy5kZWZhdWx0O1xuZXhwb3J0cy5maW5kQ29tcG9uZW50SW5zdGFuY2UgPSBfZmluZENvbXBvbmVudEluc3RhbmNlMy5kZWZhdWx0O1xuZXhwb3J0cy5zZXROYXRpdmVQcm9wcyA9IF9zZXROYXRpdmVQcm9wczMuZGVmYXVsdDtcbmV4cG9ydHMudmVyc2lvbiA9IF92ZXJzaW9uMy5kZWZhdWx0O1xuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfaG9vayA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cbnZhciBfaG9vazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob29rKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uaW5qZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3QoX2hvb2syLmRlZmF1bHQpO1xufVxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBmbGF0dGVuQ2hpbGRyZW47XG5mdW5jdGlvbiB0cmF2ZXJzZUNoaWxkcmVuKGNoaWxkcmVuLCByZXN1bHQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRyYXZlcnNlQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB0cmF2ZXJzZUNoaWxkcmVuKGNoaWxkcmVuLCByZXN1bHQpO1xuXG4gIGlmIChyZXN1bHQubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0WzBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9jb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG52YXIgX2NvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb25lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciByb290Q291bnRlciA9IDE7XG5cbnZhciBSb290ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFJvb3QsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvb3QoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJvb3QpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX3JlZiA9IFJvb3QuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihSb290KSkuY2FsbC5hcHBseShfcmVmLCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMucm9vdElEID0gcm9vdENvdW50ZXIrKywgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUm9vdCwgW3tcbiAgICBrZXk6ICdpc1Jvb3RDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Jvb3RDb21wb25lbnQoKSB7fVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0UHVibGljSW5zdGFuY2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlbmRlcmVkQ29tcG9uZW50KCkuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZW5kZXJlZENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlbmRlcmVkQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFsLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUm9vdDtcbn0oX2NvbXBvbmVudDIuZGVmYXVsdCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFJvb3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2NvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cbnZhciBfY29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuLyoqXG4gKiBQdXJlIGNvbXBvbmVudCBjbGFzcy5cbiAqL1xudmFyIFB1cmVDb21wb25lbnQgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUHVyZUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdXJlQ29tcG9uZW50KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoUHVyZUNvbXBvbmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFB1cmVDb21wb25lbnQpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHVyZUNvbXBvbmVudCwgW3tcbiAgICBrZXk6ICdpc1B1cmVDb21wb25lbnRDbGFzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzUHVyZUNvbXBvbmVudENsYXNzKCkge31cbiAgfV0pO1xuXG4gIHJldHVybiBQdXJlQ29tcG9uZW50O1xufShfY29tcG9uZW50Mi5kZWZhdWx0KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUHVyZUNvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDIwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG4vKlxuICogQ3VycmVudCBQcm9wVHlwZXMgb25seSBleHBvcnQgc29tZSBhcGkgd2l0aCByZWFjdCwgbm90IHZhbGlkYXRlIGluIHJ1bnRpbWUuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHJldHVybiB0eXBlQ2hlY2tlcjtcbiAgfVxuXG4gIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIC8vIE5vb3BcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG52YXIgdHlwZUNoZWNrZXIgPSBjcmVhdGVUeXBlQ2hlY2tlcigpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIGFycmF5OiB0eXBlQ2hlY2tlcixcbiAgYm9vbDogdHlwZUNoZWNrZXIsXG4gIGZ1bmM6IHR5cGVDaGVja2VyLFxuICBudW1iZXI6IHR5cGVDaGVja2VyLFxuICBvYmplY3Q6IHR5cGVDaGVja2VyLFxuICBzdHJpbmc6IHR5cGVDaGVja2VyLFxuICBzeW1ib2w6IHR5cGVDaGVja2VyLFxuICBlbGVtZW50OiB0eXBlQ2hlY2tlcixcbiAgbm9kZTogdHlwZUNoZWNrZXIsXG4gIGFueTogdHlwZUNoZWNrZXIsXG4gIGFycmF5T2Y6IHR5cGVDaGVja2VyLFxuICBpbnN0YW5jZU9mOiB0eXBlQ2hlY2tlcixcbiAgb2JqZWN0T2Y6IHR5cGVDaGVja2VyLFxuICBvbmVPZjogdHlwZUNoZWNrZXIsXG4gIG9uZU9mVHlwZTogdHlwZUNoZWNrZXIsXG4gIHNoYXBlOiB0eXBlQ2hlY2tlclxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblxudmFyIF9pbmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5qZWN0KTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIC8vIENvbXBhdGlibGUgd2l0aCBgcmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spYFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cblxuICAvLyBJbml0IGluamVjdFxuICAoMCwgX2luamVjdDIuZGVmYXVsdCkob3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIHJvb3RDb21wb25lbnQgPSBfaW5zdGFuY2UyLmRlZmF1bHQucmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lcik7XG4gIHZhciBjb21wb25lbnQgPSByb290Q29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG5cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2suY2FsbChjb21wb25lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gcmVuZGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGluamVjdDtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbnZhciBfZW1wdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTtcblxudmFyIF9lbXB0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbXB0eSk7XG5cbnZhciBfbmF0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblxudmFyIF9uYXRpdmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbmF0aXZlKTtcblxudmFyIF90ZXh0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cbnZhciBfdGV4dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90ZXh0KTtcblxudmFyIF9jb21wb3NpdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblxudmFyIF9jb21wb3NpdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9zaXRlKTtcblxudmFyIF9mcmFnbWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xuXG52YXIgX2ZyYWdtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZyYWdtZW50KTtcblxudmFyIF9kcml2ZXJXZWV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7XG5cbnZhciBfZHJpdmVyV2VleDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kcml2ZXJXZWV4KTtcblxudmFyIF9kcml2ZXJCcm93c2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCk7XG5cbnZhciBfZHJpdmVyQnJvd3NlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kcml2ZXJCcm93c2VyKTtcblxudmFyIF9ob29rID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblxudmFyIF9ob29rMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvb2spO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBpbmplY3QoX3JlZikge1xuICB2YXIgZHJpdmVyID0gX3JlZi5kcml2ZXIsXG4gICAgICBob29rID0gX3JlZi5ob29rLFxuICAgICAgbWVhc3VyZXIgPSBfcmVmLm1lYXN1cmVyO1xuXG4gIC8vIEluamVjdCBjb21wb25lbnQgY2xhc3NcbiAgX2hvc3QyLmRlZmF1bHQuRW1wdHlDb21wb25lbnQgPSBfZW1wdHkyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0Lk5hdGl2ZUNvbXBvbmVudCA9IF9uYXRpdmUyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0LlRleHRDb21wb25lbnQgPSBfdGV4dDIuZGVmYXVsdDtcbiAgX2hvc3QyLmRlZmF1bHQuRnJhZ21lbnRDb21wb25lbnQgPSBfZnJhZ21lbnQyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0LkNvbXBvc2l0ZUNvbXBvbmVudCA9IF9jb21wb3NpdGUyLmRlZmF1bHQ7XG4gIC8vIEluamVjdCBkZXZ0b29sIGhvb2tcbiAgX2hvc3QyLmRlZmF1bHQuaG9vayA9IGhvb2sgfHwgX2hvb2syLmRlZmF1bHQ7XG5cbiAgLy8gSW5qZWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVyXG4gIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyID0gbWVhc3VyZXI7XG5cbiAgLy8gSW5qZWN0IHJlbmRlciBkcml2ZXJcbiAgaWYgKCFfaG9zdDIuZGVmYXVsdC5kcml2ZXIpIHtcbiAgICBpZiAoIWRyaXZlcikge1xuICAgICAgaWYgKF91bml2ZXJzYWxFbnYuaXNXZWV4KSB7XG4gICAgICAgIGRyaXZlciA9IF9kcml2ZXJXZWV4Mi5kZWZhdWx0O1xuICAgICAgfSBlbHNlIGlmIChfdW5pdmVyc2FsRW52LmlzV2ViKSB7XG4gICAgICAgIGRyaXZlciA9IF9kcml2ZXJCcm93c2VyMi5kZWZhdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ05vIGJ1aWx0aW4gZHJpdmVyIG1hdGNoZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIgPSBkcml2ZXI7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gKiBFbXB0eSBDb21wb25lbnRcbiAqL1xudmFyIEVtcHR5Q29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbXB0eUNvbXBvbmVudCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1wdHlDb21wb25lbnQpO1xuXG4gICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBudWxsO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEVtcHR5Q29tcG9uZW50LCBbe1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICAgIF9pbnRlcm5hbDogdGhpc1xuICAgICAgfTtcblxuICAgICAgdmFyIG5hdGl2ZU5vZGUgPSB0aGlzLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgIGlmIChjaGlsZE1vdW50ZXIpIHtcbiAgICAgICAgY2hpbGRNb3VudGVyKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYXBwZW5kQ2hpbGQobmF0aXZlTm9kZSwgcGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VubW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50KG5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSAmJiAhbm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUNoaWxkKHRoaXMuX25hdGl2ZU5vZGUsIHRoaXMuX3BhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUNvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIE5vb3BcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXROYXRpdmVOb2RlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmF0aXZlTm9kZSgpIHtcbiAgICAgIC8vIFdlZXggbmF0aXZlIG5vZGVcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbmF0aXZlTm9kZSA9IF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5jcmVhdGVFbXB0eSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fbmF0aXZlTm9kZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRW1wdHlDb21wb25lbnQ7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEVtcHR5Q29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIFRleHQgQ29tcG9uZW50XG4gKi9cbnZhciBUZXh0Q29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUZXh0Q29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dENvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fc3RyaW5nVGV4dCA9IFN0cmluZyhlbGVtZW50KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0Q29tcG9uZW50LCBbe1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5fbW91bnRJRCA9IF9ob3N0Mi5kZWZhdWx0Lm1vdW50SUQrKztcblxuICAgICAgLy8gV2VleCBkb20gb3BlcmF0aW9uXG4gICAgICB2YXIgbmF0aXZlTm9kZSA9IHRoaXMuZ2V0TmF0aXZlTm9kZSgpO1xuXG4gICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgIGNoaWxkTW91bnRlcihuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFwcGVuZENoaWxkKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgICAgX2ludGVybmFsOiB0aGlzXG4gICAgICB9O1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIubW91bnRDb21wb25lbnQodGhpcyk7XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUgJiYgIW5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZCh0aGlzLl9uYXRpdmVOb2RlLCB0aGlzLl9wYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzKTtcblxuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fbmF0aXZlTm9kZSA9IG51bGw7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgICB0aGlzLl9zdHJpbmdUZXh0ID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBjb250ZXh0KSB7XG4gICAgICAvLyBJZiBzb21lIHRleHQgZG8gbm90aW5nXG4gICAgICBpZiAocHJldkVsZW1lbnQgIT09IG5leHRFbGVtZW50KSB7XG4gICAgICAgIC8vIFJlcGxhY2UgY3VycmVudCBlbGVtZW50XG4gICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgICAgIC8vIERldnRvb2wgcmVhZCB0aGUgbGF0ZXN0IHN0cmluZ1RleHQgdmFsdWVcbiAgICAgICAgdGhpcy5fc3RyaW5nVGV4dCA9IFN0cmluZyhuZXh0RWxlbWVudCk7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci51cGRhdGVUZXh0KHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCB0aGlzLl9zdHJpbmdUZXh0KTtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuY3JlYXRlVGV4dCh0aGlzLl9zdHJpbmdUZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOb2RlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0Q29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBUZXh0Q29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9zdGF0ZWxlc3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KTtcblxudmFyIF9zdGF0ZWxlc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RhdGVsZXNzKTtcblxudmFyIF91cGRhdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyk7XG5cbnZhciBfdXBkYXRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91cGRhdGVyKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX3JlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG52YXIgX3JlZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWYpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW50aWF0ZUNvbXBvbmVudCk7XG5cbnZhciBfc2hvdWxkVXBkYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hvdWxkVXBkYXRlQ29tcG9uZW50KTtcblxudmFyIF9zaGFsbG93RXF1YWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcblxudmFyIF9zaGFsbG93RXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hhbGxvd0VxdWFsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gcGVyZm9ybUluU2FuZGJveChmbiwgaGFuZGxlRXJyb3IpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChoYW5kbGVFcnJvcikge1xuICAgICAgaGFuZGxlRXJyb3IoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChfaG9zdDIuZGVmYXVsdC5zYW5kYm94KSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIG1lYXN1cmVMaWZlQ3ljbGUgPSB2b2lkIDA7XG5pZiAoZmFsc2UpIHtcbiAgbWVhc3VyZUxpZmVDeWNsZSA9IGZ1bmN0aW9uIG1lYXN1cmVMaWZlQ3ljbGUoY2FsbGJhY2ssIGluc3RhbmNlSUQsIHR5cGUpIHtcbiAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5iZWZvcmVMaWZlQ3ljbGUoaW5zdGFuY2VJRCwgdHlwZSk7XG4gICAgcGVyZm9ybUluU2FuZGJveChjYWxsYmFjayk7XG4gICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJMaWZlQ3ljbGUoaW5zdGFuY2VJRCwgdHlwZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29tcG9zaXRlIENvbXBvbmVudFxuICovXG5cbnZhciBDb21wb3NpdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXBvc2l0ZUNvbXBvbmVudChlbGVtZW50KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvc2l0ZUNvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29tcG9zaXRlQ29tcG9uZW50LCBbe1xuICAgIGtleTogJ2dldE5hbWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYW1lKCkge1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IubmFtZSB8fCBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5fbW91bnRJRCA9IF9ob3N0Mi5kZWZhdWx0Lm1vdW50SUQrKztcbiAgICAgIHRoaXMuX3VwZGF0ZUNvdW50ID0gMDtcblxuICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLmJlZm9yZU1vdW50Q29tcG9uZW50KHRoaXMuX21vdW50SUQsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICAgIHZhciBwdWJsaWNQcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICAgICAgdmFyIGlzQ2xhc3MgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICAgICAgdmFyIGlzQ29tcG9uZW50Q2xhc3MgPSBpc0NsYXNzICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNDb21wb25lbnRDbGFzcztcbiAgICAgIC8vIENsYXNzIHN0YXRlbGVzcyBjb21wb25lbnQgd2l0aG91dCBzdGF0ZSBidXQgaGF2ZSBsaWZlY3ljbGVzXG4gICAgICB2YXIgaXNTdGF0ZWxlc3NDbGFzcyA9IGlzQ2xhc3MgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXI7XG5cbiAgICAgIC8vIENvbnRleHQgcHJvY2Vzc1xuICAgICAgdmFyIHB1YmxpY0NvbnRleHQgPSB0aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHVibGljIGNsYXNzXG4gICAgICB2YXIgaW5zdGFuY2UgPSB2b2lkIDA7XG4gICAgICB2YXIgcmVuZGVyZWRFbGVtZW50ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoaXNDb21wb25lbnRDbGFzcyB8fCBpc1N0YXRlbGVzc0NsYXNzKSB7XG4gICAgICAgIC8vIENvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICBpbnN0YW5jZSA9IG5ldyBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIF91cGRhdGVyMi5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGdW5jdGlvbmFsIHN0YXRlbGVzcyBjb21wb25lbnQgd2l0aG91dCBzdGF0ZSBhbmQgbGlmZWN5Y2xlc1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBfc3RhdGVsZXNzMi5kZWZhdWx0KENvbXBvbmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBjb21wb25lbnQgdHlwZSAnICsgSlNPTi5zdHJpbmdpZnkoQ29tcG9uZW50KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgYXMgYSBjb252ZW5pZW5jZSBmb3JcbiAgICAgIC8vIHNpbXBsZXIgY2xhc3MgYWJzdHJhY3Rpb25zLCB3ZSBzZXQgdGhlbSB1cCBhZnRlciB0aGUgZmFjdC5cbiAgICAgIGluc3RhbmNlLnByb3BzID0gcHVibGljUHJvcHM7XG4gICAgICBpbnN0YW5jZS5jb250ZXh0ID0gcHVibGljQ29udGV4dDtcbiAgICAgIGluc3RhbmNlLnJlZnMgPSB7fTtcblxuICAgICAgLy8gSW5qZWN0IHRoZSB1cGRhdGVyIGludG8gaW5zdGFuY2VcbiAgICAgIGluc3RhbmNlLnVwZGF0ZXIgPSBfdXBkYXRlcjIuZGVmYXVsdDtcbiAgICAgIGluc3RhbmNlLl9pbnRlcm5hbCA9IHRoaXM7XG4gICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG4gICAgICAvLyBJbml0IHN0YXRlLCBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbFxuICAgICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRPRE8gY2xvbmUgdGhlIHN0YXRlP1xuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHBlcmZvcm1JblNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KSB7XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICAgICAgICB9LCBfdGhpcy5fbW91bnRJRCwgJ2NvbXBvbmVudFdpbGxNb3VudCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09IG51bGwpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuY29tcG9uZW50ID0gdGhpcztcbiAgICAgICAgLy8gUHJvY2VzcyBwZW5kaW5nIHN0YXRlIHdoZW4gY2FsbCBzZXRTdGF0ZSBpbiBjb21wb25lbnRXaWxsTW91bnRcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0KTtcblxuICAgICAgICAvLyBGSVhNRTogaGFuZGxlRXJyb3Igc2hvdWxkIG5hbWVkIGFzIGxpZmVjeWNsZXNcbiAgICAgICAgdmFyIGhhbmRsZUVycm9yID0gdm9pZCAwO1xuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmhhbmRsZUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcihlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5oYW5kbGVFcnJvcihlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgICB9LCBfdGhpcy5fbW91bnRJRCwgJ3JlbmRlcicpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnQgPSBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGhhbmRsZUVycm9yKTtcblxuICAgICAgICBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9ICgwLCBfaW5zdGFudGlhdGVDb21wb25lbnQyLmRlZmF1bHQpKHJlbmRlcmVkRWxlbWVudCk7XG4gICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudC5tb3VudENvbXBvbmVudCh0aGlzLl9wYXJlbnQsIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGNoaWxkTW91bnRlcik7XG5cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCAmJiB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWYpIHtcbiAgICAgICAgX3JlZjIuZGVmYXVsdC5hdHRhY2godGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyLCB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWYsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KSB7XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgIH0sIF90aGlzLl9tb3VudElELCAnY29tcG9uZW50RGlkTW91bnQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIubW91bnRDb21wb25lbnQodGhpcyk7XG5cbiAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5hZnRlck1vdW50Q29tcG9uZW50KHRoaXMuX21vdW50SUQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5tb3VudENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubW91bnRDb21wb25lbnQobm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuXG4gICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KSB7XG4gICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHRoaXMpO1xuXG4gICAgICBpbnN0YW5jZS5faW50ZXJuYWwgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWRDb21wb25lbnQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5fY3VycmVudEVsZW1lbnQucmVmO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgX3JlZjIuZGVmYXVsdC5kZXRhY2godGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyLCByZWYsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgIC8vIFJlc2V0IHBlbmRpbmcgZmllbGRzXG4gICAgICAvLyBFdmVuIGlmIHRoaXMgY29tcG9uZW50IGlzIHNjaGVkdWxlZCBmb3IgYW5vdGhlciB1cGRhdGUgaW4gUmVhY3RVcGRhdGVzLFxuICAgICAgLy8gaXQgd291bGQgc3RpbGwgYmUgaWdub3JlZCBiZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUgcmVzZXQuXG4gICAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgLy8gVGhlc2UgZmllbGRzIGRvIG5vdCByZWFsbHkgbmVlZCB0byBiZSByZXNldCBzaW5jZSB0aGlzIG9iamVjdCBpcyBub1xuICAgICAgLy8gbG9uZ2VyIGFjY2Vzc2libGUuXG4gICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW5cbiAgICAgKiBgY29udGV4dFR5cGVzYFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfcHJvY2Vzc0NvbnRleHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc0NvbnRleHQoY29udGV4dCkge1xuICAgICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICB2YXIgY29udGV4dFR5cGVzID0gQ29tcG9uZW50LmNvbnRleHRUeXBlcztcbiAgICAgIGlmICghY29udGV4dFR5cGVzKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXNrZWRDb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBjb250ZXh0TmFtZSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgICAgbWFza2VkQ29udGV4dFtjb250ZXh0TmFtZV0gPSBjb250ZXh0W2NvbnRleHROYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXNrZWRDb250ZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19wcm9jZXNzQ2hpbGRDb250ZXh0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Byb2Nlc3NDaGlsZENvbnRleHQoY3VycmVudENvbnRleHQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgdmFyIGNoaWxkQ29udGV4dCA9IGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAmJiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcbiAgICAgIGlmIChjaGlsZENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19wcm9jZXNzUGVuZGluZ1N0YXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Byb2Nlc3NQZW5kaW5nU3RhdGUocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgdmFyIHF1ZXVlID0gdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU7XG4gICAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zdGF0ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IHBlbmRpbmcgcXVldWVcbiAgICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIHZhciBuZXh0U3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBpbnN0YW5jZS5zdGF0ZSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsID0gcXVldWVbaV07XG4gICAgICAgIE9iamVjdC5hc3NpZ24obmV4dFN0YXRlLCB0eXBlb2YgcGFydGlhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcnRpYWwuY2FsbChpbnN0YW5jZSwgbmV4dFN0YXRlLCBwcm9wcywgY29udGV4dCkgOiBwYXJ0aWFsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBuZXh0VW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLmJlZm9yZVVwZGF0ZUNvbXBvbmVudCh0aGlzLl9tb3VudElELCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVcGRhdGUgY29tcG9uZW50IFxcJycgKyB0aGlzLmdldE5hbWUoKSArICdcXCcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVubW91bnRlZCAob3IgZmFpbGVkIHRvIG1vdW50KS4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHdpbGxSZWNlaXZlID0gZmFsc2U7XG4gICAgICB2YXIgbmV4dENvbnRleHQgPSB2b2lkIDA7XG4gICAgICB2YXIgbmV4dFByb3BzID0gdm9pZCAwO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQgb3Igbm90XG4gICAgICBpZiAodGhpcy5fY29udGV4dCA9PT0gbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgICAgICBuZXh0Q29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0Q29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KG5leHRVbm1hc2tlZENvbnRleHQpO1xuICAgICAgICB3aWxsUmVjZWl2ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERpc3Rpbmd1aXNoIGJldHdlZW4gYSBwcm9wcyB1cGRhdGUgdmVyc3VzIGEgc2ltcGxlIHN0YXRlIHVwZGF0ZVxuICAgICAgaWYgKHByZXZFbGVtZW50ID09PSBuZXh0RWxlbWVudCkge1xuICAgICAgICAvLyBTa2lwIGNoZWNraW5nIHByb3AgdHlwZXMgYWdhaW4gLS0gd2UgZG9uJ3QgcmVhZCBjb21wb25lbnQucHJvcHMgdG8gYXZvaWRcbiAgICAgICAgLy8gd2FybmluZyBmb3IgRE9NIGNvbXBvbmVudCBwcm9wcyBpbiB0aGlzIHVwZ3JhZGVcbiAgICAgICAgbmV4dFByb3BzID0gbmV4dEVsZW1lbnQucHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0UHJvcHMgPSBuZXh0RWxlbWVudC5wcm9wcztcbiAgICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGFzUmVjZWl2ZWQgPSB3aWxsUmVjZWl2ZSAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuXG4gICAgICBpZiAoaGFzUmVjZWl2ZWQpIHtcbiAgICAgICAgLy8gQ2FsbGluZyB0aGlzLnNldFN0YXRlKCkgd2l0aGluIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgd2lsbCBub3QgdHJpZ2dlciBhbiBhZGRpdGlvbmFsIHJlbmRlci5cbiAgICAgICAgdGhpcy5fcGVuZGluZ1N0YXRlID0gdHJ1ZTtcbiAgICAgICAgcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdTdGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgX3JlZjIuZGVmYXVsdC51cGRhdGUocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCB0aGlzKTtcblxuICAgICAgLy8gU2hvdWQgdXBkYXRlIGFsd2F5cyBkZWZhdWx0XG4gICAgICB2YXIgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIHZhciBwcmV2UHJvcHMgPSBpbnN0YW5jZS5wcm9wcztcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcbiAgICAgIC8vIFRPRE86IGNvdWxkIGRlbGF5IGV4ZWN1dGlvbiBwcm9jZXNzUGVuZGluZ1N0YXRlXG4gICAgICB2YXIgbmV4dFN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcblxuICAgICAgLy8gU2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIG5vdCBjYWxsZWQgd2hlbiBmb3JjZVVwZGF0ZSBpcyB1c2VkXG4gICAgICBpZiAoIXRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkge1xuICAgICAgICBpZiAoaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuaXNQdXJlQ29tcG9uZW50Q2xhc3MpIHtcbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSAhKDAsIF9zaGFsbG93RXF1YWwyLmRlZmF1bHQpKHByZXZQcm9wcywgbmV4dFByb3BzKSB8fCAhKDAsIF9zaGFsbG93RXF1YWwyLmRlZmF1bHQpKHByZXZTdGF0ZSwgbmV4dFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAvLyBXaWxsIHNldCBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAuXG4gICAgICAgIHZhciBwcmV2Q29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG5cbiAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLnNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVwZGF0ZS5cbiAgICAgICAgLy8gSWYgbmVlZCB0byB1cGRhdGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gYSBwcm9wIGNoYW5nZSwgdXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaW5zdGVhZC5cbiAgICAgICAgcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBuZXh0XG4gICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBuZXh0VW5tYXNrZWRDb250ZXh0O1xuICAgICAgICBpbnN0YW5jZS5wcm9wcyA9IG5leHRQcm9wcztcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICAgIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcblxuICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudChuZXh0VW5tYXNrZWRDb250ZXh0KTtcblxuICAgICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIHByZXZDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBpdCdzIGRldGVybWluZWQgdGhhdCBhIGNvbXBvbmVudCBzaG91bGQgbm90IHVwZGF0ZSwgd2Ugc3RpbGwgd2FudFxuICAgICAgICAvLyB0byBzZXQgcHJvcHMgYW5kIHN0YXRlIGJ1dCB3ZSBzaG9ydGN1dCB0aGUgcmVzdCBvZiB0aGUgdXBkYXRlLlxuICAgICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgICAgICB0aGlzLl9jb250ZXh0ID0gbmV4dFVubWFza2VkQ29udGV4dDtcbiAgICAgICAgaW5zdGFuY2UucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgICAgIGluc3RhbmNlLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEZsdXNoIHNldFN0YXRlIGNhbGxiYWNrcyBzZXQgaW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1xuICAgICAgaWYgKGhhc1JlY2VpdmVkKSB7XG4gICAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcbiAgICAgICAgX3VwZGF0ZXIyLmRlZmF1bHQucnVuQ2FsbGJhY2tzKGNhbGxiYWNrcywgaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJVcGRhdGVDb21wb25lbnQodGhpcy5fbW91bnRJRCk7XG4gICAgICB9XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCBhbmQgdXBkYXRlIHRoZSBET00gYWNjb3JkaW5nbHkuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ191cGRhdGVSZW5kZXJlZENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVSZW5kZXJlZENvbXBvbmVudChjb250ZXh0KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHByZXZSZW5kZXJlZENvbXBvbmVudCA9IHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgICAgdmFyIHByZXZSZW5kZXJlZEVsZW1lbnQgPSBwcmV2UmVuZGVyZWRDb21wb25lbnQuX2N1cnJlbnRFbGVtZW50O1xuXG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgIHZhciBuZXh0UmVuZGVyZWRFbGVtZW50ID0gdm9pZCAwO1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQgPSB0aGlzO1xuXG4gICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgbWVhc3VyZUxpZmVDeWNsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBuZXh0UmVuZGVyZWRFbGVtZW50ID0gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgfSwgX3RoaXMyLl9tb3VudElELCAncmVuZGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFJlbmRlcmVkRWxlbWVudCA9IGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2hvc3QyLmRlZmF1bHQuY29tcG9uZW50ID0gbnVsbDtcblxuICAgICAgaWYgKCgwLCBfc2hvdWxkVXBkYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShwcmV2UmVuZGVyZWRFbGVtZW50LCBuZXh0UmVuZGVyZWRFbGVtZW50KSkge1xuICAgICAgICBwcmV2UmVuZGVyZWRDb21wb25lbnQudXBkYXRlQ29tcG9uZW50KHByZXZSZW5kZXJlZEVsZW1lbnQsIG5leHRSZW5kZXJlZEVsZW1lbnQsIHByZXZSZW5kZXJlZENvbXBvbmVudC5fY29udGV4dCwgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSk7XG4gICAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLnJlY29yZE9wZXJhdGlvbih7XG4gICAgICAgICAgICBpbnN0YW5jZUlEOiB0aGlzLl9tb3VudElELFxuICAgICAgICAgICAgdHlwZTogJ3VwZGF0ZSBjb21wb25lbnQnLFxuICAgICAgICAgICAgcGF5bG9hZDoge31cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9sZENoaWxkID0gcHJldlJlbmRlcmVkQ29tcG9uZW50LmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgcHJldlJlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21wb25lbnQodHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShuZXh0UmVuZGVyZWRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQubW91bnRDb21wb25lbnQodGhpcy5fcGFyZW50LCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpLCBmdW5jdGlvbiAobmV3Q2hpbGQsIHBhcmVudCkge1xuICAgICAgICAgIC8vIFRPRE86IER1cGxpY2F0ZSBjb2RlIGluIG5hdGl2ZSBjb21wb25lbnQgZmlsZVxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgICAgICAgIG5ld0NoaWxkID0gW25ld0NoaWxkXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBvbGRDaGlsZCBvciBuZXdDaGlsZCBhbGwgbWF5YmUgZnJhZ21lbnRcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkQ2hpbGQpKSB7XG4gICAgICAgICAgICBvbGRDaGlsZCA9IFtvbGRDaGlsZF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgbmV3Q2hpbGQgY291bnQgbGFyZ2UgdGhlbiBvbGRDaGlsZFxuICAgICAgICAgIHZhciBsYXN0TmV3Q2hpbGQgPSB2b2lkIDA7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRbaV07XG4gICAgICAgICAgICBpZiAob2xkQ2hpbGRbaV0pIHtcbiAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlcGxhY2VDaGlsZChjaGlsZCwgb2xkQ2hpbGRbaV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmluc2VydEFmdGVyKGNoaWxkLCBsYXN0TmV3Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE5ld0NoaWxkID0gY2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgbmV3Q2hpbGQgY291bnQgbGVzcyB0aGVuIG9sZENoaWxkXG4gICAgICAgICAgaWYgKG5ld0NoaWxkLmxlbmd0aCA8IG9sZENoaWxkLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSBuZXdDaGlsZC5sZW5ndGg7IF9pIDwgb2xkQ2hpbGQubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZChvbGRDaGlsZFtfaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICB2YXIgcmVuZGVyZWRDb21wb25lbnQgPSB0aGlzLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIGlmIChyZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gcmVuZGVyZWRDb21wb25lbnQuZ2V0TmF0aXZlTm9kZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFB1YmxpY0luc3RhbmNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoKSB7XG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgIC8vIFRoZSBTdGF0ZWxlc3MgY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmc1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgX3N0YXRlbGVzczIuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcG9zaXRlQ29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDb21wb3NpdGVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAyNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICogU3RhdGVsZXNzIENvbXBvbmVudCBDbGFzcyBXcmFwcGVyXG4gKi9cbnZhciBTdGF0ZWxlc3NDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN0YXRlbGVzc0NvbXBvbmVudChwdXJlUmVuZGVyKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRlbGVzc0NvbXBvbmVudCk7XG5cbiAgICAvLyBBIHN0YXRlbGVzcyBmdW5jdGlvblxuICAgIHRoaXMucHVyZVJlbmRlciA9IHB1cmVSZW5kZXI7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3RhdGVsZXNzQ29tcG9uZW50LCBbe1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5iZWZvcmVSZW5kZXIoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucHVyZVJlbmRlcih0aGlzLnByb3BzLCB0aGlzLmNvbnRleHQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTdGF0ZWxlc3NDb21wb25lbnQ7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFN0YXRlbGVzc0NvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDI3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5mdW5jdGlvbiBlbnF1ZXVlQ2FsbGJhY2soaW50ZXJuYWwsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHZhciBjYWxsYmFja1F1ZXVlID0gaW50ZXJuYWwuX3BlbmRpbmdDYWxsYmFja3MgfHwgKGludGVybmFsLl9wZW5kaW5nQ2FsbGJhY2tzID0gW10pO1xuICAgIGNhbGxiYWNrUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlKGludGVybmFsLCBwYXJ0aWFsU3RhdGUpIHtcbiAgaWYgKHBhcnRpYWxTdGF0ZSkge1xuICAgIHZhciBzdGF0ZVF1ZXVlID0gaW50ZXJuYWwuX3BlbmRpbmdTdGF0ZVF1ZXVlIHx8IChpbnRlcm5hbC5fcGVuZGluZ1N0YXRlUXVldWUgPSBbXSk7XG4gICAgc3RhdGVRdWV1ZS5wdXNoKHBhcnRpYWxTdGF0ZSk7XG4gIH1cbn1cblxudmFyIFVwZGF0ZXIgPSB7XG4gIHNldFN0YXRlOiBmdW5jdGlvbiBzZXRTdGF0ZShjb21wb25lbnQsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW50ZXJuYWwgPSBjb21wb25lbnQuX2ludGVybmFsO1xuXG4gICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVucXVldWVTdGF0ZShpbnRlcm5hbCwgcGFydGlhbFN0YXRlKTtcbiAgICBlbnF1ZXVlQ2FsbGJhY2soaW50ZXJuYWwsIGNhbGxiYWNrKTtcblxuICAgIGlmICghaW50ZXJuYWwuX3BlbmRpbmdTdGF0ZSkge1xuICAgICAgdGhpcy5ydW5VcGRhdGUoY29tcG9uZW50KTtcbiAgICB9XG4gIH0sXG5cbiAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKGNvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW50ZXJuYWwgPSBjb21wb25lbnQuX2ludGVybmFsO1xuXG4gICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGludGVybmFsLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSB0cnVlO1xuXG4gICAgZW5xdWV1ZUNhbGxiYWNrKGludGVybmFsLCBjYWxsYmFjayk7XG4gICAgdGhpcy5ydW5VcGRhdGUoY29tcG9uZW50KTtcbiAgfSxcblxuICBydW5VcGRhdGU6IGZ1bmN0aW9uIHJ1blVwZGF0ZShjb21wb25lbnQpIHtcbiAgICB2YXIgaW50ZXJuYWwgPSBjb21wb25lbnQuX2ludGVybmFsO1xuXG4gICAgaWYgKCFpbnRlcm5hbCB8fCAhaW50ZXJuYWwuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdXBkYXRlQ29tcG9uZW50IGhhcHBlbnMgdG8gZW5xdWV1ZSBhbnkgbmV3IHVwZGF0ZXMsIHdlXG4gICAgLy8gc2hvdWxkbid0IGV4ZWN1dGUgdGhlIGNhbGxiYWNrcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgaGFwcGVucywgc29cbiAgICAvLyBzdGFzaCB0aGUgY2FsbGJhY2tzIGZpcnN0XG4gICAgdmFyIGNhbGxiYWNrcyA9IGludGVybmFsLl9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgIGludGVybmFsLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcblxuICAgIHZhciBwcmV2RWxlbWVudCA9IGludGVybmFsLl9jdXJyZW50RWxlbWVudDtcbiAgICB2YXIgcHJldlVubWFza2VkQ29udGV4dCA9IGludGVybmFsLl9jb250ZXh0O1xuXG4gICAgaWYgKGludGVybmFsLl9wZW5kaW5nU3RhdGVRdWV1ZSB8fCBpbnRlcm5hbC5fcGVuZGluZ0ZvcmNlVXBkYXRlKSB7XG4gICAgICBpbnRlcm5hbC51cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIHByZXZFbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBwcmV2VW5tYXNrZWRDb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bkNhbGxiYWNrcyhjYWxsYmFja3MsIGNvbXBvbmVudCk7XG4gIH0sXG5cbiAgcnVuQ2FsbGJhY2tzOiBmdW5jdGlvbiBydW5DYWxsYmFja3MoY2FsbGJhY2tzLCBjb250ZXh0KSB7XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldLmNhbGwoY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBVcGRhdGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSksXG4vKiAyOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoeCA9PT0geSkge1xuICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCh0eXBlb2Ygb2JqQSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqQSkpICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqQiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqQikpICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHNoYWxsb3dFcXVhbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDI5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxudmFyIF9uYXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG52YXIgX25hdGl2ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9uYXRpdmUpO1xuXG52YXIgX2luc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxudmFyIF9pbnN0YW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW5jZSk7XG5cbnZhciBfaW5zdGFudGlhdGVDb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbnRpYXRlQ29tcG9uZW50KTtcblxudmFyIF9nZXRFbGVtZW50S2V5TmFtZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG52YXIgX2dldEVsZW1lbnRLZXlOYW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEVsZW1lbnRLZXlOYW1lKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vKipcbiAqIEZyYWdtZW50IENvbXBvbmVudFxuICovXG52YXIgRnJhZ21lbnRDb21wb25lbnQgPSBmdW5jdGlvbiAoX05hdGl2ZUNvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRnJhZ21lbnRDb21wb25lbnQsIF9OYXRpdmVDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZyYWdtZW50Q29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRnJhZ21lbnRDb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGcmFnbWVudENvbXBvbmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZyYWdtZW50Q29tcG9uZW50KSkuY2FsbCh0aGlzLCBlbGVtZW50KSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRnJhZ21lbnRDb21wb25lbnQsIFt7XG4gICAga2V5OiAnbW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENvbXBvbmVudChwYXJlbnQsIGNvbnRleHQsIGNoaWxkTW91bnRlcikge1xuICAgICAgLy8gUGFyZW50IG5hdGl2ZSBlbGVtZW50XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMuX21vdW50SUQgPSBfaG9zdDIuZGVmYXVsdC5tb3VudElEKys7XG5cbiAgICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgICAgX2ludGVybmFsOiB0aGlzXG4gICAgICB9O1xuICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jdXJyZW50RWxlbWVudDtcblxuICAgICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgICAgdGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KTtcblxuICAgICAgaWYgKGNoaWxkTW91bnRlcikge1xuICAgICAgICBjaGlsZE1vdW50ZXIoZnJhZ21lbnQsIHBhcmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXNGcmFnbWVudFBhcmVudCA9IEFycmF5LmlzQXJyYXkocGFyZW50KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFnbWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjaGlsZCA9IGZyYWdtZW50W2ldO1xuICAgICAgICAgIC8vIFdoZW4gdGhlIHBhcmVudCBpcyBhbHNvIGEgZnJhZ21lbnRcbiAgICAgICAgICBpZiAoaXNGcmFnbWVudFBhcmVudCkge1xuICAgICAgICAgICAgcGFyZW50LnB1c2goY2hpbGQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYXBwZW5kQ2hpbGQoY2hpbGQsIHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdtb3VudENoaWxkcmVuJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDaGlsZHJlbihjaGlsZHJlbiwgY29udGV4dCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IHt9O1xuICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuSW1hZ2UgPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciByZW5kZXJlZENoaWxkID0gKDAsIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIuZGVmYXVsdCkoZWxlbWVudCk7XG4gICAgICAgIHZhciBuYW1lID0gKDAsIF9nZXRFbGVtZW50S2V5TmFtZTIuZGVmYXVsdCkocmVuZGVyZWRDaGlsZHJlbiwgZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuW25hbWVdID0gcmVuZGVyZWRDaGlsZDtcbiAgICAgICAgcmVuZGVyZWRDaGlsZC5fbW91bnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBNb3VudFxuICAgICAgICB2YXIgbW91bnRJbWFnZSA9IHJlbmRlcmVkQ2hpbGQubW91bnRDb21wb25lbnQoX3RoaXMyLl9wYXJlbnQsIGNvbnRleHQsIGZ1bmN0aW9uIChuYXRpdmVOb2RlKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmF0aXZlTm9kZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmF0aXZlTm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBmcmFnbWVudC5wdXNoKG5hdGl2ZU5vZGVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcmFnbWVudC5wdXNoKG5hdGl2ZU5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtb3VudEltYWdlO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZW5kZXJlZENoaWxkcmVuSW1hZ2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5tb3VudENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubW91bnRDb21wb25lbnQobm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlKSB7XG4gICAgICAgIF9pbnN0YW5jZTIuZGVmYXVsdC5yZW1vdmUodGhpcy5fbmF0aXZlTm9kZSk7XG4gICAgICAgIGlmICghbm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX25hdGl2ZU5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZCh0aGlzLl9uYXRpdmVOb2RlW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG8gbm90IG5lZWQgcmVtb3ZlIGNoaWxkIHdoZW4gdGhlaXIgcGFyZW50IGlzIHJlbW92ZWRcbiAgICAgIHRoaXMudW5tb3VudENoaWxkcmVuKHRydWUpO1xuXG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9uYXRpdmVOb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBwcmV2Q29udGV4dCwgbmV4dENvbnRleHQpIHtcbiAgICAgIC8vIFJlcGxhY2UgY3VycmVudCBlbGVtZW50XG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbih0aGlzLl9jdXJyZW50RWxlbWVudCwgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldE5hdGl2ZU5vZGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYXRpdmVOb2RlKCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9uYXRpdmVOb2RlID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFB1YmxpY0luc3RhbmNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmFtZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hbWUoKSB7XG4gICAgICByZXR1cm4gJ2ZyYWdtZW50JztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRnJhZ21lbnRDb21wb25lbnQ7XG59KF9uYXRpdmUyLmRlZmF1bHQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBGcmFnbWVudENvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDMwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mMiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YyKG9iaik7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mMihvYmopO1xufTsgLyoqXG4gICAgKiBXZWV4IGRyaXZlclxuICAgICovXG5cbnZhciBfc3R5bGVVbml0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbnZhciBfZWxlbWVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKTtcblxudmFyIF9lbGVtZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50cyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9O1xufVxuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIElEID0gJ2lkJztcbnZhciBURVhUID0gJ3RleHQnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBFVkVOVF9QUkVGSVhfUkVHRVhQID0gL15vbltBLVpdLztcbnZhciBGVUxMX1dJRFRIX1JFTSA9IDc1MDtcbnZhciBBUklBX1BSRUZJWF9SRUdFWFAgPSAvXmFyaWEtLztcblxudmFyIG5vZGVNYXBzID0ge307XG4vKiBnbG9iYWwgX193ZWV4X2RvY3VtZW50X18gKi9cbnZhciBkb2N1bWVudCA9ICh0eXBlb2YgX193ZWV4X2RvY3VtZW50X18gPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKF9fd2VleF9kb2N1bWVudF9fKSkgPT09ICdvYmplY3QnID8gX193ZWV4X2RvY3VtZW50X18gOiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihkb2N1bWVudCkpID09PSAnb2JqZWN0JyA/IGRvY3VtZW50IDogbnVsbDtcblxudmFyIERyaXZlciA9IHtcbiAgZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIG5vZGVNYXBzW2lkXTtcbiAgfSxcbiAgY3JlYXRlQm9keTogZnVuY3Rpb24gY3JlYXRlQm9keSgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmNyZWF0ZUJvZHkoKTtcbiAgICBkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYm9keSk7XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfSxcbiAgY3JlYXRlQ29tbWVudDogZnVuY3Rpb24gY3JlYXRlQ29tbWVudChjb250ZW50KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY29udGVudCk7XG4gIH0sXG4gIGNyZWF0ZUVtcHR5OiBmdW5jdGlvbiBjcmVhdGVFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDb21tZW50KCcgZW1wdHkgJyk7XG4gIH0sXG4gIGNyZWF0ZVRleHQ6IGZ1bmN0aW9uIGNyZWF0ZVRleHQodGV4dCkge1xuICAgIHJldHVybiBEcml2ZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICB0eXBlOiBURVhULFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgdmFsdWU6IHRleHRcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgdXBkYXRlVGV4dDogZnVuY3Rpb24gdXBkYXRlVGV4dChub2RlLCBjb250ZW50KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobm9kZSwgJ3ZhbHVlJywgY29udGVudCk7XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50KSB7XG4gICAgdmFyIGh0bWxFbGVtZW50ID0gX2VsZW1lbnRzMi5kZWZhdWx0W2NvbXBvbmVudC50eXBlXTtcbiAgICBpZiAoaHRtbEVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudCA9IGh0bWxFbGVtZW50LnBhcnNlKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgdmFyIHByb3BzID0gY29tcG9uZW50LnByb3BzO1xuICAgIHZhciBldmVudHMgPSBbXTtcbiAgICB2YXIgc3R5bGUgPSB7fTtcbiAgICB2YXIgb3JpZ2luU3R5bGUgPSBwcm9wc1tTVFlMRV07XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvcmlnaW5TdHlsZSkge1xuICAgICAgc3R5bGVbcHJvcF0gPSAoMCwgX3N0eWxlVW5pdC5jb252ZXJ0VW5pdCkob3JpZ2luU3R5bGVbcHJvcF0sIHByb3ApO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjb21wb25lbnQudHlwZSwge1xuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldE5hdGl2ZVByb3BzKG5vZGUsIHByb3BzLCB0cnVlKTtcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgfSxcbiAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIHJlbW92ZUNoaWxkKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgdmFyIGlkID0gbm9kZS5hdHRyICYmIG5vZGUuYXR0cltJRF07XG4gICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgIG5vZGVNYXBzW2lkXSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG4gIH0sXG4gIHJlcGxhY2VDaGlsZDogZnVuY3Rpb24gcmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IG9sZENoaWxkLnBhcmVudE5vZGU7XG4gICAgdmFyIHByZXZpb3VzU2libGluZyA9IG9sZENoaWxkLnByZXZpb3VzU2libGluZztcbiAgICB2YXIgbmV4dFNpYmxpbmcgPSBvbGRDaGlsZC5uZXh0U2libGluZztcbiAgICB0aGlzLnJlbW92ZUNoaWxkKG9sZENoaWxkLCBwYXJlbnQpO1xuXG4gICAgaWYgKHByZXZpb3VzU2libGluZykge1xuICAgICAgdGhpcy5pbnNlcnRBZnRlcihuZXdDaGlsZCwgcHJldmlvdXNTaWJsaW5nLCBwYXJlbnQpO1xuICAgIH0gZWxzZSBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBuZXh0U2libGluZywgcGFyZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChuZXdDaGlsZCwgcGFyZW50KTtcbiAgICB9XG4gIH0sXG4gIGluc2VydEFmdGVyOiBmdW5jdGlvbiBpbnNlcnRBZnRlcihub2RlLCBhZnRlciwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IGFmdGVyLnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIHBhcmVudC5pbnNlcnRBZnRlcihub2RlLCBhZnRlcik7XG4gIH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IGJlZm9yZS5wYXJlbnROb2RlO1xuICAgIHJldHVybiBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSk7XG4gIH0sXG4gIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpIHtcbiAgICByZXR1cm4gbm9kZS5hZGRFdmVudChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gIH0sXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpIHtcbiAgICByZXR1cm4gbm9kZS5yZW1vdmVFdmVudChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gIH0sXG4gIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxFdmVudExpc3RlbmVycyhub2RlKSB7XG4gICAgLy8gTm9vcFxuICB9LFxuICByZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZShub2RlLCBwcm9wS2V5LCBwcm9wVmFsdWUpIHtcbiAgICBpZiAocHJvcEtleSA9PSBJRCkge1xuICAgICAgbm9kZU1hcHNbcHJvcFZhbHVlXSA9IG51bGw7XG4gICAgfVxuICAgIC8vIFdlZXggbmF0aXZlIHdpbGwgY3Jhc2ggd2hlbiBwYXNzIG51bGwgdmFsdWVcbiAgICByZXR1cm4gbm9kZS5zZXRBdHRyKHByb3BLZXksIHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9LFxuICBzZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShub2RlLCBwcm9wS2V5LCBwcm9wVmFsdWUpIHtcbiAgICBpZiAocHJvcEtleSA9PSBJRCkge1xuICAgICAgbm9kZU1hcHNbcHJvcFZhbHVlXSA9IG5vZGU7XG4gICAgfVxuXG4gICAgLy8gV2VleCBvbmx5IHN1cHBvcnQgYGFyaWFMYWJlbGAgZm9ybWF0LCBjb252ZXJ0IGBhcmlhLWxhYmVsYCBmb3JtYXQgdG8gY2FtZWxjYXNlXG4gICAgaWYgKEFSSUFfUFJFRklYX1JFR0VYUC50ZXN0KHByb3BLZXkpKSB7XG4gICAgICBwcm9wS2V5ID0gcHJvcEtleS5yZXBsYWNlKC9cXC0oXFx3KS8sIGZ1bmN0aW9uIChtLCBwMSkge1xuICAgICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlLnNldEF0dHIocHJvcEtleSwgcHJvcFZhbHVlLCBmYWxzZSk7XG4gIH0sXG4gIHNldFN0eWxlczogZnVuY3Rpb24gc2V0U3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICAgIC8vIFRPRE8gaWYgbW9yZSB0aGVuIG9uZSBzdHlsZSB1cGRhdGUsIGNhbGwgc2V0U3R5bGVzIHdpbGwgYmUgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgICAgdmFyIHZhbCA9IHN0eWxlc1trZXldO1xuICAgICAgdmFsID0gKDAsIF9zdHlsZVVuaXQuY29udmVydFVuaXQpKHZhbCwga2V5KTtcbiAgICAgIG5vZGUuc2V0U3R5bGUoa2V5LCB2YWwpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiBiZWZvcmVSZW5kZXIoKSB7XG4gICAgLy8gVHVybiBvZmYgYmF0Y2hlZCB1cGRhdGVzXG4gICAgZG9jdW1lbnQub3BlbigpO1xuXG4gICAgLy8gSW5pdCByZW0gdW5pdFxuICAgICgwLCBfc3R5bGVVbml0LnNldFJlbSkodGhpcy5nZXRXaW5kb3dXaWR0aCgpIC8gRlVMTF9XSURUSF9SRU0pO1xuICB9LFxuICBhZnRlclJlbmRlcjogZnVuY3Rpb24gYWZ0ZXJSZW5kZXIoKSB7XG4gICAgaWYgKGRvY3VtZW50Lmxpc3RlbmVyICYmIGRvY3VtZW50Lmxpc3RlbmVyLmNyZWF0ZUZpbmlzaCkge1xuICAgICAgZG9jdW1lbnQubGlzdGVuZXIuY3JlYXRlRmluaXNoKCk7XG4gICAgfVxuXG4gICAgLy8gVHVybiBvbiBiYXRjaGVkIHVwZGF0ZXNcbiAgICBkb2N1bWVudC5jbG9zZSgpO1xuICB9LFxuICBnZXRXaW5kb3dXaWR0aDogZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gICAgcmV0dXJuIEZVTExfV0lEVEhfUkVNO1xuICB9LFxuICBzZXROYXRpdmVQcm9wczogZnVuY3Rpb24gc2V0TmF0aXZlUHJvcHMobm9kZSwgcHJvcHMsIHNraXBTZXRTdHlsZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHByb3BzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSBDSElMRFJFTikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHByb3AgPT09IFNUWUxFKSB7XG4gICAgICAgICAgaWYgKHNraXBTZXRTdHlsZXMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFN0eWxlcyhub2RlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoRVZFTlRfUFJFRklYX1JFR0VYUC50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IHByb3Auc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobm9kZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBEcml2ZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2ltZyA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpO1xuXG52YXIgX2ltZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbWcpO1xuXG52YXIgX3ZpZGVvID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMyk7XG5cbnZhciBfdmlkZW8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlkZW8pO1xuXG52YXIgX3RleHRhcmVhID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG5cbnZhciBfdGV4dGFyZWEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdGV4dGFyZWEpO1xuXG52YXIgX3NwYW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KTtcblxudmFyIF9zcGFuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NwYW4pO1xuXG52YXIgX3AgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KTtcblxudmFyIF9wMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ApO1xuXG52YXIgX2J1dHRvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpO1xuXG52YXIgX2J1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9idXR0b24pO1xuXG52YXIgX2hlYWRpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblxudmFyIF9oZWFkaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlYWRpbmcpO1xuXG52YXIgX2Jsb2NrID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOSk7XG5cbnZhciBfYmxvY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmxvY2spO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBzcGFuOiBfc3BhbjIuZGVmYXVsdCxcbiAgcDogX3AyLmRlZmF1bHQsXG4gIGltZzogX2ltZzIuZGVmYXVsdCxcbiAgYnV0dG9uOiBfYnV0dG9uMi5kZWZhdWx0LFxuICB2aWRlbzogX3ZpZGVvMi5kZWZhdWx0LFxuICB0ZXh0YXJlYTogX3RleHRhcmVhMi5kZWZhdWx0LFxuICBoMTogX2hlYWRpbmcyLmRlZmF1bHQsXG4gIGgyOiBfaGVhZGluZzIuZGVmYXVsdCxcbiAgaDM6IF9oZWFkaW5nMi5kZWZhdWx0LFxuICBoNDogX2hlYWRpbmcyLmRlZmF1bHQsXG4gIGg1OiBfaGVhZGluZzIuZGVmYXVsdCxcbiAgaDY6IF9oZWFkaW5nMi5kZWZhdWx0LFxuICBuYXY6IF9ibG9jazIuZGVmYXVsdCxcbiAgYXJ0aWNsZTogX2Jsb2NrMi5kZWZhdWx0LFxuICBzZWN0aW9uOiBfYmxvY2syLmRlZmF1bHQsXG4gIC8vIENvbmZsaWN0IHdpdGggd2VleCBoZWFkZXIgdGFnXG4gIC8vIGhlYWRlcjogYmxvY2ssXG4gIGZvb3RlcjogX2Jsb2NrMi5kZWZhdWx0LFxuICBhc2lkZTogX2Jsb2NrMi5kZWZhdWx0LFxuICBtYWluOiBfYmxvY2syLmRlZmF1bHRcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3BhcnNlUHJvcHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuXG4gIC8qKlxuICAgKiBwYXJzZSB3M2MgYXR0cnMgdG8gd2VleCBtb2R1bGUgYXR0cnNcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHczYyBjb21wb25lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHdlZXggY29tcG9uZW50IGRhdGFcbiAgICovXG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICBjb21wb25lbnQudHlwZSA9ICdpbWFnZSc7XG5cbiAgICAvLyBtb2RpZnkgcHJvcHNcbiAgICBjb21wb25lbnQucHJvcHMgPSAoMCwgX3BhcnNlUHJvcHMudHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGUpKHByb3BzLCBbJ3dpZHRoJywgJ2hlaWdodCddKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3BhcnNlUHJvcHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuXG4gIC8qKlxuICAgKiBwYXJzZSB3M2MgYXR0cnMgdG8gd2VleCBtb2R1bGUgYXR0cnNcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHczYyBjb21wb25lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHdlZXggY29tcG9uZW50IGRhdGFcbiAgICovXG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICAvLyBtb2RpZnkgcHJvcHNcblxuICAgIGNvbXBvbmVudC5wcm9wcyA9ICgwLCBfcGFyc2VQcm9wcy50cmFuc2Zvcm1Qcm9wc0F0dHJzVG9TdHlsZSkocHJvcHMsIFsnd2lkdGgnLCAnaGVpZ2h0J10pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDM0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG5cbiAgLyoqXG4gICAqIHBhcnNlIHczYyBhdHRycyB0byB3ZWV4IG1vZHVsZSBhdHRyc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjIGNvbXBvbmVudCBkYXRhXG4gICAqIEByZXR1cm4ge09iamVjdH0gd2VleCBjb21wb25lbnQgZGF0YVxuICAgKi9cbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudCkge1xuICAgIHZhciBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnICYmICFwcm9wcy52YWx1ZSkge1xuICAgICAgcHJvcHMudmFsdWUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudCkge1xuICAgIHZhciBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIGNvbXBvbmVudC50eXBlID0gJ3RleHQnO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgJiYgIXByb3BzLnZhbHVlKSB7XG4gICAgICBwcm9wcy52YWx1ZSA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgcHJvcHMuY2hpbGRyZW4gPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3R5cGVvZjIgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mMihTeW1ib2wuaXRlcmF0b3IpID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mMihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZjIob2JqKTtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1yZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIEJBU0VfRk9OVF9TSVpFID0gMjg7XG5cbnZhciBkZWZhdWx0UGFyYWdyYXBoU3R5bGUgPSB7XG4gIGZvbnRTaXplOiBCQVNFX0ZPTlRfU0laRSxcbiAgbWFyZ2luVG9wOiBCQVNFX0ZPTlRfU0laRSxcbiAgbWFyZ2luQm90dG9tOiBCQVNFX0ZPTlRfU0laRVxufTtcblxudmFyIFR5cG9ncmFwaHlFbGVtZW50cyA9IHtcbiAgdToge1xuICAgIHRleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJ1xuICB9LFxuICBzOiB7XG4gICAgdGV4dERlY29yYXRpb246ICdsaW5lLXRocm91Z2gnXG4gIH0sXG4gIGk6IHtcbiAgICBmb250U3R5bGU6ICdpdGFsaWMnXG4gIH0sXG4gIGI6IHtcbiAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAgfSxcbiAgZGVsOiB7XG4gICAgdGV4dERlY29yYXRpb246ICdsaW5lLXRocm91Z2gnXG4gIH0sXG4gIGVtOiB7XG4gICAgZm9udFN0eWxlOiAnaXRhbGljJ1xuICB9LFxuICBzdHJvbmc6IHtcbiAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAgfSxcbiAgYmlnOiB7XG4gICAgZm9udFNpemU6IEJBU0VfRk9OVF9TSVpFICogMS4yXG4gIH0sXG4gIHNtYWxsOiB7XG4gICAgZm9udFNpemU6IEJBU0VfRk9OVF9TSVpFICogMC44XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVN0cmluZyhzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc3BhbicsXG4gICAgYXR0cjoge1xuICAgICAgdmFsdWU6IHN0cmluZ1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtQ2hpbGQoY2hpbGQpIHtcbiAgdmFyIHR5cGUgPSBjaGlsZC50eXBlO1xuICB2YXIgcHJvcHMgPSBjaGlsZC5wcm9wcztcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gIHZhciBuZXN0ZWRDaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAvLyBBbGlhcyBpbWcgdGFnXG4gIGlmICh0eXBlID09PSAnaW1nJykge1xuICAgIHR5cGUgPSAnaW1hZ2UnO1xuICB9XG5cbiAgLy8gVHJhbnNmcm9tIHRvIHNwYW5cbiAgaWYgKFR5cG9ncmFwaHlFbGVtZW50c1t0eXBlXSkge1xuICAgIHN0eWxlID0gX2V4dGVuZHMoe30sIFR5cG9ncmFwaHlFbGVtZW50c1t0eXBlXSwgc3R5bGUpO1xuICAgIHR5cGUgPSAnc3Bhbic7XG4gIH1cblxuICBwcm9wcy5zdHlsZSA9IG51bGw7XG4gIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcblxuICB2YXIgZWxlbWVudCA9IHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBhdHRyOiBwcm9wcyB8fCB7fVxuICB9O1xuXG4gIGlmIChuZXN0ZWRDaGlsZHJlbikge1xuICAgIGlmICh0eXBlID09PSAnc3BhbicgJiYgdHlwZW9mIG5lc3RlZENoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgZWxlbWVudC5hdHRyLnZhbHVlID0gbmVzdGVkQ2hpbGRyZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuY2hpbGRyZW4gPSB0cmFuc2Zvcm1DaGlsZHJlbihuZXN0ZWRDaGlsZHJlbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybUNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBlbGVtZW50cyA9IFtdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKHRyYW5zZm9ybVN0cmluZyhjaGlsZCkpO1xuICAgIH0gZWxzZSBpZiAoKHR5cGVvZiBjaGlsZCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoY2hpbGQpKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2godHJhbnNmb3JtQ2hpbGQoY2hpbGQpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudCkge1xuICAgIHZhciBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgY29tcG9uZW50LnR5cGUgPSAncmljaHRleHQnO1xuXG4gICAgcHJvcHMuc3R5bGUgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdFBhcmFncmFwaFN0eWxlLCBwcm9wcy5zdHlsZSk7XG5cbiAgICBwcm9wcy52YWx1ZSA9IHRyYW5zZm9ybUNoaWxkcmVuKGNoaWxkcmVuKTs7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBudWxsO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDM3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1yZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiB3ZWV4IGJ1dHRvblxuICpcbiAqIHByb3BzOiBkaXNhYmxlZCwgc3R5bGVcbiAqL1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICBjb21wb25lbnQudHlwZSA9ICd0ZXh0JztcblxuICAgIHZhciBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgdmFyIHRleHRTdHlsZSA9IF9leHRlbmRzKHtcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICBmb250U2l6ZTogMjIsXG4gICAgICBwYWRkaW5nVG9wOiA0LFxuICAgICAgcGFkZGluZ1JpZ2h0OiAxMixcbiAgICAgIHBhZGRpbmdCb3R0b206IDYsXG4gICAgICBwYWRkaW5nTGVmdDogMTIsXG4gICAgICBib3JkZXJXaWR0aDogNCxcbiAgICAgIGJvcmRlclN0eWxlOiAnc29saWQnLFxuICAgICAgYm9yZGVyQ29sb3I6ICcjMDAwMDAwJyxcbiAgICAgIGJhY2tncm91ZENvbG9yOiAnI2MwYzBjMCdcbiAgICB9LCBzdHlsZSk7XG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHByb3BzLm9uQ2xpY2sgPSBudWxsO1xuICAgICAgdGV4dFN0eWxlID0gX2V4dGVuZHMoe30sIHRleHRTdHlsZSwge1xuICAgICAgICBjb2xvcjogJyM3ZjdmN2YnLFxuICAgICAgICBib3JkZXJDb2xvcjogJyM3ZjdmN2YnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgcHJvcHMudmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfXJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgQkFTRV9GT05UX1NJWkUgPSAyODtcblxuZnVuY3Rpb24gZ2VuZXJhdGVIZWFkaW5nU3R5bGUoYmFzZUZvbnRTaXplLCBmb250TXVsdGlwbGllciwgbWFyZ2luTXVsdGlwbGllcikge1xuICByZXR1cm4ge1xuICAgIGZvbnRTaXplOiBiYXNlRm9udFNpemUgKiBmb250TXVsdGlwbGllcixcbiAgICBtYXJnaW5Ub3A6IGJhc2VGb250U2l6ZSAqIGZvbnRNdWx0aXBsaWVyICogbWFyZ2luTXVsdGlwbGllcixcbiAgICBtYXJnaW5Cb3R0b206IGJhc2VGb250U2l6ZSAqIGZvbnRNdWx0aXBsaWVyICogbWFyZ2luTXVsdGlwbGllcixcbiAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAgfTtcbn1cblxudmFyIEhlYWRpbmdFbGVtZW50cyA9IHtcbiAgaDE6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAyLCAwLjY3KSxcbiAgaDI6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAxLjUsIDAuODMpLFxuICBoMzogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDEuMTcsIDEpLFxuICBoNDogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDEsIDEuMzMpLFxuICBoNTogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDAuODMsIDEuNjcpLFxuICBoNjogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDAuNjcsIDIuMzMpXG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgdHlwZSA9IGNvbXBvbmVudC50eXBlLFxuICAgICAgICBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIGNvbXBvbmVudC50eXBlID0gJ3RleHQnO1xuICAgIHByb3BzLnN0eWxlID0gX2V4dGVuZHMoe30sIEhlYWRpbmdFbGVtZW50c1t0eXBlXSB8fCBIZWFkaW5nRWxlbWVudHMuaDYsIHByb3BzLnN0eWxlKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnICYmICFwcm9wcy52YWx1ZSkge1xuICAgICAgcHJvcHMudmFsdWUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcblxuICAvKipcbiAgICogcGFyc2UgdzNjIGF0dHJzIHRvIHdlZXggbW9kdWxlIGF0dHJzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB3M2MgY29tcG9uZW50IGRhdGFcbiAgICogQHJldHVybiB7T2JqZWN0fSB3ZWV4IGNvbXBvbmVudCBkYXRhXG4gICAqL1xuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50LnR5cGUgPSAnZGl2JztcbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zdHlsZVVuaXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblxudmFyIF9mbGV4Ym94ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG5cbnZhciBfZmxleGJveDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mbGV4Ym94KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07XG59XG5cbi8qKlxuICogV2ViIEJyb3dzZXIgZHJpdmVyXG4gKiovXG5cbnZhciBGVUxMX1dJRFRIX1JFTSA9IDc1MDtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgQ0xBU1NfTkFNRSA9ICdjbGFzc05hbWUnO1xudmFyIENMQVNTID0gJ2NsYXNzJztcbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIEVWRU5UX1BSRUZJWF9SRUdFWFAgPSAvb25bQS1aXS87XG5cbnZhciBEcml2ZXIgPSB7XG4gIGdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZChpZCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIH0sXG4gIGNyZWF0ZUJvZHk6IGZ1bmN0aW9uIGNyZWF0ZUJvZHkoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gIH0sXG4gIGNyZWF0ZUNvbW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQoY29udGVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGNvbnRlbnQpO1xuICB9LFxuICBjcmVhdGVFbXB0eTogZnVuY3Rpb24gY3JlYXRlRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWVudCgnIGVtcHR5ICcpO1xuICB9LFxuICBjcmVhdGVUZXh0OiBmdW5jdGlvbiBjcmVhdGVUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG4gIH0sXG4gIHVwZGF0ZVRleHQ6IGZ1bmN0aW9uIHVwZGF0ZVRleHQobm9kZSwgdGV4dCkge1xuICAgIHZhciB0ZXh0Q29udGVudEF0dHIgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50ID8gJ3RleHRDb250ZW50JyA6ICdub2RlVmFsdWUnO1xuICAgIG5vZGVbdGV4dENvbnRlbnRBdHRyXSA9IHRleHQ7XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50KSB7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudC50eXBlKTtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICB0aGlzLnNldE5hdGl2ZVByb3BzKG5vZGUsIHByb3BzKTtcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgfSxcbiAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIHJlbW92ZUNoaWxkKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gTWF5YmUgaGFzIGJlZW4gcmVtb3ZlZCB3aGVuIHJlbW92ZSBjaGlsZFxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH0sXG4gIHJlcGxhY2VDaGlsZDogZnVuY3Rpb24gcmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IG9sZENoaWxkLnBhcmVudE5vZGU7XG4gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICB9LFxuICBpbnNlcnRBZnRlcjogZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIobm9kZSwgYWZ0ZXIsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBhZnRlci5wYXJlbnROb2RlO1xuICAgIHZhciBuZXh0U2libGluZyA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG4gIH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IGJlZm9yZS5wYXJlbnROb2RlO1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgYmVmb3JlKTtcbiAgfSxcbiAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcikge1xuICAgIHJldHVybiBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICB9LFxuICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKSB7XG4gICAgcmV0dXJuIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gIH0sXG4gIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxFdmVudExpc3RlbmVycyhub2RlKSB7XG4gICAgLy8gbm9vcFxuICB9LFxuICByZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZShub2RlLCBwcm9wS2V5KSB7XG4gICAgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICByZXR1cm4gbm9kZS5pbm5lckhUTUwgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBDTEFTU19OQU1FKSB7XG4gICAgICBwcm9wS2V5ID0gQ0xBU1M7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgaW4gbm9kZSkge1xuICAgICAgbm9kZVtwcm9wS2V5XSA9IG51bGw7XG4gICAgfVxuXG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUocHJvcEtleSk7XG4gIH0sXG4gIHNldEF0dHJpYnV0ZTogZnVuY3Rpb24gc2V0QXR0cmlidXRlKG5vZGUsIHByb3BLZXksIHByb3BWYWx1ZSkge1xuICAgIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgcmV0dXJuIG5vZGUuaW5uZXJIVE1MID0gcHJvcFZhbHVlLl9faHRtbDtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0xBU1NfTkFNRSkge1xuICAgICAgcHJvcEtleSA9IENMQVNTO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5IGluIG5vZGUpIHtcbiAgICAgIG5vZGVbcHJvcEtleV0gPSBwcm9wVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgfVxuICB9LFxuICBzZXRTdHlsZXM6IGZ1bmN0aW9uIHNldFN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgICB2YXIgdHJhbmZvcm1lZFN0eWxlcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICAgIHZhciB2YWwgPSBzdHlsZXNbcHJvcF07XG4gICAgICBpZiAoX2ZsZXhib3gyLmRlZmF1bHQuaXNGbGV4UHJvcChwcm9wKSkge1xuICAgICAgICBfZmxleGJveDIuZGVmYXVsdFtwcm9wXSh2YWwsIHRyYW5mb3JtZWRTdHlsZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbmZvcm1lZFN0eWxlc1twcm9wXSA9ICgwLCBfc3R5bGVVbml0LmNvbnZlcnRVbml0KSh2YWwsIHByb3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9wcm9wIGluIHRyYW5mb3JtZWRTdHlsZXMpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm1WYWx1ZSA9IHRyYW5mb3JtZWRTdHlsZXNbX3Byb3BdO1xuICAgICAgLy8gaGFjayBoYW5kbGUgY29tcGF0aWJpbGl0eSBpc3N1ZVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNmb3JtVmFsdWUpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlLnN0eWxlW19wcm9wXSA9IHRyYW5zZm9ybVZhbHVlW2ldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnN0eWxlW19wcm9wXSA9IHRyYW5zZm9ybVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiBiZWZvcmVSZW5kZXIoKSB7XG4gICAgLy8gSW5pdCByZW0gdW5pdFxuICAgICgwLCBfc3R5bGVVbml0LnNldFJlbSkodGhpcy5nZXRXaW5kb3dXaWR0aCgpIC8gRlVMTF9XSURUSF9SRU0pO1xuICB9LFxuICBnZXRXaW5kb3dXaWR0aDogZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfSxcbiAgc2V0TmF0aXZlUHJvcHM6IGZ1bmN0aW9uIHNldE5hdGl2ZVByb3BzKG5vZGUsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBwcm9wcykge1xuICAgICAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcF07XG4gICAgICBpZiAocHJvcCA9PT0gQ0hJTERSRU4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChwcm9wID09PSBTVFlMRSkge1xuICAgICAgICAgIHRoaXMuc2V0U3R5bGVzKG5vZGUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChFVkVOVF9QUkVGSVhfUkVHRVhQLnRlc3QocHJvcCkpIHtcbiAgICAgICAgICB2YXIgZXZlbnROYW1lID0gcHJvcC5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IERyaXZlcjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDQxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG52YXIgQk9YX0FMSUdOID0ge1xuICBzdHJldGNoOiAnc3RyZXRjaCcsXG4gICdmbGV4LXN0YXJ0JzogJ3N0YXJ0JyxcbiAgJ2ZsZXgtZW5kJzogJ2VuZCcsXG4gIGNlbnRlcjogJ2NlbnRlcidcbn07XG5cbnZhciBCT1hfT1JJRU5UID0ge1xuICByb3c6ICdob3Jpem9udGFsJyxcbiAgY29sdW1uOiAndmVydGljYWwnXG59O1xuXG52YXIgQk9YX1BBQ0sgPSB7XG4gICdmbGV4LXN0YXJ0JzogJ3N0YXJ0JyxcbiAgJ2ZsZXgtZW5kJzogJ2VuZCcsXG4gIGNlbnRlcjogJ2NlbnRlcicsXG4gICdzcGFjZS1iZXR3ZWVuJzogJ2p1c3RpZnknLFxuICAnc3BhY2UtYXJvdW5kJzogJ2p1c3RpZnknIC8vIEp1c3Qgc2FtZSBhcyBgc3BhY2UtYmV0d2VlbmBcbn07XG5cbnZhciBGTEVYX1BST1BTID0ge1xuICBkaXNwbGF5OiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBhbGlnbkl0ZW1zOiB0cnVlLFxuICBhbGlnblNlbGY6IHRydWUsXG4gIGZsZXhEaXJlY3Rpb246IHRydWUsXG4gIGp1c3RpZnlDb250ZW50OiB0cnVlLFxuICBmbGV4V3JhcDogdHJ1ZVxufTtcblxudmFyIEZsZXhib3ggPSB7XG4gIGlzRmxleFByb3A6IGZ1bmN0aW9uIGlzRmxleFByb3AocHJvcCkge1xuICAgIHJldHVybiBGTEVYX1BST1BTW3Byb3BdO1xuICB9LFxuICBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJ2ZsZXgnKSB7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gWyctd2Via2l0LWJveCcsICctd2Via2l0LWZsZXgnLCAnZmxleCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBmbGV4OiBmdW5jdGlvbiBmbGV4KHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLndlYmtpdEJveEZsZXggPSB2YWx1ZTtcbiAgICBzdHlsZS53ZWJraXRGbGV4ID0gdmFsdWU7XG4gICAgc3R5bGUuZmxleCA9IHZhbHVlO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcbiAgZmxleFdyYXA6IGZ1bmN0aW9uIGZsZXhXcmFwKHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLmZsZXhXcmFwID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBhbGlnbkl0ZW1zOiBmdW5jdGlvbiBhbGlnbkl0ZW1zKHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLndlYmtpdEJveEFsaWduID0gQk9YX0FMSUdOW3ZhbHVlXTtcbiAgICBzdHlsZS53ZWJraXRBbGlnbkl0ZW1zID0gdmFsdWU7XG4gICAgc3R5bGUuYWxpZ25JdGVtcyA9IHZhbHVlO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcbiAgYWxpZ25TZWxmOiBmdW5jdGlvbiBhbGlnblNlbGYodmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUud2Via2l0QWxpZ25TZWxmID0gdmFsdWU7XG4gICAgc3R5bGUuYWxpZ25TZWxmID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBmbGV4RGlyZWN0aW9uOiBmdW5jdGlvbiBmbGV4RGlyZWN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLndlYmtpdEJveE9yaWVudCA9IEJPWF9PUklFTlRbdmFsdWVdO1xuICAgIHN0eWxlLndlYmtpdEZsZXhEaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICBzdHlsZS5mbGV4RGlyZWN0aW9uID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBqdXN0aWZ5Q29udGVudDogZnVuY3Rpb24ganVzdGlmeUNvbnRlbnQodmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUud2Via2l0Qm94UGFjayA9IEJPWF9QQUNLW3ZhbHVlXTtcbiAgICBzdHlsZS53ZWJraXRKdXN0aWZ5Q29udGVudCA9IHZhbHVlO1xuICAgIHN0eWxlLmp1c3RpZnlDb250ZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBGbGV4Ym94O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBmaW5kQ29tcG9uZW50SW5zdGFuY2Uobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIF9pbnN0YW5jZTIuZGVmYXVsdC5nZXQobm9kZSk7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZpbmRDb21wb25lbnRJbnN0YW5jZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDQzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBzZXROYXRpdmVQcm9wcztcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX2ZpbmRET01Ob2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7XG5cbnZhciBfZmluZERPTU5vZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmluZERPTU5vZGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBzZXROYXRpdmVQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlID0gKDAsIF9maW5kRE9NTm9kZTIuZGVmYXVsdCkobm9kZSk7XG4gIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5zZXROYXRpdmVQcm9wcyhub2RlLCBwcm9wcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiA0NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gJzAuNC43Jztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSl9Oztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJheC5mYWN0b3J5Lm1hcFxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3J1bnRpbWUtc2hhcmVkL2Rpc3Qvc2hhcmVkLmZ1bmN0aW9uLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMik7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIsIG5ldy1jYXA6IFwib2ZmXCIgKi9cblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgICBTeW1ib2xQb2x5ZmlsbCxcbiAgICBIaWRkZW5TeW1ib2wsXG4gICAgZ2xvYmFsU3ltYm9scyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKHgpIHtcbiAgaWYgKCF4KSByZXR1cm4gZmFsc2U7XG4gIGlmICgodHlwZW9mIHggPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHgpKSA9PT0gJ3N5bWJvbCcpIHJldHVybiB0cnVlO1xuICBpZiAoIXguY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSAhPT0gJ1N5bWJvbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHhbeC5jb25zdHJ1Y3Rvci50b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xuICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIGdlbmVyYXRlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNyZWF0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gZnVuY3Rpb24gKGRlc2MpIHtcbiAgICB2YXIgcG9zdGZpeCA9IDAsXG4gICAgICAgIG5hbWU7XG4gICAgd2hpbGUgKGNyZWF0ZWRbZGVzYyArIChwb3N0Zml4IHx8ICcnKV0pIHtcbiAgICAgICsrcG9zdGZpeDtcbiAgICB9ZGVzYyArPSBwb3N0Zml4IHx8ICcnO1xuICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuICAgIG5hbWUgPSAnQEAnICsgZGVzYztcbiAgICByZXR1cm4gbmFtZTtcbiAgfTtcbn0oKTtcblxuLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgKG5vdCBvbmUgZXhwb3NlZCkgZm9yIGNyZWF0aW5nIFN5bWJvbCBpbnN0YW5jZXMuXG4vLyBUaGlzIG9uZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGBzb21lU3ltYm9sIGluc3RhbmNlb2YgU3ltYm9sYCBhbHdheXMgcmV0dXJuIGZhbHNlXG5IaWRkZW5TeW1ib2wgPSBmdW5jdGlvbiBfU3ltYm9sKGRlc2NyaXB0aW9uKSB7XG4gIGlmICh0aGlzIGluc3RhbmNlb2YgSGlkZGVuU3ltYm9sKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgcmV0dXJuIFN5bWJvbFBvbHlmaWxsKGRlc2NyaXB0aW9uKTtcbn07XG5cbi8vIEV4cG9zZWQgYFN5bWJvbGAgY29uc3RydWN0b3Jcbi8vIChyZXR1cm5zIGluc3RhbmNlcyBvZiBIaWRkZW5TeW1ib2wpXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbFBvbHlmaWxsID0gZnVuY3Rpb24gX1N5bWJvbDIoZGVzY3JpcHRpb24pIHtcbiAgdmFyIHN5bWJvbDtcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBfU3ltYm9sMikgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gIHN5bWJvbCA9IE9iamVjdC5jcmVhdGUoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSk7XG4gIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltYm9sLCB7XG4gICAgX19kZXNjcmlwdGlvbl9fOiB7IHZhbHVlOiBkZXNjcmlwdGlvbiB9LFxuICAgIF9fbmFtZV9fOiB7IHZhbHVlOiBnZW5lcmF0ZU5hbWUoZGVzY3JpcHRpb24pIH1cbiAgfSk7XG59O1xuZGVmaW5lUHJvcGVydGllcyhTeW1ib2xQb2x5ZmlsbCwge1xuICBmb3I6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKGtleSkge1xuICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSkgcmV0dXJuIGdsb2JhbFN5bWJvbHNba2V5XTtcbiAgICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2xQb2x5ZmlsbChTdHJpbmcoa2V5KSk7XG4gICAgfSB9LFxuICBrZXlGb3I6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHMpIHtcbiAgICAgIHZhciBrZXk7XG4gICAgICB2YWxpZGF0ZVN5bWJvbChzKTtcbiAgICAgIGZvciAoa2V5IGluIGdsb2JhbFN5bWJvbHMpIHtcbiAgICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSA9PT0gcykgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9IH0sXG5cbiAgLy8gVG8gZW5zdXJlIHByb3BlciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbmF0aXZlIGZ1bmN0aW9ucyAoZS5nLiBBcnJheS5mcm9tKVxuICAvLyBmYWxsYmFjayB0byBldmVudHVhbCBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2l2ZW4gc3ltYm9sXG4gIGhhc0luc3RhbmNlOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgnaGFzSW5zdGFuY2UnKSB9LFxuICBpc0NvbmNhdFNwcmVhZGFibGU6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdpc0NvbmNhdFNwcmVhZGFibGUnKSB9LFxuICBpdGVyYXRvcjogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ2l0ZXJhdG9yJykgfSxcbiAgbWF0Y2g6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdtYXRjaCcpIH0sXG4gIHJlcGxhY2U6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdyZXBsYWNlJykgfSxcbiAgc2VhcmNoOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgnc2VhcmNoJykgfSxcbiAgc3BlY2llczogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3NwZWNpZXMnKSB9LFxuICBzcGxpdDogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3NwbGl0JykgfSxcbiAgdG9QcmltaXRpdmU6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCd0b1ByaW1pdGl2ZScpIH0sXG4gIHRvU3RyaW5nVGFnOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgndG9TdHJpbmdUYWcnKSB9LFxuICB1bnNjb3BhYmxlczogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3Vuc2NvcGFibGVzJykgfVxufSk7XG5cbi8vIEludGVybmFsIHR3ZWFrcyBmb3IgcmVhbCBzeW1ib2wgcHJvZHVjZXJcbmRlZmluZVByb3BlcnRpZXMoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwgfSxcbiAgdG9TdHJpbmc6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19uYW1lX187XG4gICAgfSB9XG59KTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgZXhwb3NlZCBvbiBTeW1ib2wucHJvdG90eXBlXG4vLyBUaGV5IHdvbid0IGJlIGFjY2Vzc2libGUgb24gcHJvZHVjZWQgc3ltYm9sIGluc3RhbmNlcyBhcyB0aGV5IGRlcml2ZSBmcm9tIEhpZGRlblN5bWJvbC5wcm90b3R5cGVcbmRlZmluZVByb3BlcnRpZXMoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCB7XG4gIHRvU3RyaW5nOiB7IHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiAnU3ltYm9sICgnICsgdmFsaWRhdGVTeW1ib2wodGhpcykuX19kZXNjcmlwdGlvbl9fICsgJyknO1xuICAgIH0gfSxcbiAgdmFsdWVPZjogeyB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG4gICAgfSB9XG59KTtcblxuZGVmaW5lUHJvcGVydHkoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSwge1xuICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgdmFyIHN5bWJvbCA9IHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuICAgIGlmICgodHlwZW9mIHN5bWJvbCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yoc3ltYm9sKSkgPT09ICdzeW1ib2wnKSByZXR1cm4gc3ltYm9sO1xuICAgIHJldHVybiBzeW1ib2wudG9TdHJpbmcoKTtcbiAgfVxufSk7XG5kZWZpbmVQcm9wZXJ0eShTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnU3ltYm9sJyB9KTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0b24gb2YgdG9QcmltaXRpdmUgYW5kIHRvU3RyaW5nVGFnIGZvciByZXR1cm5lZCBzeW1ib2wgaW5zdGFuY2VzXG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnXSB9KTtcblxuLy8gTm90ZTogSXQncyBpbXBvcnRhbnQgdG8gZGVmaW5lIGB0b1ByaW1pdGl2ZWAgYXMgbGFzdCBvbmUsIGFzIHNvbWUgaW1wbGVtZW50YXRpb25zXG4vLyBpbXBsZW1lbnQgYHRvUHJpbWl0aXZlYCBuYXRpdmVseSB3aXRob3V0IGltcGxlbWVudGluZyBgdG9TdHJpbmdUYWdgIChvciBvdGhlciBzcGVjaWZpZWQgc3ltYm9scylcbi8vIEFuZCB0aGF0IG1heSBpbnZva2UgZXJyb3IgaW4gZGVmaW5pdGlvbiBmbG93OlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWVkaWtvby9lczYtc3ltYm9sL2lzc3Vlcy8xMyNpc3N1ZWNvbW1lbnQtMTY0MTQ2MTQ5XG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSwgeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlXSB9KTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL3VybC1zZWFyY2gtcGFyYW1zXG5cblxudmFyIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgZmluZCA9IC9bISdcXChcXCl+XXwlMjB8JTAwL2c7XG52YXIgcGx1cyA9IC9cXCsvZztcbnZhciByZXBsYWNlID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKycsXG4gICclMDAnOiAnXFx4MDAnXG59O1xudmFyIHJlcGxhY2VyID0gZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgcmV0dXJuIHJlcGxhY2VbbWF0Y2hdO1xufTtcbnZhciBzZWNyZXQgPSAnX19VUkxTZWFyY2hQYXJhbXNfXyc7XG5cbmZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoZmluZCwgcmVwbGFjZXIpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGUoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyLnJlcGxhY2UocGx1cywgJyAnKSk7XG59XG5cbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVSTFNlYXJjaFBhcmFtcyhxdWVyeSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVUkxTZWFyY2hQYXJhbXMpO1xuXG4gICAgdGhpc1tzZWNyZXRdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm47XG4gICAgaWYgKHF1ZXJ5LmNoYXJBdCgwKSA9PT0gJz8nKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LnNsaWNlKDEpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpbmRleCwgdmFsdWUsIHBhaXJzID0gKHF1ZXJ5IHx8ICcnKS5zcGxpdCgnJicpLCBpID0gMCwgbGVuZ3RoID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gcGFpcnNbaV07XG4gICAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoJz0nKTtcbiAgICAgIGlmICgtMSA8IGluZGV4KSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGRlY29kZSh2YWx1ZS5zbGljZSgwLCBpbmRleCkpLCBkZWNvZGUodmFsdWUuc2xpY2UoaW5kZXggKyAxKSkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoZGVjb2RlKHZhbHVlKSwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhVUkxTZWFyY2hQYXJhbXMsIFt7XG4gICAga2V5OiAnYXBwZW5kJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XTtcbiAgICAgIGlmIChuYW1lIGluIGRpY3QpIHtcbiAgICAgICAgZGljdFtuYW1lXS5wdXNoKCcnICsgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdFtuYW1lXSA9IFsnJyArIHZhbHVlXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZWxldGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKG5hbWUpIHtcbiAgICAgIGRlbGV0ZSB0aGlzW3NlY3JldF1bbmFtZV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KG5hbWUpIHtcbiAgICAgIHZhciBkaWN0ID0gdGhpc1tzZWNyZXRdO1xuICAgICAgcmV0dXJuIG5hbWUgaW4gZGljdCA/IGRpY3RbbmFtZV1bMF0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldEFsbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsbChuYW1lKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XTtcbiAgICAgIHJldHVybiBuYW1lIGluIGRpY3QgPyBkaWN0W25hbWVdLnNsaWNlKDApIDogW107XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lIGluIHRoaXNbc2VjcmV0XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICAgIHRoaXNbc2VjcmV0XVtuYW1lXSA9IFsnJyArIHZhbHVlXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdmb3JFYWNoJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIGRpY3QgPSB0aGlzW3NlY3JldF07XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkaWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGRpY3RbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCBuYW1lLCB0aGlzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdrZXlzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHZhciBpdGVtcyA9IFtdO1xuICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpdGVtcy5wdXNoKG5hbWUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKTtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaXRlcmF0b3JbX3N5bWJvbDIuZGVmYXVsdC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd2YWx1ZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpdGVyYXRvcltfc3ltYm9sMi5kZWZhdWx0Lml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VudHJpZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpdGVyYXRvcltfc3ltYm9sMi5kZWZhdWx0Lml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RvU3RyaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XSxcbiAgICAgICAgICBxdWVyeSA9IFtdLFxuICAgICAgICAgIGksXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWU7XG4gICAgICBmb3IgKGtleSBpbiBkaWN0KSB7XG4gICAgICAgIG5hbWUgPSBlbmNvZGUoa2V5KTtcbiAgICAgICAgZm9yIChpID0gMCwgdmFsdWUgPSBkaWN0W2tleV07IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHF1ZXJ5LnB1c2gobmFtZSArICc9JyArIGVuY29kZSh2YWx1ZVtpXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVlcnkuam9pbignJicpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBVUkxTZWFyY2hQYXJhbXM7XG59KCk7XG5cblVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbX3N5bWJvbDIuZGVmYXVsdC5pdGVyYXRvcl0gPSBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmVudHJpZXM7XG5cbm1vZHVsZS5leHBvcnRzID0gVVJMU2VhcmNoUGFyYW1zO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldCBQcm9taXNlKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuICB9LFxuICBnZXQgU3ltYm9sKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuICB9LFxuICBnZXQgTWFwKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuICB9LFxuICBnZXQgU2V0KCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuICB9LFxuICBnZXQgV2Vha01hcCgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbiAgfSxcbiAgZ2V0IFdlYWtTZXQoKSB7XG4gICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oNyk7XG4gIH0sXG4gIGdldCBGb250RmFjZSgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbiAgfSxcbiAgZ2V0IFVSTCgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcbiAgfSxcbiAgZ2V0IFVSTFNlYXJjaFBhcmFtcygpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbiAgfSxcbiAgZ2V0IG1hdGNoTWVkaWEoKSB7XG4gICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuICB9XG59O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4vKiBlc2xpbnQgbm8tZXh0ZW5kLW5hdGl2ZTogXCJvZmZcIiAqL1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLy8gVXNlIHBvbHlmaWxsIGZvciBzZXRJbW1lZGlhdGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zXG52YXIgYXNhcCA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicgJiYgc2V0SW1tZWRpYXRlIHx8IGZ1bmN0aW9uIChmbikge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgfSBlbHNlIHtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgb25VbmhhbmRsZWRSZWplY3Rpb24gPSBmdW5jdGlvbiBvblVuaGFuZGxlZFJlamVjdGlvbihlcnIpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlKSB7XG4gICAgY29uc29sZS5sb2coJ1Bvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjonLCBlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgfVxufTtcblxuLy8gUG9seWZpbGwgZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG5mdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvbWlzZShmbikge1xuICBpZiAoX3R5cGVvZih0aGlzKSAhPT0gJ29iamVjdCcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIHJlc29sdmVyIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIHRoaXMuX3N0YXRlID0gMDtcbiAgdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fZGVmZXJyZWRzID0gW107XG5cbiAgZG9SZXNvbHZlKGZuLCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlKHNlbGYsIGRlZmVycmVkKSB7XG4gIHdoaWxlIChzZWxmLl9zdGF0ZSA9PT0gMykge1xuICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgfVxuICBpZiAoc2VsZi5fc3RhdGUgPT09IDApIHtcbiAgICBzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuX2hhbmRsZWQgPSB0cnVlO1xuICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgIChzZWxmLl9zdGF0ZSA9PT0gMSA/IHJlc29sdmUgOiByZWplY3QpKGRlZmVycmVkLnByb21pc2UsIHNlbGYuX3ZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJldDtcbiAgICB0cnkge1xuICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLCByZXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICB0cnkge1xuICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy1zcGVjI3RoZS1wcm9taXNlLXJlc29sdXRpb24tcHJvY2VkdXJlXG4gICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLicpO1xuICAgIGlmIChuZXdWYWx1ZSAmJiAoKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV3VmFsdWUpKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBzZWxmLl9zdGF0ZSA9IDM7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYuX3N0YXRlID0gMTtcbiAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGZpbmFsZShzZWxmKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlamVjdChzZWxmLCBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgc2VsZi5fc3RhdGUgPSAyO1xuICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICBmaW5hbGUoc2VsZik7XG59XG5cbmZ1bmN0aW9uIGZpbmFsZShzZWxmKSB7XG4gIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNlbGYuX2hhbmRsZWQpIHtcbiAgICAgICAgb25VbmhhbmRsZWRSZWplY3Rpb24oc2VsZi5fdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYuX2RlZmVycmVkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGhhbmRsZShzZWxmLCBzZWxmLl9kZWZlcnJlZHNbaV0pO1xuICB9XG4gIHNlbGYuX2RlZmVycmVkcyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxuICogb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgYXJlIG9ubHkgY2FsbGVkIG9uY2UuXG4gKlxuICogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxuICovXG5mdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBmbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHJlc29sdmUoc2VsZiwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHJlamVjdChzZWxmLCByZWFzb24pO1xuICAgIH0pO1xuICB9IGNhdGNoIChleCkge1xuICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgZG9uZSA9IHRydWU7XG4gICAgcmVqZWN0KHNlbGYsIGV4KTtcbiAgfVxufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIHZhciBwcm9tID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7XG5cbiAgaGFuZGxlKHRoaXMsIG5ldyBIYW5kbGVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9tKSk7XG4gIHJldHVybiBwcm9tO1xufTtcblxuUHJvbWlzZS5hbGwgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJlc29sdmUoW10pO1xuICAgIHZhciByZW1haW5pbmcgPSBhcmdzLmxlbmd0aDtcblxuICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWwgJiYgKCh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB2YXIgdGhlbiA9IHZhbC50aGVuO1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHZhbCwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICByZXMoaSwgdmFsKTtcbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFyZ3NbaV0gPSB2YWw7XG4gICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIHJlamVjdChleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgfVxuICB9KTtcbn07XG5cblByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodmFsdWUpKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IFByb21pc2UpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSk7XG59O1xuXG5Qcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlamVjdCh2YWx1ZSk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhbHVlc1tpXS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBpbW1lZGlhdGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBjYWxsYmFja3NcbiAqIEBwYXJhbSBmbiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEBwcml2YXRlXG4gKi9cblByb21pc2UuX3NldEltbWVkaWF0ZUZuID0gZnVuY3Rpb24gX3NldEltbWVkaWF0ZUZuKGZuKSB7XG4gIGFzYXAgPSBmbjtcbn07XG5cblByb21pc2UuX3NldFVuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gX3NldFVuaGFuZGxlZFJlamVjdGlvbkZuKGZuKSB7XG4gIG9uVW5oYW5kbGVkUmVqZWN0aW9uID0gZm47XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfc3ltYm9sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIERlbGV0ZWQgbWFwIGl0ZW1zIG1lc3Mgd2l0aCBpdGVyYXRvciBwb2ludGVycywgc28gcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbSBtYXJrIHRoZW0gYXMgZGVsZXRlZC4gQ2FuJ3QgdXNlIHVuZGVmaW5lZCBvciBudWxsIHNpbmNlIHRob3NlIGJvdGggdmFsaWQga2V5cyBzbyB1c2UgYSBwcml2YXRlIHN5bWJvbC5cbnZhciB1bmRlZk1hcmtlciA9ICgwLCBfc3ltYm9sMi5kZWZhdWx0KSgndW5kZWYnKTtcbi8vIE5hTiBjYW5ub3QgYmUgZm91bmQgaW4gYW4gYXJyYXkgdXNpbmcgaW5kZXhPZiwgc28gd2UgZW5jb2RlIE5hTnMgdXNpbmcgYSBwcml2YXRlIHN5bWJvbC5cbi8qIGVzbGludCBuby1leHRlbmQtbmF0aXZlOiBcIm9mZlwiICovXG52YXIgTmFOTWFya2VyID0gKDAsIF9zeW1ib2wyLmRlZmF1bHQpKCdOYU4nKTtcbnZhciBBQ0NFU1NPUl9TVVBQT1JUID0gdHJ1ZTtcblxuZnVuY3Rpb24gZW5jb2RlS2V5KGtleSkge1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGtleSkgPyBOYU5NYXJrZXIgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUtleShlbmNvZGVkS2V5KSB7XG4gIHJldHVybiBlbmNvZGVkS2V5ID09PSBOYU5NYXJrZXIgPyBOYU4gOiBlbmNvZGVkS2V5O1xufVxuXG5mdW5jdGlvbiBtYWtlSXRlcmF0b3IobWFwSW5zdCwgZ2V0dGVyKSB7XG4gIHZhciBuZXh0SWR4ID0gMDtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKG5leHRJZHggPT09IG1hcEluc3QuX2tleXMubGVuZ3RoKSBkb25lID0gdHJ1ZTtcbiAgICAgIGlmICghZG9uZSkge1xuICAgICAgICB3aGlsZSAobWFwSW5zdC5fa2V5c1tuZXh0SWR4XSA9PT0gdW5kZWZNYXJrZXIpIHtcbiAgICAgICAgICBuZXh0SWR4Kys7XG4gICAgICAgIH1yZXR1cm4geyB2YWx1ZTogZ2V0dGVyLmNhbGwobWFwSW5zdCwgbmV4dElkeCsrKSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNTaXplKG1hcEluc3QpIHtcbiAgdmFyIHNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgcyA9IG1hcEluc3QuX2tleXMubGVuZ3RoOyBpIDwgczsgaSsrKSB7XG4gICAgaWYgKG1hcEluc3QuX2tleXNbaV0gIT09IHVuZGVmTWFya2VyKSBzaXplKys7XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbmZ1bmN0aW9uIGhhc1Byb3RvTWV0aG9kKGluc3RhbmNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIHR5cGVvZiBpbnN0YW5jZVttZXRob2RdID09PSAnZnVuY3Rpb24nO1xufVxuXG52YXIgTWFwID0gZnVuY3Rpb24gTWFwKGRhdGEpIHtcbiAgdGhpcy5fa2V5cyA9IFtdO1xuICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgLy8gSWYgYGRhdGFgIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgbWFwXG4gIGlmIChkYXRhICYmIGhhc1Byb3RvTWV0aG9kKGRhdGEsICdmb3JFYWNoJykpIHtcbiAgICAvLyBGYXN0cGF0aDogSWYgYGRhdGFgIGlzIGEgTWFwLCBzaG9ydGNpcmN1aXQgYWxsIGZvbGxvd2luZyB0aGUgY2hlY2tzXG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICAvLyBJZiBgZGF0YWAgaXMgbm90IGFuIGluc3RhbmNlIG9mIE1hcCwgaXQgY291bGQgYmUgYmVjYXVzZSB5b3UgaGF2ZSBhIE1hcCBmcm9tIGFuIGlmcmFtZSBvciBhIHdvcmtlciBvciBzb21ldGhpbmcuXG4gICAgLy8gQ2hlY2sgaWYgIGBkYXRhYCBoYXMgYWxsIHRoZSBgTWFwYCBtZXRob2RzIGFuZCBpZiBzbywgYXNzdW1lIGRhdGEgaXMgYW5vdGhlciBNYXBcbiAgICBoYXNQcm90b01ldGhvZChkYXRhLCAnY2xlYXInKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnZGVsZXRlJykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ2VudHJpZXMnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnZm9yRWFjaCcpICYmIGhhc1Byb3RvTWV0aG9kKGRhdGEsICdnZXQnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnaGFzJykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ2tleXMnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnc2V0JykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ3ZhbHVlcycpKSB7XG4gICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdGhpcy5zZXQuYXBwbHkodGhpcywgW2tleSwgdmFsdWVdKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdGhpcy5zZXQuYXBwbHkodGhpcywgaXRlbSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xufTtcbk1hcC5wcm90b3R5cGUgPSB7fTtcblxuLy8gU29tZSBvbGQgZW5naW5lcyBkbyBub3Qgc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzLiAgU2luY2UgTWFwIG9ubHkgcmVxdWlyZXMgdGhlc2UgZm9yIHRoZSBzaXplIHByb3BlcnR5LCB3ZSBjYW4gZmFsbCBiYWNrIHRvIHNldHRpbmcgdGhlIHNpemUgcHJvcGVydHkgc3RhdGljYWxseSBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIG1hcCBjaGFuZ2VzLlxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsICdzaXplJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhbGNTaXplKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59IGNhdGNoIChlKSB7XG4gIEFDQ0VTU09SX1NVUFBPUlQgPSBmYWxzZTtcbn1cblxuTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBpZHggPSB0aGlzLl9rZXlzLmluZGV4T2YoZW5jb2RlS2V5KGtleSkpO1xuICByZXR1cm4gaWR4ICE9PSAtMSA/IHRoaXMuX3ZhbHVlc1tpZHhdIDogdW5kZWZpbmVkO1xufTtcbk1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIGlkeCA9IHRoaXMuX2tleXMuaW5kZXhPZihlbmNvZGVLZXkoa2V5KSk7XG4gIGlmIChpZHggIT09IC0xKSB7XG4gICAgdGhpcy5fdmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9rZXlzLnB1c2goZW5jb2RlS2V5KGtleSkpO1xuICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbk1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gdGhpcy5fa2V5cy5pbmRleE9mKGVuY29kZUtleShrZXkpKSAhPT0gLTE7XG59O1xuTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBpZHggPSB0aGlzLl9rZXlzLmluZGV4T2YoZW5jb2RlS2V5KGtleSkpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICB0aGlzLl9rZXlzW2lkeF0gPSB1bmRlZk1hcmtlcjtcbiAgdGhpcy5fdmFsdWVzW2lkeF0gPSB1bmRlZk1hcmtlcjtcbiAgaWYgKCFBQ0NFU1NPUl9TVVBQT1JUKSB0aGlzLnNpemUgPSBjYWxjU2l6ZSh0aGlzKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fa2V5cyA9IHRoaXMuX3ZhbHVlcyA9IFtdO1xuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IDA7XG59O1xuTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2ldO1xuICB9KTtcbn07XG5NYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gZGVjb2RlS2V5KHRoaXMuX2tleXNbaV0pO1xuICB9KTtcbn07XG5NYXAucHJvdG90eXBlLmVudHJpZXMgPSBNYXAucHJvdG90eXBlW19zeW1ib2wyLmRlZmF1bHQuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIFtkZWNvZGVLZXkodGhpcy5fa2V5c1tpXSksIHRoaXMuX3ZhbHVlc1tpXV07XG4gIH0pO1xufTtcbk1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFja0ZuLCB0aGlzQXJnKSB7XG4gIHRoaXNBcmcgPSB0aGlzQXJnIHx8IGdsb2JhbDtcbiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5lbnRyaWVzKCk7XG4gIHZhciByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIHdoaWxlIChyZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBjYWxsYmFja0ZuLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlWzFdLCByZXN1bHQudmFsdWVbMF0sIHRoaXMpO1xuICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgfVxufTtcblxuTWFwLnByb3RvdHlwZVtfc3ltYm9sMi5kZWZhdWx0LnNwZWNpZXNdID0gTWFwO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLCAnY29uc3RydWN0b3InLCB7XG4gIHZhbHVlOiBNYXBcbn0pO1xuXG50cnkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAwXG4gIH0pO1xufSBjYXRjaCAoZSkge31cblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfc3ltYm9sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIERlbGV0ZWQgbWFwIGl0ZW1zIG1lc3Mgd2l0aCBpdGVyYXRvciBwb2ludGVycywgc28gcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbSBtYXJrIHRoZW0gYXMgZGVsZXRlZC4gQ2FuJ3QgdXNlIHVuZGVmaW5lZCBvciBudWxsIHNpbmNlIHRob3NlIGJvdGggdmFsaWQga2V5cyBzbyB1c2UgYSBwcml2YXRlIHN5bWJvbC5cbnZhciB1bmRlZk1hcmtlciA9ICgwLCBfc3ltYm9sMi5kZWZhdWx0KSgndW5kZWYnKTtcblxuLy8gTmFOIGNhbm5vdCBiZSBmb3VuZCBpbiBhbiBhcnJheSB1c2luZyBpbmRleE9mLCBzbyB3ZSBlbmNvZGUgTmFOcyB1c2luZyBhIHByaXZhdGUgc3ltYm9sLlxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIgKi9cbnZhciBOYU5NYXJrZXIgPSAoMCwgX3N5bWJvbDIuZGVmYXVsdCkoJ05hTicpO1xuXG52YXIgQUNDRVNTT1JfU1VQUE9SVCA9IHRydWU7XG5cbmZ1bmN0aW9uIGVuY29kZVZhbChkYXRhKSB7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0YSkgPyBOYU5NYXJrZXIgOiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVWYWwoZW5jb2RlZERhdGEpIHtcbiAgcmV0dXJuIGVuY29kZWREYXRhID09PSBOYU5NYXJrZXIgPyBOYU4gOiBlbmNvZGVkRGF0YTtcbn1cblxuZnVuY3Rpb24gbWFrZUl0ZXJhdG9yKHNldEluc3QsIGdldHRlcikge1xuICB2YXIgbmV4dElkeCA9IDA7XG4gIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChzZXRJbnN0Ll92YWx1ZXNbbmV4dElkeF0gPT09IHVuZGVmTWFya2VyKSB7XG4gICAgICAgIG5leHRJZHgrKztcbiAgICAgIH1pZiAobmV4dElkeCA9PT0gc2V0SW5zdC5fdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogZ2V0dGVyLmNhbGwoc2V0SW5zdCwgbmV4dElkeCsrKSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNTaXplKHNldEluc3QpIHtcbiAgdmFyIHNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgcyA9IHNldEluc3QuX3ZhbHVlcy5sZW5ndGg7IGkgPCBzOyBpKyspIHtcbiAgICBpZiAoc2V0SW5zdC5fdmFsdWVzW2ldICE9PSB1bmRlZk1hcmtlcikgc2l6ZSsrO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG52YXIgU2V0ID0gZnVuY3Rpb24gU2V0KGRhdGEpIHtcbiAgdGhpcy5fdmFsdWVzID0gW107XG5cbiAgLy8gSWYgYGRhdGFgIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgc2V0XG4gIGRhdGEgJiYgdHlwZW9mIGRhdGEuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJyAmJiBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB0aGlzLmFkZC5jYWxsKHRoaXMsIGl0ZW0pO1xuICB9LCB0aGlzKTtcblxuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xufTtcblxuLy8gU29tZSBvbGQgZW5naW5lcyBkbyBub3Qgc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzLiAgU2luY2UgU2V0IG9ubHkgcmVxdWlyZXMgdGhlc2UgZm9yIHRoZSBzaXplIHByb3BlcnR5LCB3ZSBjYW4gZmFsbCBiYWNrIHRvIHNldHRpbmcgdGhlIHNpemUgcHJvcGVydHkgc3RhdGljYWxseSBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIHNldCBjaGFuZ2VzLlxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsICdzaXplJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhbGNTaXplKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59IGNhdGNoIChlKSB7XG4gIEFDQ0VTU09SX1NVUFBPUlQgPSBmYWxzZTtcbn1cblxuU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFsdWUgPSBlbmNvZGVWYWwodmFsdWUpO1xuICBpZiAodGhpcy5fdmFsdWVzLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl92YWx1ZXMuaW5kZXhPZihlbmNvZGVWYWwodmFsdWUpKSAhPT0gLTE7XG59O1xuU2V0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIGlkeCA9IHRoaXMuX3ZhbHVlcy5pbmRleE9mKGVuY29kZVZhbCh2YWx1ZSkpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICB0aGlzLl92YWx1ZXNbaWR4XSA9IHVuZGVmTWFya2VyO1xuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5TZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgaWYgKCFBQ0NFU1NPUl9TVVBQT1JUKSB0aGlzLnNpemUgPSAwO1xufTtcblNldC5wcm90b3R5cGUudmFsdWVzID0gU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGRlY29kZVZhbCh0aGlzLl92YWx1ZXNbaV0pO1xuICB9KTtcbn07XG5TZXQucHJvdG90eXBlLmVudHJpZXMgPSBTZXQucHJvdG90eXBlW19zeW1ib2wyLmRlZmF1bHQuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIFtkZWNvZGVWYWwodGhpcy5fdmFsdWVzW2ldKSwgZGVjb2RlVmFsKHRoaXMuX3ZhbHVlc1tpXSldO1xuICB9KTtcbn07XG5TZXQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2tGbiwgdGhpc0FyZykge1xuICB0aGlzQXJnID0gdGhpc0FyZyB8fCBnbG9iYWw7XG4gIHZhciBpdGVyYXRvciA9IHRoaXMuZW50cmllcygpO1xuICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICB3aGlsZSAocmVzdWx0LmRvbmUgPT09IGZhbHNlKSB7XG4gICAgY2FsbGJhY2tGbi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZVsxXSwgcmVzdWx0LnZhbHVlWzBdLCB0aGlzKTtcbiAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIH1cbn07XG5cblNldC5wcm90b3R5cGVbX3N5bWJvbDIuZGVmYXVsdC5zcGVjaWVzXSA9IFNldDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCwgJ2NvbnN0cnVjdG9yJywge1xuICB2YWx1ZTogU2V0XG59KTtcblxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCwgJ2xlbmd0aCcsIHtcbiAgICB2YWx1ZTogMFxuICB9KTtcbn0gY2F0Y2ggKGUpIHt9XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4vKiBlc2xpbnQgbm8tZXh0ZW5kLW5hdGl2ZTogXCJvZmZcIiAqL1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgY291bnRlciA9IERhdGUubm93KCkgJSAxZTk7XG5cbnZhciBXZWFrTWFwID0gZnVuY3Rpb24gV2Vha01hcChkYXRhKSB7XG4gIHRoaXMubmFtZSA9ICdfX3N0JyArIChNYXRoLnJhbmRvbSgpICogMWU5ID4+PiAwKSArIChjb3VudGVyKysgKyAnX18nKTtcblxuICAvLyBJZiBkYXRhIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgbWFwXG4gIGRhdGEgJiYgZGF0YS5mb3JFYWNoICYmIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHRoaXMuc2V0LmFwcGx5KHRoaXMsIGl0ZW0pO1xuICB9LCB0aGlzKTtcbn07XG5cbldlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIGlmICgodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yoa2V5KSkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcblxuICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTtcbiAgaWYgKGVudHJ5ICYmIGVudHJ5WzBdID09PSBrZXkpIGVudHJ5WzFdID0gdmFsdWU7ZWxzZSBkZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMubmFtZSwgeyB2YWx1ZTogW2tleSwgdmFsdWVdLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeTtcbiAgcmV0dXJuIChlbnRyeSA9IGtleVt0aGlzLm5hbWVdKSAmJiBlbnRyeVswXSA9PT0ga2V5ID8gZW50cnlbMV0gOiB1bmRlZmluZWQ7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICBpZiAoIWVudHJ5IHx8IGVudHJ5WzBdICE9PSBrZXkpIHJldHVybiBmYWxzZTtcbiAgZW50cnlbMF0gPSBlbnRyeVsxXSA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICBpZiAoIWVudHJ5KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbnRyeVswXSA9PT0ga2V5O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIgKi9cblxudmFyIGNvdW50ZXIgPSBEYXRlLm5vdygpICUgMWU5O1xuXG52YXIgV2Vha1NldCA9IGZ1bmN0aW9uIFdlYWtTZXQoZGF0YSkge1xuICB0aGlzLm5hbWUgPSAnX19zdCcgKyAoTWF0aC5yYW5kb20oKSAqIDFlOSA+Pj4gMCkgKyAoY291bnRlcisrICsgJ19fJyk7XG4gIGRhdGEgJiYgZGF0YS5mb3JFYWNoICYmIGRhdGEuZm9yRWFjaCh0aGlzLmFkZCwgdGhpcyk7XG59O1xuXG5XZWFrU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICBpZiAoIW9ialtuYW1lXSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbmFtZSwgeyB2YWx1ZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAoIW9ialt0aGlzLm5hbWVdKSByZXR1cm4gZmFsc2U7XG4gIG9ialt0aGlzLm5hbWVdID0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbldlYWtTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuICEhb2JqW3RoaXMubmFtZV07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtTZXQ7XG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgRm9udEZhY2UgPSBmdW5jdGlvbiBGb250RmFjZShmYW1pbHksIHNvdXJjZSkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9udEZhY2UpO1xuXG4gIHRoaXMuZmFtaWx5ID0gZmFtaWx5O1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRm9udEZhY2U7XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9VUkxcblxudmFyIFVSTFNlYXJjaFBhcmFtcyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciByZWxhdGl2ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5yZWxhdGl2ZS5mdHAgPSAyMTtcbnJlbGF0aXZlLmZpbGUgPSAwO1xucmVsYXRpdmUuZ29waGVyID0gNzA7XG5yZWxhdGl2ZS5odHRwID0gODA7XG5yZWxhdGl2ZS5odHRwcyA9IDQ0MztcbnJlbGF0aXZlLndzID0gODA7XG5yZWxhdGl2ZS53c3MgPSA0NDM7XG5cbnZhciByZWxhdGl2ZVBhdGhEb3RNYXBwaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbnJlbGF0aXZlUGF0aERvdE1hcHBpbmdbJyUyZSddID0gJy4nO1xucmVsYXRpdmVQYXRoRG90TWFwcGluZ1snLiUyZSddID0gJy4uJztcbnJlbGF0aXZlUGF0aERvdE1hcHBpbmdbJyUyZS4nXSA9ICcuLic7XG5yZWxhdGl2ZVBhdGhEb3RNYXBwaW5nWyclMmUlMmUnXSA9ICcuLic7XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVTY2hlbWUoc2NoZW1lKSB7XG4gIHJldHVybiByZWxhdGl2ZVtzY2hlbWVdICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGludmFsaWQoKSB7XG4gIGNsZWFyLmNhbGwodGhpcyk7XG4gIHRoaXMuX2lzSW52YWxpZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIElETkFUb0FTQ0lJKGgpIHtcbiAgaWYgKCcnID09IGgpIHtcbiAgICBpbnZhbGlkLmNhbGwodGhpcyk7XG4gIH1cbiAgLy8gWFhYXG4gIHJldHVybiBoLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRFc2NhcGUoYykge1xuICB2YXIgdW5pY29kZSA9IGMuY2hhckNvZGVBdCgwKTtcbiAgaWYgKHVuaWNvZGUgPiAweDIwICYmIHVuaWNvZGUgPCAweDdGICYmXG4gIC8vIFwiICMgPCA+ID8gYFxuICBbMHgyMiwgMHgyMywgMHgzQywgMHgzRSwgMHgzRiwgMHg2MF0uaW5kZXhPZih1bmljb2RlKSA9PSAtMSkge1xuICAgIHJldHVybiBjO1xuICB9XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYyk7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRFc2NhcGVRdWVyeShjKSB7XG4gIC8vIFhYWCBUaGlzIGFjdHVhbGx5IG5lZWRzIHRvIGVuY29kZSBjIHVzaW5nIGVuY29kaW5nIGFuZCB0aGVuXG4gIC8vIGNvbnZlcnQgdGhlIGJ5dGVzIG9uZS1ieS1vbmUuXG5cbiAgdmFyIHVuaWNvZGUgPSBjLmNoYXJDb2RlQXQoMCk7XG4gIGlmICh1bmljb2RlID4gMHgyMCAmJiB1bmljb2RlIDwgMHg3RiAmJlxuICAvLyBcIiAjIDwgPiBgIChkbyBub3QgZXNjYXBlICc/JylcbiAgWzB4MjIsIDB4MjMsIDB4M0MsIDB4M0UsIDB4NjBdLmluZGV4T2YodW5pY29kZSkgPT0gLTEpIHtcbiAgICByZXR1cm4gYztcbiAgfVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGMpO1xufVxuXG52YXIgRU9GID0gdW5kZWZpbmVkLFxuICAgIEFMUEhBID0gL1thLXpBLVpdLyxcbiAgICBBTFBIQU5VTUVSSUMgPSAvW2EtekEtWjAtOVxcK1xcLVxcLl0vO1xuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgc3RhdGVPdmVycmlkZSwgYmFzZSkge1xuICBmdW5jdGlvbiBlcnIobWVzc2FnZSkge1xuICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCAnc2NoZW1lIHN0YXJ0JyxcbiAgICAgIGN1cnNvciA9IDAsXG4gICAgICBidWZmZXIgPSAnJyxcbiAgICAgIHNlZW5BdCA9IGZhbHNlLFxuICAgICAgc2VlbkJyYWNrZXQgPSBmYWxzZSxcbiAgICAgIGVycm9ycyA9IFtdO1xuXG4gIGxvb3A6IHdoaWxlICgoaW5wdXRbY3Vyc29yIC0gMV0gIT0gRU9GIHx8IGN1cnNvciA9PSAwKSAmJiAhdGhpcy5faXNJbnZhbGlkKSB7XG4gICAgdmFyIGMgPSBpbnB1dFtjdXJzb3JdO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgJ3NjaGVtZSBzdGFydCc6XG4gICAgICAgIGlmIChjICYmIEFMUEhBLnRlc3QoYykpIHtcbiAgICAgICAgICBidWZmZXIgKz0gYy50b0xvd2VyQ2FzZSgpOyAvLyBBU0NJSS1zYWZlXG4gICAgICAgICAgc3RhdGUgPSAnc2NoZW1lJztcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gJ25vIHNjaGVtZSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIHNjaGVtZS4nKTtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzY2hlbWUnOlxuICAgICAgICBpZiAoYyAmJiBBTFBIQU5VTUVSSUMudGVzdChjKSkge1xuICAgICAgICAgIGJ1ZmZlciArPSBjLnRvTG93ZXJDYXNlKCk7IC8vIEFTQ0lJLXNhZmVcbiAgICAgICAgfSBlbHNlIGlmICgnOicgPT0gYykge1xuICAgICAgICAgIHRoaXMuX3NjaGVtZSA9IGJ1ZmZlcjtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUmVsYXRpdmVTY2hlbWUodGhpcy5fc2NoZW1lKSkge1xuICAgICAgICAgICAgdGhpcy5faXNSZWxhdGl2ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnZmlsZScgPT0gdGhpcy5fc2NoZW1lKSB7XG4gICAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9pc1JlbGF0aXZlICYmIGJhc2UgJiYgYmFzZS5fc2NoZW1lID09IHRoaXMuX3NjaGVtZSkge1xuICAgICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUgb3IgYXV0aG9yaXR5JztcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSBmaXJzdCBzbGFzaCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ3NjaGVtZSBkYXRhJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICAgIHN0YXRlID0gJ25vIHNjaGVtZSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMpIHtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycignQ29kZSBwb2ludCBub3QgYWxsb3dlZCBpbiBzY2hlbWU6ICcgKyBjKTtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzY2hlbWUgZGF0YSc6XG4gICAgICAgIGlmICgnPycgPT0gYykge1xuICAgICAgICAgIHN0YXRlID0gJ3F1ZXJ5JztcbiAgICAgICAgfSBlbHNlIGlmICgnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgIHN0YXRlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBYWFggZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRU9GICE9IGMgJiYgJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVtZURhdGEgKz0gcGVyY2VudEVzY2FwZShjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ25vIHNjaGVtZSc6XG4gICAgICAgIGlmICghYmFzZSB8fCAhaXNSZWxhdGl2ZVNjaGVtZShiYXNlLl9zY2hlbWUpKSB7XG4gICAgICAgICAgZXJyKCdNaXNzaW5nIHNjaGVtZS4nKTtcbiAgICAgICAgICBpbnZhbGlkLmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWxhdGl2ZSBvciBhdXRob3JpdHknOlxuICAgICAgICBpZiAoJy8nID09IGMgJiYgJy8nID09IGlucHV0W2N1cnNvciArIDFdKSB7XG4gICAgICAgICAgc3RhdGUgPSAnYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoJ0V4cGVjdGVkIC8sIGdvdDogJyArIGMpO1xuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVsYXRpdmUnOlxuICAgICAgICB0aGlzLl9pc1JlbGF0aXZlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCdmaWxlJyAhPSB0aGlzLl9zY2hlbWUpIHRoaXMuX3NjaGVtZSA9IGJhc2UuX3NjaGVtZTtcbiAgICAgICAgaWYgKEVPRiA9PSBjKSB7XG4gICAgICAgICAgdGhpcy5faG9zdCA9IGJhc2UuX2hvc3Q7XG4gICAgICAgICAgdGhpcy5fcG9ydCA9IGJhc2UuX3BvcnQ7XG4gICAgICAgICAgdGhpcy5fcGF0aCA9IGJhc2UuX3BhdGguc2xpY2UoKTtcbiAgICAgICAgICB0aGlzLl9xdWVyeSA9IGJhc2UuX3F1ZXJ5O1xuICAgICAgICAgIHRoaXMuX3VzZXJuYW1lID0gYmFzZS5fdXNlcm5hbWU7XG4gICAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSBiYXNlLl9wYXNzd29yZDtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9IGVsc2UgaWYgKCcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjKSB7XG4gICAgICAgICAgaWYgKCdcXFxcJyA9PSBjKSBlcnIoJ1xcXFwgaXMgYW4gaW52YWxpZCBjb2RlIHBvaW50LicpO1xuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHNsYXNoJztcbiAgICAgICAgfSBlbHNlIGlmICgnPycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2hvc3QgPSBiYXNlLl9ob3N0O1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgIHRoaXMuX3BhdGggPSBiYXNlLl9wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdGhpcy5fcXVlcnkgPSAnPyc7XG4gICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSBiYXNlLl91c2VybmFtZTtcbiAgICAgICAgICB0aGlzLl9wYXNzd29yZCA9IGJhc2UuX3Bhc3N3b3JkO1xuICAgICAgICAgIHN0YXRlID0gJ3F1ZXJ5JztcbiAgICAgICAgfSBlbHNlIGlmICgnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2hvc3QgPSBiYXNlLl9ob3N0O1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgIHRoaXMuX3BhdGggPSBiYXNlLl9wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdGhpcy5fcXVlcnkgPSBiYXNlLl9xdWVyeTtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudCA9ICcjJztcbiAgICAgICAgICB0aGlzLl91c2VybmFtZSA9IGJhc2UuX3VzZXJuYW1lO1xuICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gYmFzZS5fcGFzc3dvcmQ7XG4gICAgICAgICAgc3RhdGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuZXh0QyA9IGlucHV0W2N1cnNvciArIDFdO1xuICAgICAgICAgIHZhciBuZXh0TmV4dEMgPSBpbnB1dFtjdXJzb3IgKyAyXTtcbiAgICAgICAgICBpZiAoJ2ZpbGUnICE9IHRoaXMuX3NjaGVtZSB8fCAhQUxQSEEudGVzdChjKSB8fCBuZXh0QyAhPSAnOicgJiYgbmV4dEMgIT0gJ3wnIHx8IEVPRiAhPSBuZXh0TmV4dEMgJiYgJy8nICE9IG5leHROZXh0QyAmJiAnXFxcXCcgIT0gbmV4dE5leHRDICYmICc/JyAhPSBuZXh0TmV4dEMgJiYgJyMnICE9IG5leHROZXh0Qykge1xuICAgICAgICAgICAgdGhpcy5faG9zdCA9IGJhc2UuX2hvc3Q7XG4gICAgICAgICAgICB0aGlzLl9wb3J0ID0gYmFzZS5fcG9ydDtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJuYW1lID0gYmFzZS5fdXNlcm5hbWU7XG4gICAgICAgICAgICB0aGlzLl9wYXNzd29yZCA9IGJhc2UuX3Bhc3N3b3JkO1xuICAgICAgICAgICAgdGhpcy5fcGF0aCA9IGJhc2UuX3BhdGguc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3BhdGgucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWxhdGl2ZSBzbGFzaCc6XG4gICAgICAgIGlmICgnLycgPT0gYyB8fCAnXFxcXCcgPT0gYykge1xuICAgICAgICAgIGlmICgnXFxcXCcgPT0gYykge1xuICAgICAgICAgICAgZXJyKCdcXFxcIGlzIGFuIGludmFsaWQgY29kZSBwb2ludC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdmaWxlJyA9PSB0aGlzLl9zY2hlbWUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2ZpbGUgaG9zdCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgnZmlsZScgIT0gdGhpcy5fc2NoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0ID0gYmFzZS5faG9zdDtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSBiYXNlLl91c2VybmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gYmFzZS5fcGFzc3dvcmQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHkgZmlyc3Qgc2xhc2gnOlxuICAgICAgICBpZiAoJy8nID09IGMpIHtcbiAgICAgICAgICBzdGF0ZSA9ICdhdXRob3JpdHkgc2Vjb25kIHNsYXNoJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoXCJFeHBlY3RlZCAnLycsIGdvdDogXCIgKyBjKTtcbiAgICAgICAgICBzdGF0ZSA9ICdhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHkgc2Vjb25kIHNsYXNoJzpcbiAgICAgICAgc3RhdGUgPSAnYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzJztcbiAgICAgICAgaWYgKCcvJyAhPSBjKSB7XG4gICAgICAgICAgZXJyKFwiRXhwZWN0ZWQgJy8nLCBnb3Q6IFwiICsgYyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyc6XG4gICAgICAgIGlmICgnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyKCdFeHBlY3RlZCBhdXRob3JpdHksIGdvdDogJyArIGMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHknOlxuICAgICAgICBpZiAoJ0AnID09IGMpIHtcbiAgICAgICAgICBpZiAoc2VlbkF0KSB7XG4gICAgICAgICAgICBlcnIoJ0AgYWxyZWFkeSBzZWVuLicpO1xuICAgICAgICAgICAgYnVmZmVyICs9ICclNDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY3AgPSBidWZmZXJbaV07XG4gICAgICAgICAgICBpZiAoJ1xcdCcgPT0gY3AgfHwgJ1xcbicgPT0gY3AgfHwgJ1xccicgPT0gY3ApIHtcbiAgICAgICAgICAgICAgZXJyKCdJbnZhbGlkIHdoaXRlc3BhY2UgaW4gYXV0aG9yaXR5LicpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFhYWCBjaGVjayBVUkwgY29kZSBwb2ludHNcbiAgICAgICAgICAgIGlmICgnOicgPT0gY3AgJiYgbnVsbCA9PT0gdGhpcy5fcGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGVtcEMgPSBwZXJjZW50RXNjYXBlKGNwKTtcbiAgICAgICAgICAgIG51bGwgIT09IHRoaXMuX3Bhc3N3b3JkID8gdGhpcy5fcGFzc3dvcmQgKz0gdGVtcEMgOiB0aGlzLl91c2VybmFtZSArPSB0ZW1wQztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgJz8nID09IGMgfHwgJyMnID09IGMpIHtcbiAgICAgICAgICBjdXJzb3IgLT0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9ICdob3N0JztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZmZXIgKz0gYztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZmlsZSBob3N0JzpcbiAgICAgICAgaWYgKEVPRiA9PSBjIHx8ICcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjIHx8ICc/JyA9PSBjIHx8ICcjJyA9PSBjKSB7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gMiAmJiBBTFBIQS50ZXN0KGJ1ZmZlclswXSkgJiYgKGJ1ZmZlclsxXSA9PSAnOicgfHwgYnVmZmVyWzFdID09ICd8JykpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoIHN0YXJ0JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faG9zdCA9IElETkFUb0FTQ0lJLmNhbGwodGhpcywgYnVmZmVyKTtcbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUgcGF0aCBzdGFydCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCdcXHQnID09IGMgfHwgJ1xcbicgPT0gYyB8fCAnXFxyJyA9PSBjKSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIHdoaXRlc3BhY2UgaW4gZmlsZSBob3N0LicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciArPSBjO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdob3N0JzpcbiAgICAgIGNhc2UgJ2hvc3RuYW1lJzpcbiAgICAgICAgaWYgKCc6JyA9PSBjICYmICFzZWVuQnJhY2tldCkge1xuICAgICAgICAgIC8vIFhYWCBob3N0IHBhcnNpbmdcbiAgICAgICAgICB0aGlzLl9ob3N0ID0gSUROQVRvQVNDSUkuY2FsbCh0aGlzLCBidWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gJ3BvcnQnO1xuICAgICAgICAgIGlmICgnaG9zdG5hbWUnID09IHN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEVPRiA9PSBjIHx8ICcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjIHx8ICc/JyA9PSBjIHx8ICcjJyA9PSBjKSB7XG4gICAgICAgICAgdGhpcy5faG9zdCA9IElETkFUb0FTQ0lJLmNhbGwodGhpcywgYnVmZmVyKTtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoIHN0YXJ0JztcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICBpZiAoJ1snID09IGMpIHtcbiAgICAgICAgICAgIHNlZW5CcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCddJyA9PSBjKSB7XG4gICAgICAgICAgICBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIgKz0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoJ0ludmFsaWQgY29kZSBwb2ludCBpbiBob3N0L2hvc3RuYW1lOiAnICsgYyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3BvcnQnOlxuICAgICAgICBpZiAoL1swLTldLy50ZXN0KGMpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGM7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgJz8nID09IGMgfHwgJyMnID09IGMgfHwgc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIGlmICgnJyAhPSBidWZmZXIpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7XG4gICAgICAgICAgICBpZiAodGVtcCAhPSByZWxhdGl2ZVt0aGlzLl9zY2hlbWVdKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSB0ZW1wICsgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGggc3RhcnQnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCdcXHQnID09IGMgfHwgJ1xcbicgPT0gYyB8fCAnXFxyJyA9PSBjKSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIGNvZGUgcG9pbnQgaW4gcG9ydDogJyArIGMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludmFsaWQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVsYXRpdmUgcGF0aCBzdGFydCc6XG4gICAgICAgIGlmICgnXFxcXCcgPT0gYykgZXJyKFwiJ1xcXFwnIG5vdCBhbGxvd2VkIGluIHBhdGguXCIpO1xuICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoJztcbiAgICAgICAgaWYgKCcvJyAhPSBjICYmICdcXFxcJyAhPSBjKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlbGF0aXZlIHBhdGgnOlxuICAgICAgICBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgIXN0YXRlT3ZlcnJpZGUgJiYgKCc/JyA9PSBjIHx8ICcjJyA9PSBjKSkge1xuICAgICAgICAgIGlmICgnXFxcXCcgPT0gYykge1xuICAgICAgICAgICAgZXJyKCdcXFxcIG5vdCBhbGxvd2VkIGluIHJlbGF0aXZlIHBhdGguJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0bXA7XG4gICAgICAgICAgaWYgKHRtcCA9IHJlbGF0aXZlUGF0aERvdE1hcHBpbmdbYnVmZmVyLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB0bXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnLi4nID09IGJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5fcGF0aC5wb3AoKTtcbiAgICAgICAgICAgIGlmICgnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgICAgICB0aGlzLl9wYXRoLnB1c2goJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoJy4nID09IGJ1ZmZlciAmJiAnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgICAgdGhpcy5fcGF0aC5wdXNoKCcnKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCcuJyAhPSBidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICgnZmlsZScgPT0gdGhpcy5fc2NoZW1lICYmIHRoaXMuX3BhdGgubGVuZ3RoID09IDAgJiYgYnVmZmVyLmxlbmd0aCA9PSAyICYmIEFMUEhBLnRlc3QoYnVmZmVyWzBdKSAmJiBidWZmZXJbMV0gPT0gJ3wnKSB7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlclswXSArICc6JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BhdGgucHVzaChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBpZiAoJz8nID09IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gJz8nO1xuICAgICAgICAgICAgc3RhdGUgPSAncXVlcnknO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJyMnID09IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgICAgc3RhdGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgnXFx0JyAhPSBjICYmICdcXG4nICE9IGMgJiYgJ1xccicgIT0gYykge1xuICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RXNjYXBlKGMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdxdWVyeSc6XG4gICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiAnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgIHN0YXRlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfSBlbHNlIGlmIChFT0YgIT0gYyAmJiAnXFx0JyAhPSBjICYmICdcXG4nICE9IGMgJiYgJ1xccicgIT0gYykge1xuICAgICAgICAgIHRoaXMuX3F1ZXJ5ICs9IHBlcmNlbnRFc2NhcGVRdWVyeShjKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZnJhZ21lbnQnOlxuICAgICAgICBpZiAoRU9GICE9IGMgJiYgJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudCArPSBjO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGN1cnNvcisrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICB0aGlzLl9zY2hlbWUgPSAnJztcbiAgdGhpcy5fc2NoZW1lRGF0YSA9ICcnO1xuICB0aGlzLl91c2VybmFtZSA9ICcnO1xuICB0aGlzLl9wYXNzd29yZCA9IG51bGw7XG4gIHRoaXMuX2hvc3QgPSAnJztcbiAgdGhpcy5fcG9ydCA9ICcnO1xuICB0aGlzLl9wYXRoID0gW107XG4gIHRoaXMuX3F1ZXJ5ID0gJyc7XG4gIHRoaXMuX2ZyYWdtZW50ID0gJyc7XG4gIHRoaXMuX2lzSW52YWxpZCA9IGZhbHNlO1xuICB0aGlzLl9pc1JlbGF0aXZlID0gZmFsc2U7XG59XG5cbi8vIERvZXMgbm90IHByb2Nlc3MgZG9tYWluIG5hbWVzIG9yIElQIGFkZHJlc3Nlcy5cbi8vIERvZXMgbm90IGhhbmRsZSBlbmNvZGluZyBmb3IgdGhlIHF1ZXJ5IHBhcmFtZXRlci5cbmZ1bmN0aW9uIFVSTCh1cmwsIGJhc2UgLyogLCBlbmNvZGluZyAqLykge1xuICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkICYmICEoYmFzZSBpbnN0YW5jZW9mIFVSTCkpIGJhc2UgPSBuZXcgVVJMKFN0cmluZyhiYXNlKSk7XG5cbiAgdGhpcy5fdXJsID0gdXJsO1xuICBjbGVhci5jYWxsKHRoaXMpO1xuXG4gIHZhciBpbnB1dCA9IHVybC5yZXBsYWNlKC9eWyBcXHRcXHJcXG5cXGZdK3xbIFxcdFxcclxcblxcZl0rJC9nLCAnJyk7XG4gIC8vIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04J1xuXG4gIHBhcnNlLmNhbGwodGhpcywgaW5wdXQsIG51bGwsIGJhc2UpO1xufVxuXG5VUkwucHJvdG90eXBlID0ge1xuICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHJlZjtcbiAgfSxcbiAgZ2V0IGhyZWYoKSB7XG4gICAgaWYgKHRoaXMuX2lzSW52YWxpZCkgcmV0dXJuIHRoaXMuX3VybDtcblxuICAgIHZhciBhdXRob3JpdHkgPSAnJztcbiAgICBpZiAoJycgIT0gdGhpcy5fdXNlcm5hbWUgfHwgbnVsbCAhPSB0aGlzLl9wYXNzd29yZCkge1xuICAgICAgYXV0aG9yaXR5ID0gdGhpcy5fdXNlcm5hbWUgKyAobnVsbCAhPSB0aGlzLl9wYXNzd29yZCA/ICc6JyArIHRoaXMuX3Bhc3N3b3JkIDogJycpICsgJ0AnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3RvY29sICsgKHRoaXMuX2lzUmVsYXRpdmUgPyAnLy8nICsgYXV0aG9yaXR5ICsgdGhpcy5ob3N0IDogJycpICsgdGhpcy5wYXRobmFtZSArIHRoaXMuX3F1ZXJ5ICsgdGhpcy5fZnJhZ21lbnQ7XG4gIH0sXG4gIHNldCBocmVmKGhyZWYpIHtcbiAgICBjbGVhci5jYWxsKHRoaXMpO1xuICAgIHBhcnNlLmNhbGwodGhpcywgaHJlZik7XG4gIH0sXG5cbiAgZ2V0IHByb3RvY29sKCkge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWUgKyAnOic7XG4gIH0sXG4gIHNldCBwcm90b2NvbChwcm90b2NvbCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQpIHJldHVybjtcbiAgICBwYXJzZS5jYWxsKHRoaXMsIHByb3RvY29sICsgJzonLCAnc2NoZW1lIHN0YXJ0Jyk7XG4gIH0sXG5cbiAgZ2V0IGhvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSW52YWxpZCA/ICcnIDogdGhpcy5fcG9ydCA/IHRoaXMuX2hvc3QgKyAnOicgKyB0aGlzLl9wb3J0IDogdGhpcy5faG9zdDtcbiAgfSxcbiAgc2V0IGhvc3QoaG9zdCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX2lzUmVsYXRpdmUpIHJldHVybjtcbiAgICBwYXJzZS5jYWxsKHRoaXMsIGhvc3QsICdob3N0Jyk7XG4gIH0sXG5cbiAgZ2V0IGhvc3RuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9ob3N0O1xuICB9LFxuICBzZXQgaG9zdG5hbWUoaG9zdG5hbWUpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBob3N0bmFtZSwgJ2hvc3RuYW1lJyk7XG4gIH0sXG5cbiAgZ2V0IHBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH0sXG4gIHNldCBwb3J0KHBvcnQpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBwb3J0LCAncG9ydCcpO1xuICB9LFxuXG4gIGdldCBwYXRobmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkID8gJycgOiB0aGlzLl9pc1JlbGF0aXZlID8gJy8nICsgdGhpcy5fcGF0aC5qb2luKCcvJykgOiB0aGlzLl9zY2hlbWVEYXRhO1xuICB9LFxuICBzZXQgcGF0aG5hbWUocGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgdGhpcy5fcGF0aCA9IFtdO1xuICAgIHBhcnNlLmNhbGwodGhpcywgcGF0aG5hbWUsICdyZWxhdGl2ZSBwYXRoIHN0YXJ0Jyk7XG4gIH0sXG5cbiAgZ2V0IHNlYXJjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9xdWVyeSB8fCAnPycgPT0gdGhpcy5fcXVlcnkgPyAnJyA6IHRoaXMuX3F1ZXJ5O1xuICB9LFxuICBzZXQgc2VhcmNoKHNlYXJjaCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX2lzUmVsYXRpdmUpIHJldHVybjtcbiAgICB0aGlzLl9xdWVyeSA9ICc/JztcbiAgICBpZiAoJz8nID09IHNlYXJjaFswXSkgc2VhcmNoID0gc2VhcmNoLnNsaWNlKDEpO1xuICAgIHBhcnNlLmNhbGwodGhpcywgc2VhcmNoLCAncXVlcnknKTtcbiAgfSxcblxuICBnZXQgc2VhcmNoUGFyYW1zKCkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuc2VhcmNoKTtcbiAgfSxcblxuICBnZXQgaGFzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9mcmFnbWVudCB8fCAnIycgPT0gdGhpcy5fZnJhZ21lbnQgPyAnJyA6IHRoaXMuX2ZyYWdtZW50O1xuICB9LFxuICBzZXQgaGFzaChoYXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzSW52YWxpZCkgcmV0dXJuO1xuICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgIGlmICgnIycgPT0gaGFzaFswXSkgaGFzaCA9IGhhc2guc2xpY2UoMSk7XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBoYXNoLCAnZnJhZ21lbnQnKTtcbiAgfSxcblxuICBnZXQgb3JpZ2luKCkge1xuICAgIHZhciBob3N0O1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX3NjaGVtZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBqYXZhc2NyaXB0OiBHZWNrbyByZXR1cm5zIFN0cmluZyhcIlwiKSwgV2ViS2l0L0JsaW5rIFN0cmluZyhcIm51bGxcIilcbiAgICAvLyBHZWNrbyB0aHJvd3MgZXJyb3IgZm9yIFwiZGF0YTovL1wiXG4gICAgLy8gZGF0YTogR2Vja28gcmV0dXJucyBcIlwiLCBCbGluayByZXR1cm5zIFwiZGF0YTovL1wiLCBXZWJLaXQgcmV0dXJucyBcIm51bGxcIlxuICAgIC8vIEdlY2tvIHJldHVybnMgU3RyaW5nKFwiXCIpIGZvciBmaWxlOiBtYWlsdG86XG4gICAgLy8gV2ViS2l0L0JsaW5rIHJldHVybnMgU3RyaW5nKFwiU0NIRU1FOi8vXCIpIGZvciBmaWxlOiBtYWlsdG86XG4gICAgc3dpdGNoICh0aGlzLl9zY2hlbWUpIHtcbiAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICBjYXNlICdqYXZhc2NyaXB0JzpcbiAgICAgIGNhc2UgJ21haWx0byc6XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zY2hlbWUgKyAnOi8vJyArIGhvc3Q7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVVJMO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lcmljZi9jc3MtbWVkaWFxdWVyeVxuXG52YXIgUkVfTUVESUFfUVVFUlkgPSAvXig/Oihvbmx5fG5vdCk/XFxzKihbX2Etel1bX2EtejAtOS1dKil8KFxcKFteXFwpXStcXCkpKSg/OlxccyphbmRcXHMqKC4qKSk/JC9pLFxuICAgIFJFX01RX0VYUFJFU1NJT04gPSAvXlxcKFxccyooW19hLXotXVtfYS16MC05LV0qKVxccyooPzpcXDpcXHMqKFteXFwpXSspKT9cXHMqXFwpJC8sXG4gICAgUkVfTVFfRkVBVFVSRSA9IC9eKD86KG1pbnxtYXgpLSk/KC4rKS87XG5cbmZ1bmN0aW9uIF9tYXRjaGVzKG1lZGlhLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIF9wYXJzZVF1ZXJ5KG1lZGlhKS5zb21lKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgIHZhciBpbnZlcnNlID0gcXVlcnkuaW52ZXJzZTtcblxuICAgIHZhciB0eXBlTWF0Y2ggPSBxdWVyeS50eXBlID09PSAnYWxsJyB8fCB2YWx1ZXMudHlwZSA9PT0gcXVlcnkudHlwZTtcblxuICAgIGlmICh0eXBlTWF0Y2ggJiYgaW52ZXJzZSB8fCAhKHR5cGVNYXRjaCB8fCBpbnZlcnNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBleHByZXNzaW9uc01hdGNoID0gcXVlcnkuZXhwcmVzc2lvbnMuZXZlcnkoZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBmZWF0dXJlID0gZXhwcmVzc2lvbi5mZWF0dXJlLFxuICAgICAgICAgIG1vZGlmaWVyID0gZXhwcmVzc2lvbi5tb2RpZmllcixcbiAgICAgICAgICBleHBWYWx1ZSA9IGV4cHJlc3Npb24udmFsdWUsXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbZmVhdHVyZV07XG5cbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGZlYXR1cmUpIHtcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICBjYXNlICdoZWlnaHQnOlxuICAgICAgICAgIGV4cFZhbHVlID0gcGFyc2VGbG9hdChleHBWYWx1ZSk7XG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgIHJldHVybiB2YWx1ZSA+PSBleHBWYWx1ZTtcbiAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPD0gZXhwVmFsdWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBleHBWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBleHByZXNzaW9uc01hdGNoICYmICFpbnZlcnNlIHx8ICFleHByZXNzaW9uc01hdGNoICYmIGludmVyc2U7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gX3BhcnNlUXVlcnkobWVkaWEpIHtcbiAgcmV0dXJuIG1lZGlhLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgIHF1ZXJ5ID0gcXVlcnkudHJpbSgpO1xuXG4gICAgdmFyIGNhcHR1cmVzID0gcXVlcnkubWF0Y2goUkVfTUVESUFfUVVFUlkpO1xuXG4gICAgaWYgKCFjYXB0dXJlcykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICB9XG5cbiAgICB2YXIgbW9kaWZpZXIgPSBjYXB0dXJlc1sxXSxcbiAgICAgICAgdHlwZSA9IGNhcHR1cmVzWzJdLFxuICAgICAgICBleHByZXNzaW9ucyA9ICgoY2FwdHVyZXNbM10gfHwgJycpICsgKGNhcHR1cmVzWzRdIHx8ICcnKSkudHJpbSgpLFxuICAgICAgICBwYXJzZWQgPSB7fTtcblxuICAgIHBhcnNlZC5pbnZlcnNlID0gISFtb2RpZmllciAmJiBtb2RpZmllci50b0xvd2VyQ2FzZSgpID09PSAnbm90JztcbiAgICBwYXJzZWQudHlwZSA9IHR5cGUgPyB0eXBlLnRvTG93ZXJDYXNlKCkgOiAnYWxsJztcblxuICAgIGlmICghZXhwcmVzc2lvbnMpIHtcbiAgICAgIHBhcnNlZC5leHByZXNzaW9ucyA9IFtdO1xuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG5cbiAgICBleHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hdGNoKC9cXChbXlxcKV0rXFwpL2cpO1xuXG4gICAgaWYgKCFleHByZXNzaW9ucykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICB9XG5cbiAgICBwYXJzZWQuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucy5tYXAoZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBjYXB0dXJlcyA9IGV4cHJlc3Npb24ubWF0Y2goUkVfTVFfRVhQUkVTU0lPTik7XG5cbiAgICAgIGlmICghY2FwdHVyZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZlYXR1cmUgPSBjYXB0dXJlc1sxXS50b0xvd2VyQ2FzZSgpLm1hdGNoKFJFX01RX0ZFQVRVUkUpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2RpZmllcjogZmVhdHVyZVsxXSxcbiAgICAgICAgZmVhdHVyZTogZmVhdHVyZVsyXSxcbiAgICAgICAgdmFsdWU6IGNhcHR1cmVzWzJdXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBtYXRjaE1lZGlhKG1lZGlhKSB7XG4gIHZhciBtcWwgPSB7XG4gICAgbWF0Y2hlczogZmFsc2UsXG4gICAgbWVkaWE6IG1lZGlhXG4gIH07XG5cbiAgaWYgKG1lZGlhID09PSAnJykge1xuICAgIG1xbC5tYXRjaGVzID0gdHJ1ZTtcbiAgICByZXR1cm4gbXFsO1xuICB9XG5cbiAgbXFsLm1hdGNoZXMgPSBfbWF0Y2hlcyhtZWRpYSwge1xuICAgIHR5cGU6ICdzY3JlZW4nLFxuICAgIHdpZHRoOiB3aW5kb3cuc2NyZWVuLndpZHRoLFxuICAgIGhlaWdodDogd2luZG93LnNjcmVlbi5oZWlnaHRcbiAgfSk7XG5cbiAgcmV0dXJuIG1xbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaE1lZGlhO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSl9OztcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvZGVmaW5lLndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtb2R1bGVzKSB7XG4gIGZ1bmN0aW9uIGRlZmluZShuYW1lLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgaWYgKGRlcHMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICBkZXBzID0gW107XG4gICAgfVxuXG4gICAgbW9kdWxlc1tuYW1lXSA9IHtcbiAgICAgIGZhY3Rvcnk6IGZhY3RvcnksXG4gICAgICBkZXBzOiBkZXBzLFxuICAgICAgbW9kdWxlOiB7IGV4cG9ydHM6IHt9IH0sXG4gICAgICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgIGhhc0Vycm9yOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZGVmaW5lO1xufTtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL3JlcXVpcmUud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtb2R1bGVzKSB7XG4gIGZ1bmN0aW9uIHJlcXVpcmUobmFtZSkge1xuICAgIHZhciBtb2QgPSBtb2R1bGVzW25hbWVdO1xuXG4gICAgaWYgKG1vZCAmJiBtb2QuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIG1vZC5tb2R1bGUuZXhwb3J0cztcbiAgICB9XG5cbiAgICBpZiAoIW1vZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJpbmcgdW5rbm93biBtb2R1bGUgXCInICsgbmFtZSArICdcIicpO1xuICAgIH1cblxuICAgIGlmIChtb2QuaGFzRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyaW5nIG1vZHVsZSBcIicgKyBuYW1lICsgJ1wiIHdoaWNoIHRocmV3IGFuIGV4Y2VwdGlvbicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBtb2QuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBtb2QuZmFjdG9yeShyZXF1aXJlLCBtb2QubW9kdWxlLmV4cG9ydHMsIG1vZC5tb2R1bGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG1vZC5oYXNFcnJvciA9IHRydWU7XG4gICAgICBtb2QuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kLm1vZHVsZS5leHBvcnRzO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVpcmU7XG59O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9kb3duZ3JhZGUud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfc2VtdmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zZW12ZXIgKi8gMTApO1xuXG52YXIgX3NlbXZlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZW12ZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBub3JtYWxpemVWZXJzaW9uKHYpIHtcbiAgaWYgKHYgPT0gJyonKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cbiAgdiA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAnJztcbiAgdmFyIHNwbGl0ID0gdi5zcGxpdCgnLicpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoaSA8IDMpIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBzcGxpdFtpXSA9PT0gJ3N0cmluZycgJiYgc3BsaXRbaV0gPyBzcGxpdFtpXSA6ICcwJztcbiAgICByZXN1bHQucHVzaChzKTtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmpvaW4oJy4nKTtcbn0gLyogZ2xvYmFsIFdYRW52aXJvbm1lbnQgKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3Ioa2V5LCB2YWwsIGNyaXRlcmlhKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IHRydWUsXG4gICAgZXJyb3JUeXBlOiAxLFxuICAgIGNvZGU6IDEwMDBcbiAgfTtcbiAgdmFyIGdldE1zZyA9IGZ1bmN0aW9uIGdldE1zZyhrZXksIHZhbCwgY3JpdGVyaWEpIHtcbiAgICByZXR1cm4gJ0Rvd25ncmFkZVsnICsga2V5ICsgJ10gOjogZGV2aWNlSW5mbyAnICsgdmFsICsgJyBtYXRjaGVkIGNyaXRlcmlhICcgKyBjcml0ZXJpYTtcbiAgfTtcbiAgdmFyIF9rZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoX2tleS5pbmRleE9mKCdvc3ZlcnNpb24nKSA+PSAwKSB7XG4gICAgcmVzdWx0LmNvZGUgPSAxMDAxO1xuICB9IGVsc2UgaWYgKF9rZXkuaW5kZXhPZignYXBwdmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDI7XG4gIH0gZWxzZSBpZiAoX2tleS5pbmRleE9mKCd3ZWV4dmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDM7XG4gIH0gZWxzZSBpZiAoX2tleS5pbmRleE9mKCdkZXZpY2Vtb2RlbCcpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDQ7XG4gIH1cblxuICByZXN1bHQuZXJyb3JNZXNzYWdlID0gZ2V0TXNnKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogY29uZmlnXG4gKlxuICoge1xuICogICBpb3M6IHtcbiAqICAgICBvc1ZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIGFwcFZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIHdlZXhWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBkZXZpY2VNb2RlbDogWydtb2RlbEEnLCAnbW9kZWxCJywgLi4uXVxuICogICB9LFxuICogICBhbmRyb2lkOiB7XG4gKiAgICAgb3NWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBhcHBWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICB3ZWV4VmVyc2lvbjogJz4xLjAuMCcgb3IgJz49MS4wLjAnIG9yICc8MS4wLjAnIG9yICc8PTEuMC4wJyBvciAnMS4wLjAnXG4gKiAgICAgZGV2aWNlTW9kZWw6IFsnbW9kZWxBJywgJ21vZGVsQicsIC4uLl1cbiAqICAgfVxuICogfVxuICpcbiAqL1xuZnVuY3Rpb24gY2hlY2soY29uZmlnKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IGZhbHNlXG4gIH07XG5cbiAgdmFyIGRldmljZUluZm8gPSBXWEVudmlyb25tZW50O1xuXG4gIHZhciBwbGF0Zm9ybSA9IGRldmljZUluZm8ucGxhdGZvcm0gfHwgJ3Vua25vdyc7XG4gIHZhciBkUGxhdGZvcm0gPSBwbGF0Zm9ybS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgY09iaiA9IGNvbmZpZ1tkUGxhdGZvcm1dIHx8IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gZGV2aWNlSW5mbykge1xuICAgIHZhciBrZXkgPSBpO1xuICAgIHZhciBrZXlMb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciB2YWwgPSBkZXZpY2VJbmZvW2ldO1xuICAgIHZhciBpc1ZlcnNpb24gPSBrZXlMb3dlci5pbmRleE9mKCd2ZXJzaW9uJykgPj0gMDtcbiAgICB2YXIgaXNEZXZpY2VNb2RlbCA9IGtleUxvd2VyLmluZGV4T2YoJ2RldmljZW1vZGVsJykgPj0gMDtcbiAgICB2YXIgY3JpdGVyaWEgPSBjT2JqW2ldO1xuXG4gICAgaWYgKGNyaXRlcmlhICYmIGlzVmVyc2lvbikge1xuICAgICAgdmFyIGMgPSBub3JtYWxpemVWZXJzaW9uKGNyaXRlcmlhKTtcbiAgICAgIHZhciBkID0gbm9ybWFsaXplVmVyc2lvbihkZXZpY2VJbmZvW2ldKTtcblxuICAgICAgaWYgKF9zZW12ZXIyLmRlZmF1bHQuc2F0aXNmaWVzKGQsIGMpKSB7XG4gICAgICAgIHJlc3VsdCA9IGdldEVycm9yKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNEZXZpY2VNb2RlbCkge1xuICAgICAgdmFyIF9jcml0ZXJpYSA9IEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpID8gY3JpdGVyaWEgOiBbY3JpdGVyaWFdO1xuXG4gICAgICBpZiAoX2NyaXRlcmlhLmluZGV4T2YodmFsKSA+PSAwKSB7XG4gICAgICAgIHJlc3VsdCA9IGdldEVycm9yKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF9fd2VleF9yZXF1aXJlX18pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB2YXIgbmF0aXZlSW5zdGFuY2VXcmFwID0gX193ZWV4X3JlcXVpcmVfXygnQHdlZXgtbW9kdWxlL2luc3RhbmNlV3JhcCcpO1xuICAgIHZhciByZXN1bHQgPSBjaGVjayhjb25maWcpO1xuICAgIGlmIChyZXN1bHQuaXNEb3duZ3JhZGUpIHtcbiAgICAgIG5hdGl2ZUluc3RhbmNlV3JhcC5lcnJvcihyZXN1bHQuZXJyb3JUeXBlLCByZXN1bHQuY29kZSwgcmVzdWx0LmVycm9yTWVzc2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufTtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9zZW12ZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHNhdGlzZmllczogZnVuY3Rpb24gc2F0aXNmaWVzKGxlZnQsIHJpZ2h0KSB7XG4gICAgdmFyIHJlZ2V4ID0gLyhcXFcrKT8oW1xcZHwuXSspLztcblxuICAgIGlmICgodHlwZW9mIGxlZnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGxlZnQpKSArICh0eXBlb2YgcmlnaHQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHJpZ2h0KSkgIT0gJ3N0cmluZ3N0cmluZycpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChyaWdodCA9PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBhcnIgPSByaWdodC5tYXRjaChyZWdleCk7XG4gICAgdmFyIGEgPSBsZWZ0LnNwbGl0KCcuJyksXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBiID0gYXJyWzJdLnNwbGl0KCcuJyksXG4gICAgICAgIGxlbiA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG5cbiAgICB2YXIgZmxhZyA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgaWYgKGFbX2ldICYmICFiW19pXSAmJiBwYXJzZUludChhW19pXSkgPiAwIHx8IHBhcnNlSW50KGFbX2ldKSA+IHBhcnNlSW50KGJbX2ldKSkge1xuICAgICAgICBmbGFnID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKGJbX2ldICYmICFhW19pXSAmJiBwYXJzZUludChiW19pXSkgPiAwIHx8IHBhcnNlSW50KGFbX2ldKSA8IHBhcnNlSW50KGJbX2ldKSkge1xuICAgICAgICBmbGFnID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoYXJyWzFdKSB7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgaWYgKGZsYWcgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc8PSc6XG4gICAgICAgIGlmIChmbGFnICE9PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc+JzpcbiAgICAgICAgaWYgKGZsYWcgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgaWYgKGZsYWcgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvZG9jdW1lbnQud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9lbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lbWl0dGVyICovIDEpO1xuXG52YXIgX2VtaXR0ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW1pdHRlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBET01fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9kb20nO1xudmFyIFZJU0lCTEUgPSAndmlzaWJsZSc7XG52YXIgSElEREVOID0gJ2hpZGRlbic7XG52YXIgVklTSUJJTElUWV9DSEFOR0VfRVZFTlQgPSAndmlzaWJpbGl0eWNoYW5nZSc7XG5cbmZ1bmN0aW9uIGFkZEJvZHlBcHBlYXJMaXN0ZW5lcihkb2N1bWVudCkge1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50KCd2aWV3YXBwZWFyJywgZnVuY3Rpb24gKGUpIHtcbiAgICBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPSBWSVNJQkxFO1xuICAgIGUudHlwZSA9IFZJU0lCSUxJVFlfQ0hBTkdFX0VWRU5UO1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnQoJ3ZpZXdkaXNhcHBlYXInLCBmdW5jdGlvbiAoZSkge1xuICAgIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9IEhJRERFTjtcbiAgICBlLnR5cGUgPSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVDtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQm9keUFwcGVhckxpc3RlbmVyKGRvY3VtZW50KSB7XG4gIGlmIChkb2N1bWVudC5ib2R5KSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudCgndmlld2FwcGVhcicpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnQoJ3ZpZXdkaXNhcHBlYXInKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCkge1xuICAvLyBBZGQgdzNjIGV2ZW50c1xuICB2YXIgZG9jdW1lbnRFbWl0dGVyID0gbmV3IF9lbWl0dGVyMi5kZWZhdWx0KCk7XG4gIHZhciBoYXNWaXNpYmlsaXR5RXZlbnRQZW5kaW5nID0gZmFsc2U7XG5cbiAgLy8gV2VleCBmcmVlemVkIHRoZSBkb2N1bWVudCBtYXliZSB0aHJvdyBlcnJvclxuICB0cnkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgIGFkZEJvZHlBcHBlYXJMaXN0ZW5lcihkb2N1bWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzVmlzaWJpbGl0eUV2ZW50UGVuZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvY3VtZW50RW1pdHRlci5vbih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVCkge1xuICAgICAgICByZW1vdmVCb2R5QXBwZWFyTGlzdGVuZXIoZG9jdW1lbnQpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnRFbWl0dGVyLm9mZih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZG9jdW1lbnRFbWl0dGVyLmVtaXQoZS50eXBlLCBlKTtcbiAgICB9O1xuXG4gICAgLy8gRm9udEZhY2VcbiAgICBkb2N1bWVudC5mb250cyA9IHtcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKGZvbnRGYWNlKSB7XG4gICAgICAgIHZhciBkb21Nb2R1bGUgPSBfX3dlZXhfcmVxdWlyZV9fKERPTV9NT0RVTEUpO1xuICAgICAgICBkb21Nb2R1bGUuYWRkUnVsZSgnZm9udEZhY2UnLCB7XG4gICAgICAgICAgZm9udEZhbWlseTogZm9udEZhY2UuZmFtaWx5LFxuICAgICAgICAgIHNyYzogZm9udEZhY2Uuc291cmNlIC8vIHVybCgndXJpJykgOiBzaW5nbGUgcXVvdGVzIGFyZSByZXF1aXJlZCBhcm91bmQgdXJpLCBhbmQgZG91YmxlIHF1b3RlcyBjYW4gbm90IHdvcmsgaW4gd2VleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdCB2aXNpYmlsaXR5IHN0YXRlXG4gICAgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID0gVklTSUJMRTtcblxuICAgIC8vIEhpamFjayB0aGUgb3JpZ2luIGNyZWF0ZUJvZHlcbiAgICB2YXIgb3JpZ2luQ3JlYXRlQm9keSA9IGRvY3VtZW50LmNyZWF0ZUJvZHk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdjcmVhdGVCb2R5Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgICB2YXIgYm9keSA9IG9yaWdpbkNyZWF0ZUJvZHkuYXBwbHkoZG9jdW1lbnQsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYgKGhhc1Zpc2liaWxpdHlFdmVudFBlbmRpbmcpIHtcbiAgICAgICAgICBhZGRCb2R5QXBwZWFyTGlzdGVuZXIoZG9jdW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib2R5O1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9sb2NhdGlvbi53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE9DQVRJT05fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9sb2NhdGlvbic7XG52YXIgTkFWSUdBVE9SX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvbmF2aWdhdG9yJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoX193ZWV4X3JlcXVpcmVfXywgbG9jYXRpb24pIHtcbiAgbG9jYXRpb24uYXNzaWduID0gZnVuY3Rpb24gKHVybCkge1xuICAgIHZhciB3ZWV4TmF2aWdhdG9yID0gX193ZWV4X3JlcXVpcmVfXyhOQVZJR0FUT1JfTU9EVUxFKTtcbiAgICB3ZWV4TmF2aWdhdG9yLnB1c2goe1xuICAgICAgdXJsOiB1cmwsXG4gICAgICBhbmltYXRlZDogJ3RydWUnXG4gICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9KTtcbiAgfTtcblxuICBsb2NhdGlvbi5yZXBsYWNlID0gZnVuY3Rpb24gKHVybCkge1xuICAgIHZhciB3ZWV4TG9jYXRpb24gPSBfX3dlZXhfcmVxdWlyZV9fKExPQ0FUSU9OX01PRFVMRSk7XG4gICAgd2VleExvY2F0aW9uLnJlcGxhY2UodXJsKTtcbiAgfTtcblxuICBsb2NhdGlvbi5yZWxvYWQgPSBmdW5jdGlvbiAoZm9yY2VSZWxvYWQpIHtcbiAgICB2YXIgd2VleExvY2F0aW9uID0gX193ZWV4X3JlcXVpcmVfXyhMT0NBVElPTl9NT0RVTEUpO1xuICAgIHdlZXhMb2NhdGlvbi5yZWxvYWQoZm9yY2VSZWxvYWQpO1xuICB9O1xuXG4gIHJldHVybiBsb2NhdGlvbjtcbn07XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL2ZldGNoLndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBTVFJFQU1fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9zdHJlYW0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBQcm9taXNlKSB7XG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgfVxuICAgIC8vIEZJWE1FOiBJbiBzcGR5IHRoZSByZXNwb25zZSBoZWFkZXIgaGFzIG5hbWUgbGlrZSBcIjp2ZXJzaW9uXCIgdGhhdCBpcyBpbnZhbGlkXG4gICAgLy8gaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXFxeX2B8fl0vaS50ZXN0KG5hbWUpKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZScpO1xuICAgIC8vIH1cbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICB0aGlzLm9yaWdpbkhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIHRoaXMubWFwID0ge307XG5cbiAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSk7XG4gICAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV07XG4gICAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywnICsgdmFsdWUgOiB2YWx1ZTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbDtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IFtub3JtYWxpemVWYWx1ZSh2YWx1ZSldO1xuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKTtcbiAgICB9XG4gICAgYm9keS5ib2R5VXNlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBCb2R5KCkge1xuICAgIHRoaXMuYm9keVVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24gKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keTtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5O1xuICAgICAgfSBlbHNlIGlmICghYm9keSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBCb2R5SW5pdCB0eXBlJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpO1xuICAgICAgcmV0dXJuIHJlamVjdGVkID8gcmVqZWN0ZWQgOiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpO1xuICAgIH07XG5cbiAgICB0aGlzLmpzb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbiAgdmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ107XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICAgIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keTtcbiAgICBpZiAoUmVxdWVzdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihpbnB1dCkpIHtcbiAgICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXJsID0gaW5wdXQudXJsO1xuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycyk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdDtcbiAgICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVybCA9IGlucHV0O1xuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ29taXQnO1xuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpO1xuICAgIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbDtcbiAgICB0aGlzLnJlZmVycmVyID0gbnVsbDtcblxuICAgIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJyk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRCb2R5KGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGhlYWRlcnMoeGhyKSB7XG4gICAgdmFyIGhlYWQgPSBuZXcgSGVhZGVycygpO1xuICAgIHZhciBwYWlycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIHBhaXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgdmFyIHNwbGl0ID0gaGVhZGVyLnRyaW0oKS5zcGxpdCgnOicpO1xuICAgICAgdmFyIGtleSA9IHNwbGl0LnNoaWZ0KCkudHJpbSgpO1xuICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignOicpLnRyaW0oKTtcbiAgICAgIGhlYWQuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBoZWFkO1xuICB9XG5cbiAgQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKTtcblxuICBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0JztcbiAgICB0aGlzLnN0YXR1cyA9ICdzdGF0dXMnIGluIG9wdGlvbnMgPyBvcHRpb25zLnN0YXR1cyA6IDIwMDtcbiAgICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJztcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJyc7XG4gICAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbiAgUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH0pO1xuICB9O1xuXG4gIFJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogMCwgc3RhdHVzVGV4dDogJycgfSk7XG4gICAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcic7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9O1xuXG4gIHZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XTtcblxuICBSZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uICh1cmwsIHN0YXR1cykge1xuICAgIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7IGxvY2F0aW9uOiB1cmwgfSB9KTtcbiAgfTtcblxuICB2YXIgZmV0Y2ggPSBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVxdWVzdDtcbiAgICAgIGlmIChSZXF1ZXN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGlucHV0KSAmJiAhaW5pdCkge1xuICAgICAgICByZXF1ZXN0ID0gaW5wdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgJiYgcmVxdWVzdC5oZWFkZXJzLm9yaWdpbkhlYWRlcnNcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHBhcmFtcy5ib2R5ID0gcmVxdWVzdC5fYm9keUluaXQ7XG4gICAgICB9XG5cbiAgICAgIHBhcmFtcy50eXBlID0gaW5pdCAmJiBpbml0LmRhdGFUeXBlID8gaW5pdC5kYXRhVHlwZSA6ICd0ZXh0JztcblxuICAgICAgdmFyIG5hdGl2ZUZldGNoID0gX193ZWV4X3JlcXVpcmVfXyhTVFJFQU1fTU9EVUxFKS5mZXRjaDtcbiAgICAgIG5hdGl2ZUZldGNoKHBhcmFtcywgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiAocmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG4gICAgICAgICAgdmFyIGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ3N0cmluZycgPyByZXNwb25zZS5kYXRhIDogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YSk7XG5cbiAgICAgICAgICB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKGRhdGEsIHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKHByb2dyZXNzKSB7fSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBmZXRjaDogZmV0Y2gsXG4gICAgSGVhZGVyczogSGVhZGVycyxcbiAgICBSZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIFJlc3BvbnNlOiBSZXNwb25zZVxuICB9O1xufTtcblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMveG1saHR0cHJlcXVlc3Qud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgU1RSRUFNX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvc3RyZWFtJztcbnZhciBldmVudFRhcmdldCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGV2ZW50LXRhcmdldC1zaGltICovIDIpO1xuXG52YXIgVU5TRU5UID0gMDtcbnZhciBPUEVORUQgPSAxO1xudmFyIEhFQURFUlNfUkVDRUlWRUQgPSAyO1xudmFyIExPQURJTkcgPSAzO1xudmFyIERPTkUgPSA0O1xuXG52YXIgWEhSX0VWRU5UUyA9IFsnYWJvcnQnLCAnZXJyb3InLCAnbG9hZCcsICdsb2Fkc3RhcnQnLCAncHJvZ3Jlc3MnLCAndGltZW91dCcsICdsb2FkZW5kJywgJ3JlYWR5c3RhdGVjaGFuZ2UnXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoX193ZWV4X3JlcXVpcmVfXykge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICB2YXIgWE1MSHR0cFJlcXVlc3QgPSAoX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX2V2ZW50VGFyZ2V0KSB7XG4gICAgX2luaGVyaXRzKFhNTEh0dHBSZXF1ZXN0LCBfZXZlbnRUYXJnZXQpO1xuXG4gICAgLy8gRXZlbnRUYXJnZXQgYXV0b21hdGljYWxseSBpbml0aWFsaXplcyB0aGVzZSB0byBgbnVsbGAuXG4gICAgZnVuY3Rpb24gWE1MSHR0cFJlcXVlc3QoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWE1MSHR0cFJlcXVlc3QpO1xuXG4gICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoWE1MSHR0cFJlcXVlc3QuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihYTUxIdHRwUmVxdWVzdCkpLmNhbGwodGhpcykpO1xuXG4gICAgICBfdGhpcy5VTlNFTlQgPSBVTlNFTlQ7XG4gICAgICBfdGhpcy5PUEVORUQgPSBPUEVORUQ7XG4gICAgICBfdGhpcy5IRUFERVJTX1JFQ0VJVkVEID0gSEVBREVSU19SRUNFSVZFRDtcbiAgICAgIF90aGlzLkxPQURJTkcgPSBMT0FESU5HO1xuICAgICAgX3RoaXMuRE9ORSA9IERPTkU7XG4gICAgICBfdGhpcy5yZWFkeVN0YXRlID0gVU5TRU5UO1xuICAgICAgX3RoaXMuc3RhdHVzID0gMDtcbiAgICAgIF90aGlzLnN0YXR1c1RleHQgPSAnJztcbiAgICAgIF90aGlzLnRpbWVvdXQgPSAwO1xuICAgICAgX3RoaXMuX2Fib3J0ZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzLl9oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgX3RoaXMuX21ldGhvZCA9IG51bGw7XG4gICAgICBfdGhpcy5fcmVzcG9uc2UgPSAnJztcbiAgICAgIF90aGlzLl91cmwgPSBudWxsO1xuICAgICAgX3RoaXMuX3RpbWVkT3V0ID0gZmFsc2U7XG5cbiAgICAgIF90aGlzLl9yZXNldCgpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhYTUxIdHRwUmVxdWVzdCwgW3tcbiAgICAgIGtleTogJ19yZXNldCcsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc2V0KCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLlVOU0VOVDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gMDtcblxuICAgICAgICB0aGlzLl9oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9oZWFkZXJzID0ge307XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlID0gJyc7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9ICcnO1xuICAgICAgICB0aGlzLl9zZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xvd2VyQ2FzZVJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX3RpbWVkT3V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHJldHVybiBudWxsIGlmIG5vIHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhlYWRlcnMpLm1hcChmdW5jdGlvbiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJldHVybiBoZWFkZXJOYW1lICsgJzogJyArIGhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgIH0pLmpvaW4oJ1xcclxcbicpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2dldFJlc3BvbnNlSGVhZGVyJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fbG93ZXJDYXNlUmVzcG9uc2VIZWFkZXJzW2hlYWRlci50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnc2V0UmVxdWVzdEhlYWRlcicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgIT09IHRoaXMuT1BFTkVEKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0IGhhcyBub3QgYmVlbiBvcGVuZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkZXJzW2hlYWRlci50b0xvd2VyQ2FzZSgpXSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnb3BlbicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbihtZXRob2QsIHVybCwgYXN5bmMpIHtcbiAgICAgICAgLyogT3RoZXIgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCAqL1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSB0aGlzLlVOU0VOVCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG9wZW4sIGFscmVhZHkgc2VuZGluZycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc3luYyAhPT0gdW5kZWZpbmVkICYmICFhc3luYykge1xuICAgICAgICAgIC8vIGFzeW5jIGlzIGRlZmF1bHRcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIGh0dHAgcmVxdWVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgYW4gZW1wdHkgdXJsJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFJlYWR5U3RhdGUodGhpcy5PUEVORUQpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3NlbmQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSB0aGlzLk9QRU5FRCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdCBoYXMgbm90IGJlZW4gb3BlbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBzZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VudCA9IHRydWU7XG5cbiAgICAgICAgdmFyIG5hdGl2ZUZldGNoID0gX193ZWV4X3JlcXVpcmVfXyhTVFJFQU1fTU9EVUxFKS5mZXRjaDtcblxuICAgICAgICBuYXRpdmVGZXRjaCh7XG4gICAgICAgICAgbWV0aG9kOiB0aGlzLl9tZXRob2QsXG4gICAgICAgICAgdXJsOiB0aGlzLl91cmwsXG4gICAgICAgICAgaGVhZGVyczogdGhpcy5faGVhZGVycyxcbiAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICAgIHR5cGU6ICd0ZXh0J1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiAocmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG5cbiAgICAgICAgICAgIF90aGlzMi5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICBfdGhpczIuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICBfdGhpczIuc2V0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgX3RoaXMyLl9yZXNwb25zZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoX3RoaXMyLl9yZXNwb25zZVR5cGUgPT09ICcnIHx8IF90aGlzMi5fcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIuX3Jlc3BvbnNlID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfdGhpczIuX2hhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cbiAgICAgICAgICBfdGhpczIuc2V0UmVhZHlTdGF0ZShfdGhpczIuRE9ORSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChwcm9ncmVzcykge1xuICAgICAgICAgIF90aGlzMi5zdGF0dXMgPSBwcm9ncmVzcy5zdGF0dXM7XG4gICAgICAgICAgX3RoaXMyLnN0YXR1c1RleHQgPSBwcm9ncmVzcy5zdGF0dXNUZXh0O1xuICAgICAgICAgIF90aGlzMi5zZXRSZXNwb25zZUhlYWRlcnMocHJvZ3Jlc3MuaGVhZGVycyk7XG4gICAgICAgICAgX3RoaXMyLnNldFJlYWR5U3RhdGUocHJvZ3Jlc3MucmVhZHlTdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2Fib3J0JyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gVE9ETzogV2VleCBuYXRpdmUgbm90IHN1cHBvcnQgYWJvcnQgbm93XG5cbiAgICAgICAgLy8gb25seSBjYWxsIG9ucmVhZHlzdGF0ZWNoYW5nZSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gYWJvcnQsXG4gICAgICAgIC8vIGJlbG93IGxvZ2ljIGlzIHBlciBzcGVjXG4gICAgICAgIGlmICghKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5VTlNFTlQgfHwgdGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLk9QRU5FRCAmJiAhdGhpcy5fc2VudCB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkpIHtcbiAgICAgICAgICB0aGlzLl9yZXNldCgpO1xuICAgICAgICAgIHRoaXMuc2V0UmVhZHlTdGF0ZSh0aGlzLkRPTkUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGFnYWluIGFmdGVyLCBpbiBjYXNlIG1vZGlmaWVkIGluIGhhbmRsZXJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdzZXRSZXNwb25zZUhlYWRlcnMnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbDtcbiAgICAgICAgdmFyIGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwge307XG4gICAgICAgIHRoaXMuX2xvd2VyQ2FzZVJlc3BvbnNlSGVhZGVycyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLnJlZHVjZShmdW5jdGlvbiAobGNhc2VIZWFkZXJzLCBoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgbGNhc2VIZWFkZXJzW2hlYWRlck5hbWUudG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgICAgICAgIHJldHVybiBsY2FzZUhlYWRlcnM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdzZXRSZWFkeVN0YXRlJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZWFkeVN0YXRlKG5ld1N0YXRlKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiAncmVhZHlzdGF0ZWNoYW5nZScgfSk7XG4gICAgICAgIGlmIChuZXdTdGF0ZSA9PT0gdGhpcy5ET05FKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdhYm9ydCcgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVkT3V0KSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICd0aW1lb3V0JyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdsb2FkJyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHsgdHlwZTogJ2xvYWRlbmQnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAncmVzcG9uc2VUeXBlJyxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5fc2VudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNldCB0aGUgXFwncmVzcG9uc2VUeXBlXFwnIHByb3BlcnR5IG9uIFxcJ1hNTEh0dHBSZXF1ZXN0XFwnOiBUaGUgJyArICdyZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc2VudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdyZXNwb25zZVRleHQnLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXNwb25zZVR5cGUgIT09ICcnICYmIHRoaXMuX3Jlc3BvbnNlVHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGlzIG9ubHkgYXZhaWxhYmxlIGlmICdyZXNwb25zZVR5cGUnIFwiICsgKCdpcyBzZXQgdG8gXFwnXFwnIG9yIFxcJ3RleHRcXCcsIGJ1dCBpdCBpcyBcXCcnICsgdGhpcy5fcmVzcG9uc2VUeXBlICsgJ1xcJy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA8IExPQURJTkcpIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3Jlc3BvbnNlJyxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB2YXIgcmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkeVN0YXRlIDwgTE9BRElORyB8fCB0aGlzLl9oYXNFcnJvciA/ICcnIDogdGhpcy5fcmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBET05FKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gWE1MSHR0cFJlcXVlc3Q7XG4gIH0oZXZlbnRUYXJnZXQuYXBwbHkodW5kZWZpbmVkLCBYSFJfRVZFTlRTKSksIF9jbGFzcy5VTlNFTlQgPSBVTlNFTlQsIF9jbGFzcy5PUEVORUQgPSBPUEVORUQsIF9jbGFzcy5IRUFERVJTX1JFQ0VJVkVEID0gSEVBREVSU19SRUNFSVZFRCwgX2NsYXNzLkxPQURJTkcgPSBMT0FESU5HLCBfY2xhc3MuRE9ORSA9IERPTkUsIF90ZW1wKTtcblxuXG4gIHJldHVybiBYTUxIdHRwUmVxdWVzdDtcbn07XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL25vZGVfbW9kdWxlcy9ldmVudC10YXJnZXQtc2hpbS9saWIvY3VzdG9tLWV2ZW50LXRhcmdldC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXF1aXJlbWVudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIENvbW1vbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2NvbW1vbnMgKi8gMClcbnZhciBMSVNURU5FUlMgPSBDb21tb25zLkxJU1RFTkVSU1xudmFyIEFUVFJJQlVURSA9IENvbW1vbnMuQVRUUklCVVRFXG52YXIgbmV3Tm9kZSA9IENvbW1vbnMubmV3Tm9kZVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogR2V0cyBhIHNwZWNpZmllZCBhdHRyaWJ1dGUgbGlzdGVuZXIgZnJvbSBhIGdpdmVuIEV2ZW50VGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIEFuIEV2ZW50VGFyZ2V0IG9iamVjdCB0byBnZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEFuIGV2ZW50IHR5cGUgdG8gZ2V0LlxuICogQHJldHVybnMge2Z1bmN0aW9ufG51bGx9IFRoZSBmb3VuZCBhdHRyaWJ1dGUgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZUxpc3RlbmVyKGV2ZW50VGFyZ2V0LCB0eXBlKSB7XG4gICAgdmFyIG5vZGUgPSBldmVudFRhcmdldFtMSVNURU5FUlNdW3R5cGVdXG4gICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5raW5kID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmxpc3RlbmVyXG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFNldHMgYSBzcGVjaWZpZWQgYXR0cmlidXRlIGxpc3RlbmVyIHRvIGEgZ2l2ZW4gRXZlbnRUYXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IC0gQW4gRXZlbnRUYXJnZXQgb2JqZWN0IHRvIHNldC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gQW4gZXZlbnQgdHlwZSB0byBzZXQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufG51bGx9IGxpc3RlbmVyIC0gQSBsaXN0ZW5lciB0byBiZSBzZXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlTGlzdGVuZXIoZXZlbnRUYXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICBsaXN0ZW5lciA9IG51bGwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIH1cblxuICAgIHZhciBwcmV2ID0gbnVsbFxuICAgIHZhciBub2RlID0gZXZlbnRUYXJnZXRbTElTVEVORVJTXVt0eXBlXVxuICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgb2xkIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV2ZW50VGFyZ2V0W0xJU1RFTkVSU11bdHlwZV0gPSBub2RlLm5leHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldiA9IG5vZGVcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLm5leHRcbiAgICB9XG5cbiAgICAvLyBBZGQgbmV3IHZhbHVlLlxuICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChwcmV2ID09IG51bGwpIHtcbiAgICAgICAgICAgIGV2ZW50VGFyZ2V0W0xJU1RFTkVSU11bdHlwZV0gPSBuZXdOb2RlKGxpc3RlbmVyLCBBVFRSSUJVVEUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlKGxpc3RlbmVyLCBBVFRSSUJVVEUpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBJbnRlcmZhY2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIGBFdmVudFRhcmdldGAgaW1wbGVtZW50YXRpb24gd2hpY2ggaGFzIGBvbmZvb2JhcmAgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBFdmVudFRhcmdldEJhc2UgLSBBIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgRXZlbnRUYXJnZXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0eXBlcyAtIEEgbGlzdCBvZiBldmVudCB0eXBlcyB3aGljaCBhcmUgZGVmaW5lZCBhcyBhdHRyaWJ1dGUgbGlzdGVuZXJzLlxuICogQHJldHVybnMge0V2ZW50VGFyZ2V0fSBUaGUgZGVmaW5lZCBgRXZlbnRUYXJnZXRgIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhcyBhdHRyaWJ1dGUgbGlzdGVuZXJzLlxuICovXG5tb2R1bGUuZXhwb3J0cy5kZWZpbmVDdXN0b21FdmVudFRhcmdldCA9IGZ1bmN0aW9uKEV2ZW50VGFyZ2V0QmFzZSwgdHlwZXMpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgY3VzdG9tIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBFdmVudFRhcmdldCgpIHtcbiAgICAgICAgRXZlbnRUYXJnZXRCYXNlLmNhbGwodGhpcylcbiAgICB9XG5cbiAgICB2YXIgZGVzY3JpcHRlciA9IHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH1cblxuICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24odHlwZSkge1xuICAgICAgICBkZXNjcmlwdGVyW1wib25cIiArIHR5cGVdID0ge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlTGlzdGVuZXIodGhpcywgdHlwZSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBFdmVudFRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50VGFyZ2V0QmFzZS5wcm90b3R5cGUsIGRlc2NyaXB0ZXIpXG5cbiAgICByZXR1cm4gRXZlbnRUYXJnZXRcbn1cblxuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vbGliL2V2ZW50LXdyYXBwZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYVxuICogQGNvcHlyaWdodCAyMDE1IFRvcnUgTmFnYXNoaW1hLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGRpcmVjdG9yeSBmb3IgZnVsbCBsaWNlbnNlLlxuICovXG5cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVxdWlyZW1lbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBjcmVhdGVVbmlxdWVLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2NvbW1vbnMgKi8gMCkuY3JlYXRlVW5pcXVlS2V5XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0c250c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBrZXkgb2YgdGhlIGZsYWcgd2hpY2ggaXMgdHVybmVkIG9uIGJ5IGBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25gIG1ldGhvZC5cbiAqXG4gKiBAdHlwZSB7c3ltYm9sfHN0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHID1cbiAgICBjcmVhdGVVbmlxdWVLZXkoXCJzdG9wX2ltbWVkaWF0ZV9wcm9wYWdhdGlvbl9mbGFnXCIpXG5cbi8qKlxuICogVGhlIGtleSBvZiB0aGUgZmxhZyB3aGljaCBpcyB0dXJuZWQgb24gYnkgYHByZXZlbnREZWZhdWx0YCBtZXRob2QuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgQ0FOQ0VMRURfRkxBRyA9IGNyZWF0ZVVuaXF1ZUtleShcImNhbmNlbGVkX2ZsYWdcIilcblxuLyoqXG4gKiBUaGUga2V5IG9mIHRoZSBmbGFnIHRoYXQgaXQgY2Fubm90IHVzZSBgcHJldmVudERlZmF1bHRgIG1ldGhvZC5cbiAqXG4gKiBAdHlwZSB7c3ltYm9sfHN0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBQQVNTSVZFX0xJU1RFTkVSX0ZMQUcgPSBjcmVhdGVVbmlxdWVLZXkoXCJwYXNzaXZlX2xpc3RlbmVyX2ZsYWdcIilcblxuLyoqXG4gKiBUaGUga2V5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgT1JJR0lOQUxfRVZFTlQgPSBjcmVhdGVVbmlxdWVLZXkoXCJvcmlnaW5hbF9ldmVudFwiKVxuXG4vKipcbiAqIE1ldGhvZCBkZWZpbml0aW9ucyBmb3IgdGhlIGV2ZW50IHdyYXBwZXIuXG4gKlxuICogQHR5cGUge29iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cbnZhciB3cmFwcGVyUHJvdG90eXBlRGVmaW5pdGlvbiA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0b3BQcm9wYWdhdGlvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IHRoaXNbT1JJR0lOQUxfRVZFTlRdXG4gICAgICAgICAgICBpZiAodHlwZW9mIGUuc3RvcFByb3BhZ2F0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSksXG5cbiAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IE9iamVjdC5mcmVlemUoe1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgICAgdGhpc1tTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXSA9IHRydWVcblxuICAgICAgICAgICAgdmFyIGUgPSB0aGlzW09SSUdJTkFMX0VWRU5UXVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pLFxuXG4gICAgcHJldmVudERlZmF1bHQ6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgICAgICBpZiAodGhpc1tQQVNTSVZFX0xJU1RFTkVSX0ZMQUddKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5jZWxhYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tDQU5DRUxFRF9GTEFHXSA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGUgPSB0aGlzW09SSUdJTkFMX0VWRU5UXVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnByZXZlbnREZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGRlZmF1bHRQcmV2ZW50ZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tDQU5DRUxFRF9GTEFHXVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSksXG59KVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgSW50ZXJmYWNlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzLlNUT1BfSU1NRURJQVRFX1BST1BBR0FUSU9OX0ZMQUcgPSBTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXG5tb2R1bGUuZXhwb3J0cy5QQVNTSVZFX0xJU1RFTkVSX0ZMQUcgPSBQQVNTSVZFX0xJU1RFTkVSX0ZMQUdcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGV2ZW50IHdyYXBwZXIuXG4gKlxuICogV2UgY2Fubm90IG1vZGlmeSBzZXZlcmFsIHByb3BlcnRpZXMgb2YgYEV2ZW50YCBvYmplY3QsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSB3cmFwcGVyLlxuICogUGx1cywgdGhpcyB3cmFwcGVyIHN1cHBvcnRzIG5vbiBgRXZlbnRgIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtFdmVudHx7dHlwZTogc3RyaW5nfX0gZXZlbnQgLSBBbiBvcmlnaW5hbCBldmVudCB0byBjcmVhdGUgdGhlIHdyYXBwZXIuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIFRoZSBldmVudCB0YXJnZXQgb2YgdGhlIGV2ZW50LlxuICogQHJldHVybnMge0V2ZW50fSBUaGUgY3JlYXRlZCB3cmFwcGVyLiBUaGlzIG9iamVjdCBpcyBpbXBsZW1lbnRlZCBgRXZlbnRgIGludGVyZmFjZS5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZUV2ZW50V3JhcHBlciA9IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50V3JhcHBlcihldmVudCwgZXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgdGltZVN0YW1wID0gKFxuICAgICAgICB0eXBlb2YgZXZlbnQudGltZVN0YW1wID09PSBcIm51bWJlclwiID8gZXZlbnQudGltZVN0YW1wIDogRGF0ZS5ub3coKVxuICAgIClcbiAgICB2YXIgcHJvcGVydHlEZWZpbml0aW9uID0ge1xuICAgICAgICB0eXBlOiB7dmFsdWU6IGV2ZW50LnR5cGUsIGVudW1lcmFibGU6IHRydWV9LFxuICAgICAgICB0YXJnZXQ6IHt2YWx1ZTogZXZlbnRUYXJnZXQsIGVudW1lcmFibGU6IHRydWV9LFxuICAgICAgICBjdXJyZW50VGFyZ2V0OiB7dmFsdWU6IGV2ZW50VGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgZXZlbnRQaGFzZToge3ZhbHVlOiAyLCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgYnViYmxlczoge3ZhbHVlOiBCb29sZWFuKGV2ZW50LmJ1YmJsZXMpLCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgY2FuY2VsYWJsZToge3ZhbHVlOiBCb29sZWFuKGV2ZW50LmNhbmNlbGFibGUpLCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgdGltZVN0YW1wOiB7dmFsdWU6IHRpbWVTdGFtcCwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgICAgIGlzVHJ1c3RlZDoge3ZhbHVlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgfVxuICAgIHByb3BlcnR5RGVmaW5pdGlvbltTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXSA9IHt2YWx1ZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlfVxuICAgIHByb3BlcnR5RGVmaW5pdGlvbltDQU5DRUxFRF9GTEFHXSA9IHt2YWx1ZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlfVxuICAgIHByb3BlcnR5RGVmaW5pdGlvbltQQVNTSVZFX0xJU1RFTkVSX0ZMQUddID0ge3ZhbHVlOiBmYWxzZSwgd3JpdGFibGU6IHRydWV9XG4gICAgcHJvcGVydHlEZWZpbml0aW9uW09SSUdJTkFMX0VWRU5UXSA9IHt2YWx1ZTogZXZlbnR9XG5cbiAgICAvLyBGb3IgQ3VzdG9tRXZlbnQuXG4gICAgaWYgKHR5cGVvZiBldmVudC5kZXRhaWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcHJvcGVydHlEZWZpbml0aW9uLmRldGFpbCA9IHt2YWx1ZTogZXZlbnQuZGV0YWlsLCBlbnVtZXJhYmxlOiB0cnVlfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgICAgICBPYmplY3QuY3JlYXRlKGV2ZW50LCB3cmFwcGVyUHJvdG90eXBlRGVmaW5pdGlvbiksXG4gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvblxuICAgIClcbn1cblxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvd2Vic29ja2V0LndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBldmVudFRhcmdldCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGV2ZW50LXRhcmdldC1zaGltICovIDIpO1xuXG52YXIgV0VCX1NPQ0tFVF9NT0RVTEUgPSAnQHdlZXgtbW9kdWxlL3dlYlNvY2tldCc7XG5cbnZhciBDT05ORUNUSU5HID0gMDtcbnZhciBPUEVOID0gMTtcbnZhciBDTE9TSU5HID0gMjtcbnZhciBDTE9TRUQgPSAzO1xuXG52YXIgQ0xPU0VfTk9STUFMID0gMTAwMDtcblxudmFyIFdFQlNPQ0tFVF9FVkVOVFMgPSBbJ2Nsb3NlJywgJ2Vycm9yJywgJ21lc3NhZ2UnLCAnb3BlbiddO1xuXG4vKipcbiAqIEV2ZW50IG9iamVjdCBwYXNzZWQgdG8gdGhlIGBvbm9wZW5gLCBgb25jbG9zZWAsIGBvbm1lc3NhZ2VgLCBgb25lcnJvcmBcbiAqIGNhbGxiYWNrcyBvZiBgV2ViU29ja2V0YC5cbiAqXG4gKiBUaGUgYHR5cGVgIHByb3BlcnR5IGlzIFwib3BlblwiLCBcImNsb3NlXCIsIFwibWVzc2FnZVwiLCBcImVycm9yXCIgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEluIGNhc2Ugb2YgXCJtZXNzYWdlXCIsIHRoZSBgZGF0YWAgcHJvcGVydHkgY29udGFpbnMgdGhlIGluY29taW5nIGRhdGEuXG4gKi9cblxudmFyIFdlYlNvY2tldEV2ZW50ID0gZnVuY3Rpb24gV2ViU29ja2V0RXZlbnQodHlwZSwgZXZlbnRJbml0RGljdCkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViU29ja2V0RXZlbnQpO1xuXG4gIHRoaXMudHlwZSA9IHR5cGUudG9TdHJpbmcoKTtcbiAgT2JqZWN0LmFzc2lnbih0aGlzLCBldmVudEluaXREaWN0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF9fd2VleF9yZXF1aXJlX18pIHtcbiAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgLyoqXG4gICAqIEJyb3dzZXItY29tcGF0aWJsZSBXZWJTb2NrZXRzIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldFxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3NcbiAgICovXG4gIHZhciBXZWJTb2NrZXQgPSAoX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX2V2ZW50VGFyZ2V0KSB7XG4gICAgX2luaGVyaXRzKFdlYlNvY2tldCwgX2V2ZW50VGFyZ2V0KTtcblxuICAgIGZ1bmN0aW9uIFdlYlNvY2tldCh1cmwsIHByb3RvY29scykge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdlYlNvY2tldCk7XG5cbiAgICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChXZWJTb2NrZXQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihXZWJTb2NrZXQpKS5jYWxsKHRoaXMpKTtcblxuICAgICAgdmFyIHdlYnNvY2tldCA9IF9fd2VleF9yZXF1aXJlX18oV0VCX1NPQ0tFVF9NT0RVTEUpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIHdlYnNvY2tldC5XZWJTb2NrZXQodXJsLCBwcm90b2NvbHMpO1xuICAgICAgX3RoaXMucmVhZHlTdGF0ZSA9IENPTk5FQ1RJTkc7XG4gICAgICBfdGhpcy53ZWJzb2NrZXQgPSB3ZWJzb2NrZXQ7XG5cbiAgICAgIHdlYnNvY2tldC5vbm1lc3NhZ2UoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQobmV3IFdlYlNvY2tldEV2ZW50KCdtZXNzYWdlJywgZXYpKTtcbiAgICAgIH0pO1xuXG4gICAgICB3ZWJzb2NrZXQub25vcGVuKGZ1bmN0aW9uIChldikge1xuICAgICAgICBfdGhpcy5yZWFkeVN0YXRlID0gT1BFTjtcbiAgICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgV2ViU29ja2V0RXZlbnQoJ29wZW4nKSk7XG4gICAgICB9KTtcblxuICAgICAgd2Vic29ja2V0Lm9uY2xvc2UoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIF90aGlzLnJlYWR5U3RhdGUgPSBDTE9TRUQ7XG4gICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQobmV3IFdlYlNvY2tldEV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgICBjb2RlOiBldi5jb2RlLFxuICAgICAgICAgIHJlYXNvbjogZXYucmVhc29uXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICB3ZWJzb2NrZXQub25lcnJvcihmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgV2ViU29ja2V0RXZlbnQoJ2Vycm9yJywgZXYpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhXZWJTb2NrZXQsIFt7XG4gICAgICBrZXk6ICdjbG9zZScsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IENMT1NJTkcgfHwgdGhpcy5yZWFkeVN0YXRlID09PSBDTE9TRUQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBDTE9TSU5HO1xuICAgICAgICB0aGlzLndlYnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3NlbmQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGEgdHlwZScpO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBXZWJTb2NrZXQ7XG4gIH0oZXZlbnRUYXJnZXQoV0VCU09DS0VUX0VWRU5UUykpLCBfY2xhc3MuQ09OTkVDVElORyA9IENPTk5FQ1RJTkcsIF9jbGFzcy5PUEVOID0gT1BFTiwgX2NsYXNzLkNMT1NJTkcgPSBDTE9TSU5HLCBfY2xhc3MuQ0xPU0VEID0gQ0xPU0VELCBfdGVtcCk7XG5cblxuICByZXR1cm4gV2ViU29ja2V0O1xufTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvdGltZXIud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIFRJTUVSX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvdGltZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCkge1xuICB2YXIgc2V0VGltZW91dCA9IGZ1bmN0aW9uIHNldFRpbWVvdXQoaGFuZGxlciwgdGltZSkge1xuICAgIHZhciB0aW1lciA9IF9fd2VleF9yZXF1aXJlX18oVElNRVJfTU9EVUxFKTtcbiAgICB0aW1lci5zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWUpO1xuICAgIHJldHVybiBkb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpO1xuICB9O1xuXG4gIHZhciBzZXRJbnRlcnZhbCA9IGZ1bmN0aW9uIHNldEludGVydmFsKGhhbmRsZXIsIHRpbWUpIHtcbiAgICB2YXIgdGltZXIgPSBfX3dlZXhfcmVxdWlyZV9fKFRJTUVSX01PRFVMRSk7XG4gICAgdGltZXIuc2V0SW50ZXJ2YWwoaGFuZGxlciwgdGltZSk7XG4gICAgcmV0dXJuIGRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCk7XG4gIH07XG5cbiAgdmFyIGNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIGNsZWFyVGltZW91dChuKSB7XG4gICAgdmFyIHRpbWVyID0gX193ZWV4X3JlcXVpcmVfXyhUSU1FUl9NT0RVTEUpO1xuICAgIHRpbWVyLmNsZWFyVGltZW91dChuKTtcbiAgfTtcblxuICB2YXIgY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uIGNsZWFySW50ZXJ2YWwobikge1xuICAgIHZhciB0aW1lciA9IF9fd2VleF9yZXF1aXJlX18oVElNRVJfTU9EVUxFKTtcbiAgICB0aW1lci5jbGVhckludGVydmFsKG4pO1xuICB9O1xuXG4gIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spIHtcbiAgICB2YXIgdGltZXIgPSBfX3dlZXhfcmVxdWlyZV9fKFRJTUVSX01PRFVMRSk7XG4gICAgcmV0dXJuIHRpbWVyLnNldFRpbWVvdXQoY2FsbGJhY2ssIDE2KTtcbiAgfTtcblxuICB2YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiBjYW5jZWxBbmltYXRpb25GcmFtZShuKSB7XG4gICAgdmFyIHRpbWVyID0gX193ZWV4X3JlcXVpcmVfXyhUSU1FUl9NT0RVTEUpO1xuICAgIHRpbWVyLmNsZWFyVGltZW91dChuKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsXG4gICAgY2xlYXJUaW1lb3V0OiBjbGVhclRpbWVvdXQsXG4gICAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsLFxuICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsXG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWU6IGNhbmNlbEFuaW1hdGlvbkZyYW1lXG4gIH07XG59O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvYmFzZTY0LndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGJhc2U2NCA9IHt9O1xuICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuXG4gIC8vIGVuY29kZXJcbiAgLy8gW2h0dHBzOi8vZ2lzdC5naXRodWIuY29tLzk5OTE2Nl0gYnkgW2h0dHBzOi8vZ2l0aHViLmNvbS9uaWduYWddXG4gIGJhc2U2NC5idG9hID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHN0ciA9IFN0cmluZyhpbnB1dCk7XG4gICAgZm9yIChcbiAgICAvLyBpbml0aWFsaXplIHJlc3VsdCBhbmQgY291bnRlclxuICAgIHZhciBibG9jaywgY2hhckNvZGUsIGlkeCA9IDAsIG1hcCA9IGNoYXJzLCBvdXRwdXQgPSAnJztcbiAgICAvLyBpZiB0aGUgbmV4dCBzdHIgaW5kZXggZG9lcyBub3QgZXhpc3Q6XG4gICAgLy8gICBjaGFuZ2UgdGhlIG1hcHBpbmcgdGFibGUgdG8gXCI9XCJcbiAgICAvLyAgIGNoZWNrIGlmIGQgaGFzIG5vIGZyYWN0aW9uYWwgZGlnaXRzXG4gICAgc3RyLmNoYXJBdChpZHggfCAwKSB8fCAobWFwID0gJz0nLCBpZHggJSAxKTtcbiAgICAvLyBcIjggLSBpZHggJSAxICogOFwiIGdlbmVyYXRlcyB0aGUgc2VxdWVuY2UgMiwgNCwgNiwgOFxuICAgIG91dHB1dCArPSBtYXAuY2hhckF0KDYzICYgYmxvY2sgPj4gOCAtIGlkeCAlIDEgKiA4KSkge1xuICAgICAgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpZHggKz0gMyAvIDQpO1xuICAgICAgaWYgKGNoYXJDb2RlID4gMHhGRikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCInYnRvYScgZmFpbGVkOiBUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQgY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIG9mIHRoZSBMYXRpbjEgcmFuZ2UuXCIpO1xuICAgICAgfVxuICAgICAgYmxvY2sgPSBibG9jayA8PCA4IHwgY2hhckNvZGU7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgLy8gZGVjb2RlclxuICAvLyBbaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMTAyMDM5Nl0gYnkgW2h0dHBzOi8vZ2l0aHViLmNvbS9hdGtdXG4gIGJhc2U2NC5hdG9iID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHN0ciA9IFN0cmluZyhpbnB1dCkucmVwbGFjZSgvPSskLywgJycpO1xuICAgIGlmIChzdHIubGVuZ3RoICUgNCA9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXRvYicgZmFpbGVkOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLlwiKTtcbiAgICB9XG4gICAgZm9yIChcbiAgICAvLyBpbml0aWFsaXplIHJlc3VsdCBhbmQgY291bnRlcnNcbiAgICB2YXIgYmMgPSAwLCBicywgYnVmZmVyLCBpZHggPSAwLCBvdXRwdXQgPSAnJztcbiAgICAvLyBnZXQgbmV4dCBjaGFyYWN0ZXJcbiAgICBidWZmZXIgPSBzdHIuY2hhckF0KGlkeCsrKTtcbiAgICAvLyBjaGFyYWN0ZXIgZm91bmQgaW4gdGFibGU/IGluaXRpYWxpemUgYml0IHN0b3JhZ2UgYW5kIGFkZCBpdHMgYXNjaWkgdmFsdWU7XG4gICAgfmJ1ZmZlciAmJiAoYnMgPSBiYyAlIDQgPyBicyAqIDY0ICsgYnVmZmVyIDogYnVmZmVyLFxuICAgIC8vIGFuZCBpZiBub3QgZmlyc3Qgb2YgZWFjaCA0IGNoYXJhY3RlcnMsXG4gICAgLy8gY29udmVydCB0aGUgZmlyc3QgOCBiaXRzIHRvIG9uZSBhc2NpaSBjaGFyYWN0ZXJcbiAgICBiYysrICUgNCkgPyBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUgJiBicyA+PiAoLTIgKiBiYyAmIDYpKSA6IDApIHtcbiAgICAgIC8vIHRyeSB0byBmaW5kIGNoYXJhY3RlciBpbiB0YWJsZSAoMC02Mywgbm90IGZvdW5kID0+IC0xKVxuICAgICAgYnVmZmVyID0gY2hhcnMuaW5kZXhPZihidWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIHJldHVybiBiYXNlNjQ7XG59O1xuXG4vKioqLyB9KSxcbi8qIDIwICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9wZXJmb3JtYW5jZS53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZXNwb25zZUVuZCkge1xuICB2YXIgX3BlcmZvcm1hbmNlJHRpbWluZztcblxuICB2YXIgcGVyZm9ybWFuY2UgPSB7fTtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gbm90IGdldCBuYXZpZ2F0aW9uU3RhcnQgdGltZVxuICBwZXJmb3JtYW5jZS50aW1pbmcgPSAoX3BlcmZvcm1hbmNlJHRpbWluZyA9IHtcbiAgICB1bmxvYWRFdmVudFN0YXJ0OiAwLFxuICAgIHVubG9hZEV2ZW50RW5kOiAwLFxuICAgIG5hdmlnYXRpb25TdGFydDogcmVzcG9uc2VFbmQsXG4gICAgcmVkaXJlY3RTdGFydDogMCxcbiAgICByZWRpcmVjdEVuZDogMCxcbiAgICBmZXRjaFN0YXJ0OiByZXNwb25zZUVuZCxcbiAgICBkb21haW5Mb29rdXBTdGFydDogcmVzcG9uc2VFbmQsXG4gICAgZG9tYWluTG9va3VwRW5kOiByZXNwb25zZUVuZCxcbiAgICBjb25uZWN0U3RhcnQ6IHJlc3BvbnNlRW5kLFxuICAgIHNlY3VyZUNvbm5lY3Rpb25TdGFydDogcmVzcG9uc2VFbmRcbiAgfSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiY29ubmVjdFN0YXJ0XCIsIHJlc3BvbnNlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwicmVxdWVzdFN0YXJ0XCIsIHJlc3BvbnNlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwicmVzcG9uc2VTdGFydFwiLCByZXNwb25zZUVuZCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcInJlc3BvbnNlRW5kXCIsIHJlc3BvbnNlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiZG9tTG9hZGluZ1wiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiZG9tSW50ZXJhY3RpdmVcIiwgMCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcImRvbUNvbXBsZXRlXCIsIDApLCBfZGVmaW5lUHJvcGVydHkoX3BlcmZvcm1hbmNlJHRpbWluZywgXCJkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydFwiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiZG9tQ29udGVudExvYWRlZEV2ZW50RW5kXCIsIDApLCBfZGVmaW5lUHJvcGVydHkoX3BlcmZvcm1hbmNlJHRpbWluZywgXCJsb2FkRXZlbnRTdGFydFwiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwibG9hZEV2ZW50RW5kXCIsIDApLCBfcGVyZm9ybWFuY2UkdGltaW5nKTtcbiAgcGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBEYXRlLm5vdygpIC0gcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydDtcbiAgfTtcblxuICByZXR1cm4gcGVyZm9ybWFuY2U7XG59O1xuXG4vKioqLyB9KSxcbi8qIDIxICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9ldmVudC53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudCh0eXBlKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnQpO1xuXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmJ1YmJsZXMgPSBCb29sZWFuKHBhcmFtcy5idWJibGVzKTtcbiAgICB0aGlzLmNhbmNlbGFibGUgPSBCb29sZWFuKHBhcmFtcy5jYW5jZWxhYmxlKTtcbiAgfTtcblxuICB2YXIgQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAoX0V2ZW50KSB7XG4gICAgX2luaGVyaXRzKEN1c3RvbUV2ZW50LCBfRXZlbnQpO1xuXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQodHlwZSkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDdXN0b21FdmVudCk7XG5cbiAgICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDdXN0b21FdmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEN1c3RvbUV2ZW50KSkuY2FsbCh0aGlzLCB0eXBlLCBwYXJhbXMpKTtcblxuICAgICAgX3RoaXMuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXZlbnQ7XG4gIH0oRXZlbnQpO1xuXG4gIHJldHVybiB7XG4gICAgRXZlbnQ6IEV2ZW50LFxuICAgIEN1c3RvbUV2ZW50OiBDdXN0b21FdmVudFxuICB9O1xufTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pOztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyYW1ld29yay53ZWV4Lm1hcCIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICogYXMgVmFuaWxsYSBmcm9tICcuL3ZhbmlsbGEvaW5kZXgnXG5pbXBvcnQgKiBhcyBWdWUgZnJvbSAnd2VleC12dWUtZnJhbWV3b3JrJ1xuaW1wb3J0ICogYXMgV2VleCBmcm9tICcuL2xlZ2FjeS9pbmRleCdcbmltcG9ydCBSYXggZnJvbSAnd2VleC1yYXgtZnJhbWV3b3JrJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIFZhbmlsbGEsXG4gIFZ1ZSxcbiAgUmF4LFxuICBXZWV4XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgLy8gd2VleCBpbnN0YW5jZXNcbiAgX2luc3RhbmNlczoge30sXG5cbiAgLy8gYXBpIG1ldGEgaW5mb1xuICBfbWV0YToge30sXG5cbiAgLy8gV2VleC5yZWdpc3RlckFwaU1vZHVsZSB1c2VkIHRoaXMgdG8gcmVnaXN0ZXIgYW5kIGFjY2VzcyBhcGlNb2R1bGVzLlxuICBhcGlNb2R1bGU6IHt9LFxuXG4gIC8vIGdldCB0aGUgYXBpIG1ldGhvZCBtZXRhIGluZm8gYXJyYXkgZm9yIHRoZSBtb2R1bGUuXG4gIGdldEFwaU1vZHVsZU1ldGE6IGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YU9iaiA9IHt9XG4gICAgbWV0YU9ialttb2R1bGVOYW1lXSA9IHRoaXMuX21ldGFbbW9kdWxlTmFtZV1cbiAgICByZXR1cm4gbWV0YU9ialxuICB9LFxuXG4gIC8vIFNldCBtZXRhIGluZm8gZm9yIGEgYXBpIG1vZHVsZS5cbiAgLy8gSWYgdGhlcmUgaXMgYSBzYW1lIG5hbWVkIGFwaSwganVzdCByZXBsYWNlIGl0LlxuICAvLyBvcHRzOlxuICAvLyAtIG1ldGFPYmo6IG1ldGEgb2JqZWN0IGxpa2VcbiAgLy8ge1xuICAvLyAgICBkb206IFt7XG4gIC8vICAgICAgbmFtZTogJ2FkZEVsZW1lbnQnLFxuICAvLyAgICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCddXG4gIC8vICAgIH1dXG4gIC8vIH1cbiAgc2V0QXBpTW9kdWxlTWV0YTogZnVuY3Rpb24gKG1ldGFPYmopIHtcbiAgICBsZXQgbW9kdWxlTmFtZVxuICAgIGZvciAoY29uc3QgayBpbiBtZXRhT2JqKSB7XG4gICAgICBpZiAobWV0YU9iai5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICBtb2R1bGVOYW1lID0ga1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXRhQXJyYXkgPSB0aGlzLl9tZXRhW21vZHVsZU5hbWVdXG4gICAgaWYgKCFtZXRhQXJyYXkpIHtcbiAgICAgIHRoaXMuX21ldGFbbW9kdWxlTmFtZV0gPSBtZXRhT2JqW21vZHVsZU5hbWVdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgbmFtZU9iaiA9IHt9XG4gICAgICBtZXRhT2JqW21vZHVsZU5hbWVdLmZvckVhY2goZnVuY3Rpb24gKGFwaSkge1xuICAgICAgICBuYW1lT2JqW2FwaS5uYW1lXSA9IGFwaVxuICAgICAgfSlcbiAgICAgIG1ldGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChhcGksIGkpIHtcbiAgICAgICAgaWYgKG5hbWVPYmpbYXBpLm5hbWVdKSB7XG4gICAgICAgICAgbWV0YUFycmF5W2ldID0gbmFtZU9ialthcGkubmFtZV1cbiAgICAgICAgICBkZWxldGUgbmFtZU9ialthcGkubmFtZV1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGZvciAoY29uc3QgayBpbiBtZXRhT2JqKSB7XG4gICAgICAgIGlmIChtZXRhT2JqLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgbWV0YUFycmF5LnB1c2gobWV0YU9ialtrXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9tZXRhW21vZHVsZU5hbWVdID0gbWV0YU9ialttb2R1bGVOYW1lXVxuICB9LFxuXG4gIC8vIFNldCBtZXRhIGluZm8gZm9yIGEgc2luZ2xlIGFwaS5cbiAgLy8gb3B0czpcbiAgLy8gIC0gbW9kdWxlTmFtZTogYXBpIG1vZHVsZSBuYW1lLlxuICAvLyAgLSBtZXRhOiBhIG1ldGEgb2JqZWN0IGxpa2U6XG4gIC8vICB7XG4gIC8vICAgIG5hbWU6ICdhZGRFbGVtZW50JyxcbiAgLy8gICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0J11cbiAgLy8gIH1cbiAgc2V0QXBpTWV0YTogZnVuY3Rpb24gKG1vZHVsZU5hbWUsIG1ldGEpIHtcbiAgICBjb25zdCBtZXRhQXJyYXkgPSB0aGlzLl9tZXRhW21vZHVsZU5hbWVdXG4gICAgaWYgKCFtZXRhQXJyYXkpIHtcbiAgICAgIHRoaXMuX21ldGFbbW9kdWxlTmFtZV0gPSBbbWV0YV1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgbWV0YUlkeCA9IC0xXG4gICAgICBtZXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoYXBpLCBpKSB7XG4gICAgICAgIGxldCBuYW1lIC8vIHRvZG9cbiAgICAgICAgaWYgKG1ldGEubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIG1ldGFJZHggPSBpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAobWV0YUlkeCAhPT0gLTEpIHtcbiAgICAgICAgbWV0YUFycmF5W21ldGFJZHhdID0gbWV0YVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG1ldGFBcnJheS5wdXNoKG1ldGEpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIF9yZWdpc3Rlck1vZHVsZXMoW3tcbi8vICAgbW9kYWw6IFt7XG4vLyAgICAgbmFtZTogJ3RvYXN0Jyxcbi8vICAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4vLyAgIH0sIHtcbi8vICAgICBuYW1lOiAnYWxlcnQnLFxuLy8gICAgIGFyZ3M6IFsnb2JqZWN0JywgJ2Z1bmN0aW9uJ11cbi8vICAgfSwge1xuLy8gICAgIG5hbWU6ICdjb25maXJtJyxcbi8vICAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4vLyAgIH0sIHtcbi8vICAgICBuYW1lOiAncHJvbXB0Jyxcbi8vICAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4vLyAgIH1dXG4vLyB9LCB7XG4vLyAgIGFuaW1hdGlvbjogW3tcbi8vICAgICBuYW1lOiAndHJhbnNpdGlvbicsXG4vLyAgICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0JywgJ2Z1bmN0aW9uJ11cbi8vICAgfV1cbi8vIH1dKVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgY29uZmlnID0ge1xuICB3ZWV4VmVyc2lvbjogJzAuNS4wJyxcbiAgZGVidWc6IGZhbHNlLFxuICB2YWxpZFJvb3RzOiBbJ2RpdicsICdsaXN0JywgJ3ZsaXN0JywgJ3Njcm9sbGVyJ10sXG4gIGRvd25ncmFkZToge1xuICAgIC8vIHJvb3Q6IHRydWVcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5IChhcnIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXlcbiAgICA/IEFycmF5LmlzQXJyYXkoYXJyKVxuICAgIDogKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpID09PSAnW29iamVjdCBBcnJheV0nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpY2UgKGFyciwgc3RhcnQsIGVuZCkge1xuICBpZiAoaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kKVxuICB9XG4gIGNvbnN0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gIHJldHVybiBzbGljZS5jYWxsKGFyciwgc3RhcnQsIGVuZClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKiBnbG9iYWwgSW1hZ2UgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8vIGNvbnN0IFdFQVBQX1NUWUxFX0lEID0gJ3dlYXBwLXN0eWxlJ1xuXG5pbXBvcnQgJy4uLy4uLy4uL3NoYXJlZC9vYmplY3RBc3NpZ24nXG5cbmV4cG9ydCB7XG4gIGV4dGVuZCxcbiAgZGVmLFxuICByZW1vdmUsXG4gIGhhc093bixcbiAgYmluZCxcbiAgdG9BcnJheSxcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIHR5cG9mXG59IGZyb20gJy4uLy4uLy4uL2ZyYW1ld29ya3MvbGVnYWN5L3V0aWwnXG5cbmltcG9ydCB7IGlzQXJyYXksIHNsaWNlIH0gZnJvbSAnLi9hcnJheSdcbmV4cG9ydCB7IGlzQXJyYXksIHNsaWNlIH1cblxuZXhwb3J0IGNvbnN0IHZlbmRvcnMgPSBbJ21zJywgJ21veicsICd3ZWJraXQnLCAnbyddXG5cbmxldCBfaXNXZWJwU3VwcG9ydGVkID0gZmFsc2VcblxuOyAoZnVuY3Rpb24gaXNTdXBwb3J0V2VicCAoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgd2ViUCA9IG5ldyBJbWFnZSgpXG4gICAgd2ViUC5zcmMgPSAnZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmpvQUFBQlhSVUpRVmxBNElDNEFBQUN5QWdDZEEnXG4gICAgICAgICAgICAgICsgJ1NvQ0FBSUFMbWswbWswaUlpSWlJZ0JvU3lnQUJjNldXZ0FBL3ZlZmYvMFBQOGJBLy9Md1lBQUEnXG4gICAgd2ViUC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAod2ViUC5oZWlnaHQgPT09IDIpIHtcbiAgICAgICAgX2lzV2VicFN1cHBvcnRlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICAvLyBkbyBub3RoaW5nLlxuICB9XG59KSgpXG5cbmxldCBfaXNTdGlja3lTdXBwb3J0ZWQgPSBmYWxzZVxuXG47IChmdW5jdGlvbiBpc1N1cHBvcnRTdGlja3kgKCkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gZWxlbWVudC5zdHlsZVxuICBlbGVtZW50U3R5bGUuY3NzVGV4dCA9IHZlbmRvcnMuY29uY2F0KFsnJ10pLm1hcChmdW5jdGlvbiAodmVuZG9yKSB7XG4gICAgcmV0dXJuICdwb3NpdGlvbjonXG4gICAgICArICh2ZW5kb3IgPyAnLScgKyB2ZW5kb3IgKyAnLScgOiAnJylcbiAgICAgICsgJ3N0aWNreSdcbiAgfSkuam9pbignOycpICsgJzsnXG4gIF9pc1N0aWNreVN1cHBvcnRlZCA9IGVsZW1lbnRTdHlsZS5wb3NpdGlvbi5pbmRleE9mKCdzdGlja3knKSAhPT0gLTFcbn0pKClcblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCAodG8sIGZyb20pIHtcbi8vICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuLy8gICAgIHRvW2tleV0gPSBmcm9tW2tleV1cbi8vICAgfVxuLy8gICByZXR1cm4gdG9cbi8vIH1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikge1xuLy8gICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iailcbi8vICAgICAuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnXG4vLyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopXG4gICAgLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRTdHlsZSAoY3NzLCBzdHlsZUlkLCByZXBsYWNlKSB7XG4gIGxldCBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlSWQpXG4gIGlmIChzdHlsZSAmJiByZXBsYWNlKSB7XG4gICAgc3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSlcbiAgICBzdHlsZSA9IG51bGxcbiAgfVxuICBpZiAoIXN0eWxlKSB7XG4gICAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgc3R5bGUudHlwZSA9ICd0ZXh0L2NzcydcbiAgICBzdHlsZUlkICYmIChzdHlsZS5pZCA9IHN0eWxlSWQpXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZSlcbiAgfVxuICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlRnJvbUFycmF5IChhcnIpIHtcbiAgaWYgKCFpc0FycmF5KGFycikpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBjb25zdCByZXMgPSBbXVxuICBjb25zdCB1bmlxdWUgPSB7fVxuICBsZXQgdmFsXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhbCA9IGFycltpXVxuICAgIGlmICh1bmlxdWVbdmFsXSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgdW5pcXVlW3ZhbF0gPSB0cnVlXG4gICAgcmVzLnB1c2godmFsKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFdlYnAgKCkge1xuICByZXR1cm4gX2lzV2VicFN1cHBvcnRlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3RpY2t5ICgpIHtcbiAgcmV0dXJuIF9pc1N0aWNreVN1cHBvcnRlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tIChudW0pIHtcbiAgY29uc3QgX2RlZmF1bHROdW0gPSAxMFxuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgfHwgbnVtIDw9IDApIHtcbiAgICBudW0gPSBfZGVmYXVsdE51bVxuICB9XG4gIGNvbnN0IF9tYXggPSBNYXRoLnBvdygxMCwgbnVtKVxuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSAqIF9tYXgpICUgX21heFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmdiIChjb2xvcikge1xuICBsZXQgbWF0Y2hcbiAgY29sb3IgPSBjb2xvciArICcnXG4gIG1hdGNoID0gY29sb3IubWF0Y2goLyMoW1xcZGEtZkEtRl17Mn0pKFtcXGRhLWZBLUZdezJ9KShbXFxkYS1mQS1GXXsyfSkvKVxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQobWF0Y2hbMV0sIDE2KSxcbiAgICAgIGc6IHBhcnNlSW50KG1hdGNoWzJdLCAxNiksXG4gICAgICBiOiBwYXJzZUludChtYXRjaFszXSwgMTYpXG4gICAgfVxuICB9XG4gIG1hdGNoID0gY29sb3IubWF0Y2goL3JnYlxcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKylcXCkvKVxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQobWF0Y2hbMV0pLFxuICAgICAgZzogcGFyc2VJbnQobWF0Y2hbMl0pLFxuICAgICAgYjogcGFyc2VJbnQobWF0Y2hbM10pXG4gICAgfVxuICB9XG59XG5cbi8vIGRpcmVjdGlvbjogJ2wnIHwgJ3InLCBkZWZhdWx0IGlzICdyJ1xuLy8gbnVtOiBob3cgbWFueSB0aW1lcyB0byBsb29wLCBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXG5leHBvcnQgZnVuY3Rpb24gbG9vcEFycmF5IChhcnIsIG51bSwgZGlyZWN0aW9uKSB7XG4gIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IGlzTGVmdCA9IChkaXJlY3Rpb24gKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2wnXG4gIGNvbnN0IGxlbiA9IGFyci5sZW5ndGhcbiAgbnVtID0gbnVtICUgbGVuXG4gIGlmIChudW0gPCAwKSB7XG4gICAgbnVtID0gLW51bVxuICAgIGlzTGVmdCA9ICFpc0xlZnRcbiAgfVxuICBpZiAobnVtID09PSAwKSB7XG4gICAgcmV0dXJuIGFyclxuICB9XG4gIGxldCBscCwgcnBcbiAgaWYgKGlzTGVmdCkge1xuICAgIGxwID0gYXJyLnNsaWNlKDAsIG51bSlcbiAgICBycCA9IGFyci5zbGljZShudW0pXG4gIH1cbiAgZWxzZSB7XG4gICAgbHAgPSBhcnIuc2xpY2UoMCwgbGVuIC0gbnVtKVxuICAgIHJwID0gYXJyLnNsaWNlKGxlbiAtIG51bSlcbiAgfVxuICByZXR1cm4gcnAuY29uY2F0KGxwKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGhyb3R0bGUgKGZ1bmMsIHdhaXQpIHtcbiAgbGV0IHJlc3VsdFxuICBsZXQgdGltZXJJZCA9IG51bGxcbiAgbGV0IHByZXZpb3VzID0gMFxuICBsZXQgY29udGV4dFxuICBsZXQgYXJnc1xuICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcmV2aW91cyA9IERhdGUubm93KClcbiAgICB0aW1lcklkID0gbnVsbFxuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICBjb25zdCByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKVxuICAgIGNvbnRleHQgPSB0aGlzXG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKVxuICAgICAgdGltZXJJZCA9IG51bGxcbiAgICAgIHByZXZpb3VzID0gbm93XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgfVxuICAgIGVsc2UgaWYgKCF0aW1lcklkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9LZWJhYiAobmFtZSkge1xuICBpZiAoIW5hbWUpIHsgcmV0dXJuICcnIH1cbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvKFtBLVpdKS9nLCBmdW5jdGlvbiAoZywgZzEpIHtcbiAgICByZXR1cm4gYC0ke2cxLnRvTG93ZXJDYXNlKCl9YFxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24ga2ViYWJUb0NhbWVsIChuYW1lKSB7XG4gIGlmICghbmFtZSkgeyByZXR1cm4gJycgfVxuICByZXR1cm4gbmFtZS5yZXBsYWNlKC8tKFthLXpdKS9nLCBmdW5jdGlvbiAoZywgZzEpIHtcbiAgICBjb25zb2xlLmxvZyhnMSlcbiAgICByZXR1cm4gYCR7ZzEudG9VcHBlckNhc2UoKX1gXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRW50ZXJLZXlUeXBlIChrZXkpIHtcbiAgY29uc3Qga2V5cyA9IFsnZGVmYXVsdCcsICdnbycsICduZXh0JywgJ3NlYXJjaCcsICdzZW5kJ11cbiAgaWYgKGtleXMuaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICByZXR1cm4ga2V5XG4gIH1cbiAgcmV0dXJuICdkb25lJ1xufVxuXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi91dGlscydcblxuY29uc3QgX3NlbmRlck1hcCA9IHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNlbmRlciAoaW5zdGFuY2UpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNlbmRlcikpIHtcbiAgICByZXR1cm4gbmV3IFNlbmRlcihpbnN0YW5jZSlcbiAgfVxuICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZS5pbnN0YW5jZUlkXG4gIHRoaXMud2VleEluc3RhbmNlID0gaW5zdGFuY2VcbiAgX3NlbmRlck1hcFt0aGlzLmluc3RhbmNlSWRdID0gdGhpc1xufVxuXG5mdW5jdGlvbiBfc2VuZCAoaW5zdGFuY2VJZCwgbXNnKSB7XG4gIGNhbGxKUyhpbnN0YW5jZUlkLCBbbXNnXSlcbn1cblxuU2VuZGVyLmdldFNlbmRlciA9IGZ1bmN0aW9uIChpbnN0YW5jZUlkKSB7XG4gIHJldHVybiBfc2VuZGVyTWFwW2luc3RhbmNlSWRdXG59XG5cblNlbmRlci5wcm90b3R5cGUgPSB7XG5cbiAgLy8gcGVyZm9ybSBhIGNhbGxiYWNrIHRvIGpzZnJhbWV3b3JrLlxuICBwZXJmb3JtQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFja0lkLCBkYXRhLCBrZWVwQWxpdmUpIHtcbiAgICBjb25zdCBhcmdzID0gW2NhbGxiYWNrSWRdXG4gICAgZGF0YSAmJiBhcmdzLnB1c2goZGF0YSlcbiAgICBrZWVwQWxpdmUgJiYgYXJncy5wdXNoKGtlZXBBbGl2ZSlcbiAgICBfc2VuZCh0aGlzLmluc3RhbmNlSWQsIHtcbiAgICAgIG1ldGhvZDogJ2NhbGxiYWNrJyxcbiAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KVxuICB9LFxuXG4gIGZpcmVFdmVudDogZnVuY3Rpb24gKHJlZiwgdHlwZSwgZnVuYywgZXZlbnQpIHtcbiAgICBmdW5jLmV4dHJhICYmIGV4dGVuZChldmVudCwgZnVuYy5leHRyYSgpKVxuICAgIF9zZW5kKHRoaXMuaW5zdGFuY2VJZCwge1xuICAgICAgbWV0aG9kOiAnZmlyZUV2ZW50JyxcbiAgICAgIGFyZ3M6IFtyZWYsIHR5cGUsIGV2ZW50LCBmdW5jLnVwZGF0b3IgJiYgZnVuYy51cGRhdG9yKCldXG4gICAgfSlcbiAgfVxuXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJy4uL3JlbmRlci9jb25maWcnXG5pbXBvcnQgcHJvdG9jb2wgZnJvbSAnLi9wcm90b2NvbCdcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCBTZW5kZXIgZnJvbSAnLi9zZW5kZXInXG5cbi8vIHN5bmMgY2FsbCBuYXRpdmUgY29tcG9uZW50IG1ldGhvZC5cbmZ1bmN0aW9uIGNhbGxOYXRpdmVDb21wb25lbnQgKGluc3RhbmNlSWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSB7XG4gIHJldHVybiBwcm9jZXNzQ2FsbChpbnN0YW5jZUlkLCB7XG4gICAgY29tcG9uZW50OiBvcHRpb25zLmNvbXBvbmVudCxcbiAgICByZWYsXG4gICAgbWV0aG9kLFxuICAgIGFyZ3NcbiAgfSlcbn1cblxuLy8gc3luYyBjYWxsIG5hdGl2ZSBtb2R1bGUgYXBpLlxuZnVuY3Rpb24gY2FsbE5hdGl2ZU1vZHVsZSAoaW5zdGFuY2VJZCwgbW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHByb2Nlc3NDYWxsKGluc3RhbmNlSWQsIHsgbW9kdWxlLCBtZXRob2QsIGFyZ3MgfSlcbn1cblxuLy8gY2FsbE5hdGl2ZToganNGcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHRhbGsgdG9cbi8vIHRoaXMgcmVuZGVyZXIuXG4vLyBwYXJhbXM6XG4vLyAgLSBpbnN0YW5jZUlkOiBzdHJpbmcuXG4vLyAgLSB0YXNrczogYXJyYXkgb2Ygb2JqZWN0LlxuLy8gIC0gY2FsbGJhY2tJZDogbnVtYmVyLlxuZnVuY3Rpb24gY2FsbE5hdGl2ZSAoaW5zdGFuY2VJZCwgdGFza3MsIGNhbGxiYWNrSWQpIHtcbiAgbGV0IGNhbGxzID0gW11cbiAgaWYgKHR5cGVvZiB0YXNrcyA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgY2FsbHMgPSBKU09OLnBhcnNlKHRhc2tzKVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignaW52YWxpZCB0YXNrczonLCB0YXNrcylcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoaXNBcnJheSh0YXNrcykpIHtcbiAgICBjYWxscyA9IHRhc2tzXG4gIH1cbiAgY29uc3QgbGVuID0gY2FsbHMubGVuZ3RoXG4gIGNhbGxzW2xlbiAtIDFdLmNhbGxiYWNrSWQgPSAoIWNhbGxiYWNrSWQgJiYgY2FsbGJhY2tJZCAhPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2FsbGJhY2tJZFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcHJvY2Vzc0NhbGwoaW5zdGFuY2VJZCwgY2FsbHNbaV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NhbGwgKGluc3RhbmNlSWQsIGNhbGwpIHtcbiAgY29uc3QgaXNDb21wb25lbnQgPSB0eXBlb2YgY2FsbC5tb2R1bGUgPT09ICd1bmRlZmluZWQnXG4gIGNvbnN0IHJlcyA9IGlzQ29tcG9uZW50ID8gY29tcG9uZW50Q2FsbChpbnN0YW5jZUlkLCBjYWxsKSA6IG1vZHVsZUNhbGwoaW5zdGFuY2VJZCwgY2FsbClcblxuICBjb25zdCBjYWxsYmFja0lkID0gY2FsbC5jYWxsYmFja0lkXG4gIGlmICgoY2FsbGJhY2tJZFxuICAgIHx8IGNhbGxiYWNrSWQgPT09IDBcbiAgICB8fCBjYWxsYmFja0lkID09PSAnMCcpXG4gICAgJiYgY2FsbGJhY2tJZCAhPT0gJy0xJ1xuICAgICYmIGNhbGxiYWNrSWQgIT09IC0xKSB7XG4gICAgcGVyZm9ybU5leHRUaWNrKGluc3RhbmNlSWQsIGNhbGxiYWNrSWQpXG4gIH1cblxuICAvLyBmb3Igc3luYyBjYWxsLlxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIG1vZHVsZUNhbGwgKGluc3RhbmNlSWQsIGNhbGwpIHtcbiAgY29uc3QgbW9kdWxlTmFtZSA9IGNhbGwubW9kdWxlXG4gIGNvbnN0IG1ldGhvZE5hbWUgPSBjYWxsLm1ldGhvZFxuICBsZXQgbW9kdWxlLCBtZXRob2RcbiAgY29uc3QgYXJncyA9IGNhbGwuYXJncyB8fCBjYWxsLmFyZ3VtZW50cyB8fCBbXVxuXG4gIGlmICghKG1vZHVsZSA9IHByb3RvY29sLmFwaU1vZHVsZVttb2R1bGVOYW1lXSkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoIShtZXRob2QgPSBtb2R1bGVbbWV0aG9kTmFtZV0pKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZXR1cm4gbWV0aG9kLmFwcGx5KGdsb2JhbC53ZWV4LmdldEluc3RhbmNlKGluc3RhbmNlSWQpLCBhcmdzKVxufVxuXG5mdW5jdGlvbiBjb21wb25lbnRDYWxsIChpbnN0YW5jZUlkLCBjYWxsKSB7XG4gIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjYWxsLmNvbXBvbmVudFxuICBjb25zdCByZWYgPSBjYWxsLnJlZlxuICBjb25zdCBtZXRob2ROYW1lID0gY2FsbC5tZXRob2RcbiAgY29uc3QgYXJncyA9IGNhbGwuYXJncyB8fCBjYWxsLmFyZ3VtZW50cyB8fCBbXVxuXG4gIGNvbnN0IGVsZW0gPSBnbG9iYWwud2VleC5nZXRJbnN0YW5jZShpbnN0YW5jZUlkKS5nZXRDb21wb25lbnRNYW5hZ2VyKCkuZ2V0Q29tcG9uZW50KHJlZilcbiAgaWYgKCFlbGVtKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtoNS1yZW5kZXJdIGNvbXBvbmVudCBvZiByZWYgJHtyZWZ9IGRvZXNuJ3QgZXhpc3QuYClcbiAgfVxuXG4gIGxldCBtZXRob2RcblxuICBpZiAoIShtZXRob2QgPSBlbGVtW21ldGhvZE5hbWVdKSkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgbmFtZWQgJHttZXRob2ROYW1lfS5gKVxuICB9XG5cbiAgcmV0dXJuIG1ldGhvZC5hcHBseShlbGVtLCBhcmdzKVxufVxuXG5mdW5jdGlvbiBwZXJmb3JtTmV4dFRpY2sgKGluc3RhbmNlSWQsIGNhbGxiYWNrSWQpIHtcbiAgU2VuZGVyLmdldFNlbmRlcihpbnN0YW5jZUlkKS5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZClcbn1cblxuZnVuY3Rpb24gbmF0aXZlTG9nICgpIHtcbiAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgIGlmIChhcmd1bWVudHNbMF0ubWF0Y2goL15wZXJmLykpIHtcbiAgICAgIGNvbnNvbGUuaW5mby5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5kZWJ1Zy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gIH1cbn1cblxuZnVuY3Rpb24gZXhwb3J0c0JyaWRnZU1ldGhvZHNUb0dsb2JhbCAoKSB7XG4gIGdsb2JhbC5jYWxsTmF0aXZlID0gY2FsbE5hdGl2ZVxuICBnbG9iYWwuY2FsbE5hdGl2ZUNvbXBvbmVudCA9IGNhbGxOYXRpdmVDb21wb25lbnRcbiAgZ2xvYmFsLmNhbGxOYXRpdmVNb2R1bGUgPSBjYWxsTmF0aXZlTW9kdWxlXG4gIGdsb2JhbC5uYXRpdmVMb2cgPSBuYXRpdmVMb2dcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXhwb3J0cyBtZXRob2RzIHRvIGdsb2JhbCh3aW5kb3cpLlxuICAgIGV4cG9ydHNCcmlkZ2VNZXRob2RzVG9HbG9iYWwoKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgcHJvdG9jb2wgZnJvbSAnLi9wcm90b2NvbCdcbmltcG9ydCByZWNlaXZlciBmcm9tICcuL3JlY2VpdmVyJ1xuaW1wb3J0IFNlbmRlciBmcm9tICcuL3NlbmRlcidcblxuZXhwb3J0IHsgcHJvdG9jb2wsIHJlY2VpdmVyLCBTZW5kZXIgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgdGhyb3R0bGUgfSBmcm9tICcuLi91dGlscydcblxuY29uc3Qgd2F0Y2hlZENvbXBvbmVudHMgPSBbXVxubGV0IGxpc3RlbmVkID0gZmFsc2VcbmxldCBzY3JvbGxZID0gMFxuXG5mdW5jdGlvbiBuZWVkV2F0Y2ggKGNvbXBvbmVudCkge1xuICBjb25zdCBldmVudHMgPSBjb21wb25lbnQuZGF0YS5ldmVudFxuICBpZiAoZXZlbnRzXG4gICAgICAmJiAoZXZlbnRzLmluZGV4T2YoJ2FwcGVhcicpICE9PSAtMVxuICAgICAgICB8fCBldmVudHMuaW5kZXhPZignZGlzYXBwZWFyJykgIT09IC0xKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaElmTmVlZGVkIChjb21wb25lbnQpIHtcbiAgaWYgKG5lZWRXYXRjaChjb21wb25lbnQpKSB7XG4gICAgd2F0Y2hlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpXG4gICAgaWYgKCFsaXN0ZW5lZCkge1xuICAgICAgbGlzdGVuZWQgPSB0cnVlXG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhyb3R0bGUob25TY3JvbGwsIDEwMClcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCBmYWxzZSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50SW5XaW5kb3cgKGNvbXBvbmVudCkge1xuICBjb25zdCByZWN0ID0gY29tcG9uZW50Lm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgcmV0dXJuIHJlY3QucmlnaHQgPiAwICYmIHJlY3QubGVmdCA8IHdpbmRvdy5pbm5lcldpZHRoICYmXG4gICAgICAgICByZWN0LmJvdHRvbSA+IDAgJiYgcmVjdC50b3AgPCB3aW5kb3cuaW5uZXJIZWlnaHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludGVyc2VjdGlvbiAocmVjdCwgY3RSZWN0KSB7XG4gIHJldHVybiAocmVjdC5sZWZ0IDwgY3RSZWN0LnJpZ2h0ICYmIHJlY3QucmlnaHQgPiBjdFJlY3QubGVmdClcbiAgICAmJiAocmVjdC50b3AgPCBjdFJlY3QuYm90dG9tICYmIHJlY3QuYm90dG9tID4gY3RSZWN0LnRvcClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50QXBwZWFyIChjb21wb25lbnQpIHtcbiAgLy8gTk9URTogbm8gbW9yZSBzdXBwb3J0IGVtYmVkZWQgc2Nyb2xsZXJzLlxuICBjb25zdCBwYXJlbnRTY3JvbGxlciA9IGNvbXBvbmVudC5nZXRQYXJlbnRTY3JvbGxlcigpXG4gIGlmICghcGFyZW50U2Nyb2xsZXIpIHtcbiAgICByZXR1cm4gaXNDb21wb25lbnRJbldpbmRvdyhjb21wb25lbnQpXG4gIH1cbiAgcmV0dXJuIGlzQ29tcG9uZW50SW5XaW5kb3coY29tcG9uZW50KVxuICAgICYmIGhhc0ludGVyc2VjdGlvbihcbiAgICAgIGNvbXBvbmVudC5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgcGFyZW50U2Nyb2xsZXIubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbn1cblxuZnVuY3Rpb24gb25TY3JvbGwgKGUpIHtcbiAgbGV0IGRpcmVjdGlvblxuICAvLyBOT1RFOiB0aGlzIGNvbmRpdGlvbiBzdHJvbmdseSByZWxpZXMgb24gdGhlIHNjcm9sbGVyJ3MgaW1wbGVtZW50YXRpb24uXG4gIGlmIChlLm9yaWdpbmFsVHlwZSA9PT0gJ3Njcm9sbGluZycpIHtcbiAgICBkaXJlY3Rpb24gPSBlLmRpcmVjdGlvblxuICB9XG4gIGVsc2Uge1xuICAgIC8vIE5PVEU6IG9ubHkgVkVSVElDQUwgd2luZG93IHNjcm9sbCBjYW4gYmUgZGV0ZWN0ZWQuXG4gICAgY29uc3QgeSA9IHdpbmRvdy5zY3JvbGxZXG4gICAgZGlyZWN0aW9uID0geSA+PSBzY3JvbGxZID8gJ3VwJyA6ICdkb3duJ1xuICAgIHNjcm9sbFkgPSB5XG4gIH1cbiAgY29uc3QgbGVuID0gd2F0Y2hlZENvbXBvbmVudHMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB3YXRjaGVkQ29tcG9uZW50c1tpXVxuICAgIGNvbnN0IGFwcGVhciA9IGlzQ29tcG9uZW50QXBwZWFyKGNvbXBvbmVudClcbiAgICBpZiAoYXBwZWFyKSB7XG4gICAgICBjb21wb25lbnQuZGlzcGF0Y2hFdmVudCgnYXBwZWFyJywgeyBkaXJlY3Rpb24gfSlcbiAgICB9XG4gICAgZWxzZSBpZiAoIWFwcGVhcikge1xuICAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQoJ2Rpc2FwcGVhcicsIHsgZGlyZWN0aW9uIH0pXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBFdmVudCAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgd2F0Y2hJZk5lZWRlZCB9IGZyb20gJy4vYXBwZWFyV2F0Y2hlcidcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuLi91dGlscydcbi8vIGNvbnN0IGxhenlsb2FkID0gcmVxdWlyZSgnLi9sYXp5bG9hZCcpXG4vLyBjb25zdCBhbmltYXRpb24gPSByZXF1aXJlKCcuL2FuaW1hdGlvbicpXG5cbmNvbnN0IFJFTkRFUklOR19JTkRFTlQgPSA4MDBcblxuY29uc3QgX2luc3RhbmNlTWFwID0ge31cbmNvbnN0IHR5cGVNYXAgPSB7fVxuY29uc3Qgc2Nyb2xsYWJsZVR5cGVzID0gW1xuICAnc2Nyb2xsZXInLFxuICAnaHNjcm9sbGVyJyxcbiAgJ3ZzY3JvbGxlcicsXG4gICdsaXN0JyxcbiAgJ2hsaXN0JyxcbiAgJ3ZsaXN0J1xuXVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDb21wb25lbnRNYW5hZ2VyIChpZCkge1xuICB0aGlzLmlkID0gaWRcbiAgdGhpcy5iYXRjaGVkID0gZmFsc2VcbiAgdGhpcy51cGRhdGVzID0gW11cbiAgdGhpcy5jb21wb25lbnRNYXAgPSB7fVxuICBfaW5zdGFuY2VNYXBbdGhpcy5pZF0gPSB0aGlzXG59XG5cbkNvbXBvbmVudE1hbmFnZXIuZ2V0SW5zdGFuY2UgPSBpbnN0YW5jZUlkID0+IF9pbnN0YW5jZU1hcFtpbnN0YW5jZUlkXVxuXG5Db21wb25lbnRNYW5hZ2VyLnJlZ2lzdGVyQ29tcG9uZW50ID0gKHR5cGUsIGRlZmluaXRpb24pID0+IHtcbiAgdHlwZU1hcFt0eXBlXSA9IGRlZmluaXRpb25cbn1cblxuQ29tcG9uZW50TWFuYWdlci5nZXRTY3JvbGxhYmxlVHlwZXMgPSAoKSA9PiBzY3JvbGxhYmxlVHlwZXNcblxuQ29tcG9uZW50TWFuYWdlci5wcm90b3R5cGUgPSB7XG5cbiAgZ2V0V2VleEluc3RhbmNlICgpIHtcbiAgICBpZiAoIXRoaXMuX3dlZXhJbnN0YW5jZSkge1xuICAgICAgdGhpcy5fd2VleEluc3RhbmNlID0gZ2xvYmFsLndlZXhcbiAgICAgICAgPyBnbG9iYWwud2VleC5nZXRJbnN0YW5jZSh0aGlzLmlkKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dlZXhJbnN0YW5jZVxuICB9LFxuXG4gIC8vIEZpcmUgYSBldmVudCAncmVuZGVyYmVnaW4nLydyZW5kZXJlbmQnIG9uIGJvZHkgZWxlbWVudC5cbiAgcmVuZGVyaW5nICgpIHtcbiAgICBmdW5jdGlvbiBfcmVuZGVyaW5nRW5kICgpIHtcbiAgICAgIC8vIGdldCB3ZWV4IGluc3RhbmNlIHJvb3RcbiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVuZGVyZW5kJykpXG4gICAgICB0aGlzLl9yZW5kZXJpbmdUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlbmRlcmluZ1RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVuZGVyaW5nVGltZXIpXG4gICAgICB0aGlzLl9yZW5kZXJpbmdUaW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgIF9yZW5kZXJpbmdFbmQuYmluZCh0aGlzKSxcbiAgICAgICAgUkVOREVSSU5HX0lOREVOVFxuICAgICAgKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVuZGVyYmVnaW4nKSlcbiAgICAgIHRoaXMuX3JlbmRlcmluZ1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgX3JlbmRlcmluZ0VuZC5iaW5kKHRoaXMpLFxuICAgICAgICBSRU5ERVJJTkdfSU5ERU5UXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGdldENvbXBvbmVudCAocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgfSxcblxuICByZW1vdmVDb21wb25lbnQgKHJlZikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgaWYgKCFyZWYgfHwgIXRoaXMuY29tcG9uZW50TWFwW3JlZl0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyByZW1vdmUgZnJvbSB0aGlzLmNvbXBvbmVudE1hcCBjdXJzaXZlbHlcbiAgICAoZnVuY3Rpb24gX3JlbW92ZUN1cnNpdmVseSAoX3JlZikge1xuICAgICAgY29uc3QgY2hpbGQgPSBzZWxmLmNvbXBvbmVudE1hcFtfcmVmXVxuICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2hpbGQuX2xpc3RlbmVyc1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZC5kYXRhLmNoaWxkcmVuXG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgX3JlbW92ZUN1cnNpdmVseShjaGlsZHJlbltpXS5yZWYpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSBldmVudHMgZnJvbSBfcmVmIGNvbXBvbmVudFxuICAgICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICAgICAgY2hpbGQubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1t0eXBlXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVsZXRlIGNoaWxkLl9saXN0ZW5lcnNcbiAgICAgIGRlbGV0ZSBjaGlsZC5ub2RlLl9saXN0ZW5lcnNcbiAgICAgIC8vIHJlbW92ZSBfcmVmIGNvbXBvbmVudFxuICAgICAgZGVsZXRlIHNlbGYuY29tcG9uZW50TWFwW19yZWZdXG4gICAgfSkocmVmKVxuICB9LFxuXG4gIGNyZWF0ZUVsZW1lbnQgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgbGV0IENvbXBvbmVudFR5cGUgPSB0eXBlTWFwW2RhdGEudHlwZV1cbiAgICBpZiAoIUNvbXBvbmVudFR5cGUpIHtcbiAgICAgIENvbXBvbmVudFR5cGUgPSB0eXBlTWFwWydkaXYnXVxuICAgIH1cblxuICAgIGRhdGEuaW5zdGFuY2VJZCA9IHRoaXMuaWRcbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50VHlwZShkYXRhLCBub2RlVHlwZSlcbiAgICBjb25zdCByZWYgPSBkYXRhLnJlZlxuICAgIHRoaXMuY29tcG9uZW50TWFwW3JlZl0gPSBjb21wb25lbnRcbiAgICBjb21wb25lbnQubm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmJywgcmVmKVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudFxuICB9LFxuXG4gIC8qKlxuICAgKiBjcmVhdGVCb2R5OiBnZW5lcmF0ZSByb290IGNvbXBvbmVudFxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGVsZW1lbnRcbiAgICovXG4gIGNyZWF0ZUJvZHkgKGVsZW1lbnQpIHtcbiAgICBjb25zb2xlLmxvZygnW2g1LXJlbmRlcl0gY3JlYXRlQm9keScsIGVsZW1lbnQpXG4gICAgaWYgKHRoaXMuY29tcG9uZW50TWFwWydfcm9vdCddKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBub2RlVHlwZSA9IGVsZW1lbnQudHlwZVxuICAgIGVsZW1lbnQudHlwZSA9ICdyb290J1xuICAgIGVsZW1lbnQucm9vdElkID0gdGhpcy5nZXRXZWV4SW5zdGFuY2UoKS5yb290SWRcbiAgICBlbGVtZW50LnJlZiA9ICdfcm9vdCdcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgbm9kZVR5cGUpXG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy5nZXRXZWV4SW5zdGFuY2UoKS5yb290SWQpXG4gICAgICAgICAgfHwgZG9jdW1lbnQuYm9keVxuICAgIGJvZHkuYXBwZW5kQ2hpbGQocm9vdC5ub2RlKVxuICAgIHJvb3QuX2FwcGVuZGVkID0gdHJ1ZVxuXG4gICAgdGhpcy5oYW5kbGVBcHBlbmQocm9vdClcbiAgfSxcblxuICBhcHBlbmRDaGlsZCAocGFyZW50UmVmLCBkYXRhKSB7XG4gICAgbGV0IHBhcmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3BhcmVudFJlZl1cblxuICAgIGlmICh0aGlzLmNvbXBvbmVudE1hcFtkYXRhLnJlZl0gfHwgIXBhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudFJlZiA9PT0gJ19yb290JyAmJiAhcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoe1xuICAgICAgICB0eXBlOiAncm9vdCcsXG4gICAgICAgIHJvb3RJZDogdGhpcy5nZXRXZWV4SW5zdGFuY2UoKS5yb290SWQsXG4gICAgICAgIHJlZjogJ19yb290J1xuICAgICAgfSlcbiAgICAgIHBhcmVudC5fYXBwZW5kZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuYXBwZW5kQ2hpbGQoZGF0YSlcblxuICAgIC8vIEluIHNvbWUgcGFyZW50IGNvbXBvbmVudCB0aGUgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kXG4gICAgLy8gYXBwZW5kQ2hpbGQgZGlkbid0IHJldHVybiB0aGUgY29tcG9uZW50IGF0IGFsbCwgdGhlcmVmb3JcbiAgICAvLyBjaGlsZCBtYXliZSBhIHVuZGVmaW5lZCBvYmplY3QuXG4gICAgaWYgKGNoaWxkKSB7XG4gICAgICBjaGlsZC5wYXJlbnRSZWYgPSBwYXJlbnRSZWZcbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgJiYgcGFyZW50Ll9hcHBlbmRlZCkge1xuICAgICAgdGhpcy5oYW5kbGVBcHBlbmQoY2hpbGQpXG4gICAgfVxuICB9LFxuXG4gIC8vIGFwcGVuZENoaWxkcmVuIChyZWYsIGVsZW1lbnRzKSB7XG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgdGhpcy5hcHBlbmRDaGlsZChyZWYsIGVsZW1lbnRzW2ldKVxuICAvLyAgIH1cbiAgLy8gfSxcblxuICByZW1vdmVFbGVtZW50IChyZWYpIHtcbiAgICBpZiAoaXNBcnJheShyZWYpKSB7XG4gICAgICByZXR1cm4gcmVmLm1hcChyID0+IHRoaXMucmVtb3ZlRWxlbWVudChyKSlcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRNYXBbcmVmXVxuICAgIC8vIGZpcmUgZXZlbnQgZm9yIHJlbmRlcmluZyBkb20gb24gYm9keSBlbG1lbnQuXG4gICAgdGhpcy5yZW5kZXJpbmcoKVxuXG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQucGFyZW50UmVmKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtjb21wb25lbnQucGFyZW50UmVmXVxuICAgICAgY29tcG9uZW50Lm9uUmVtb3ZlICYmIGNvbXBvbmVudC5vblJlbW92ZSgpXG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoY29tcG9uZW50KVxuICAgIH1cbiAgICBlbHNlIGlmICghY29tcG9uZW50KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgW2g1LXJlbmRlcl0gcGFyZW50IGNvbXBvbmVudCAnJHtjb21wb25lbnQucGFyZW50UmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICB9XG4gIH0sXG5cbiAgbW92ZUVsZW1lbnQgKHJlZiwgcGFyZW50UmVmLCBpbmRleCkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgICBjb25zdCBuZXdQYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtwYXJlbnRSZWZdXG4gICAgY29uc3Qgb2xkUGFyZW50UmVmID0gY29tcG9uZW50LnBhcmVudFJlZlxuICAgIGxldCBjaGlsZHJlbiwgYmVmb3JlLCBpLCBsXG4gICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGlmICghbmV3UGFyZW50KSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtoNS1yZW5kZXJdIHBhcmVudCBjb21wb25lbnQgJyR7cGFyZW50UmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPCAtMSkge1xuICAgICAgaW5kZXggPSAtMVxuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIGluZGV4IGNhbm5vdCBiZSBsZXNzIHRoYW4gLTEuJylcbiAgICB9XG5cbiAgICAvLyBmaXJlIGV2ZW50IGZvciByZW5kZXJpbmcuXG4gICAgdGhpcy5yZW5kZXJpbmcoKVxuXG4gICAgY2hpbGRyZW4gPSBuZXdQYXJlbnQuZGF0YS5jaGlsZHJlblxuICAgIGlmIChjaGlsZHJlblxuICAgICAgICAmJiBjaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgJiYgaW5kZXggIT09IC0xXG4gICAgICAgICYmIGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBiZWZvcmUgPSB0aGlzLmNvbXBvbmVudE1hcFtuZXdQYXJlbnQuZGF0YS5jaGlsZHJlbltpbmRleF0ucmVmXVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBmcm9tIG9sZFBhcmVudC5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKG9sZFBhcmVudFJlZiAmJiB0aGlzLmNvbXBvbmVudE1hcFtvbGRQYXJlbnRSZWZdKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuY29tcG9uZW50TWFwW29sZFBhcmVudFJlZl0uZGF0YS5jaGlsZHJlblxuICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gcmVmKSB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobCA+IGkpIHtcbiAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5ld1BhcmVudC5pbnNlcnRCZWZvcmUoY29tcG9uZW50LCBiZWZvcmUpXG5cbiAgICBjb21wb25lbnQub25Nb3ZlICYmIGNvbXBvbmVudC5vbk1vdmUocGFyZW50UmVmLCBpbmRleClcbiAgfSxcblxuICBpbnNlcnRCZWZvcmUgKHJlZiwgZGF0YSkge1xuICAgIGxldCBjaGlsZCwgcGFyZW50XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5jb21wb25lbnRNYXBbcmVmXVxuICAgIGNoaWxkID0gdGhpcy5jb21wb25lbnRNYXBbZGF0YS5yZWZdXG4gICAgYmVmb3JlICYmIChwYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtiZWZvcmUucGFyZW50UmVmXSlcbiAgICBpZiAoY2hpbGQgfHwgIXBhcmVudCB8fCAhYmVmb3JlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjaGlsZCA9IHRoaXMuY3JlYXRlRWxlbWVudChkYXRhKVxuICAgIGlmIChjaGlsZCkge1xuICAgICAgY2hpbGQucGFyZW50UmVmID0gYmVmb3JlLnBhcmVudFJlZlxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBvbmVudE1hcFtiZWZvcmUucGFyZW50UmVmXS5fYXBwZW5kZWQpIHtcbiAgICAgIHRoaXMuaGFuZGxlQXBwZW5kKGNoaWxkKVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogYWRkRWxlbWVudFxuICAgKiBJZiBpbmRleCBpcyBsYXJnZXQgdGhhbiBhbnkgY2hpbGQncyBpbmRleCwgdGhlXG4gICAqIGVsZW1lbnQgd2lsbCBiZSBhcHBlbmRlZCBiZWhpbmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRSZWZcbiAgICogQHBhcmFtIHtvYmp9IGVsZW1lbnQgKGRhdGEgb2YgdGhlIGNvbXBvbmVudClcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqL1xuICBhZGRFbGVtZW50IChwYXJlbnRSZWYsIGVsZW1lbnQsIGluZGV4KSB7XG4gICAgLy8gZmlyZSBldmVudCBmb3IgcmVuZGVyaW5nIGRvbSBvbiBib2R5IGVsbWVudC5cbiAgICB0aGlzLnJlbmRlcmluZygpXG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtwYXJlbnRSZWZdXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5kYXRhLmNoaWxkcmVuXG4gICAgLy8gLTEgbWVhbnMgYXBwZW5kIGFzIHRoZSBsYXN0LlxuICAgIGlmIChpbmRleCA8IC0xKSB7XG4gICAgICBpbmRleCA9IC0xXG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW5kZXggY2Fubm90IGJlIGxlc3MgdGhhbiAtMS4nKVxuICAgIH1cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICYmIGNoaWxkcmVuLmxlbmd0aCA+IGluZGV4XG4gICAgICAgICYmIGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoY2hpbGRyZW5baW5kZXhdLnJlZiwgZWxlbWVudClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHBhcmVudFJlZiwgZWxlbWVudClcbiAgICB9XG4gIH0sXG5cbiAgYWRkRXZlbnQgKHJlZiwgdHlwZSkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtoNS1yZW5kZXJdIGNvbXBvbmVudCBvZiByZWYgJyR7cmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICB9XG4gICAgY29tcG9uZW50LmJpbmRFdmVudHMoW3R5cGVdKVxuICB9LFxuXG4gIHJlbW92ZUV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtyZWZdXG4gICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGNvbXBvbmVudC51bmJpbmRFdmVudHMoW3R5cGVdKVxuICB9LFxuXG4gIHVwZGF0ZUF0dHJzIChyZWYsIGF0dHJzKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRNYXBbcmVmXVxuICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihgW2g1LXJlbmRlcl0gY29tcG9uZW50IG9mIHJlZiAnJHtyZWZ9JyBkb2VzIG5vdCBleGlzdC5gKVxuICAgIH1cbiAgICBjb21wb25lbnQudXBkYXRlQXR0cnMoYXR0cnMpXG4gIH0sXG5cbiAgLy8gc2V0U3R5bGUgKHJlZiwga2V5LCB2YWx1ZSkge1xuICAvLyAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgLy8gICBpZiAoIWNvbXBvbmVudCkge1xuICAvLyAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtoNS1yZW5kZXJdIGNvbXBvbmVudCBvZiByZWYgJyR7cmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgLy8gICB9XG4gIC8vICAgY29tcG9uZW50LnVwZGF0ZVN0eWxlKHsgW2tleV06IHZhbHVlIH0pXG4gIC8vIH0sXG5cbiAgdXBkYXRlU3R5bGUgKHJlZiwgc3R5bGUpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtyZWZdXG4gICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGNvbXBvbmVudC51cGRhdGVTdHlsZShzdHlsZSlcbiAgfSxcblxuICBoYW5kbGVBcHBlbmQgKGNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudC5fYXBwZW5kZWQgPSB0cnVlXG4gICAgY29tcG9uZW50Lm9uQXBwZW5kICYmIGNvbXBvbmVudC5vbkFwcGVuZCgpXG5cbiAgICAvLyBpbnZva2Ugb25BcHBlbmQgb24gY2hpbGRyZW4gcmVjdXJzaXZlbHlcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbXBvbmVudC5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jb21wb25lbnRNYXBbY2hpbGRyZW5baV0ucmVmXVxuICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUFwcGVuZChjaGlsZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdhdGNoIGFwcGVhci9kaXNhcHBlYXIgb2YgdGhlIGNvbXBvbmVudCBpZiBuZWVkZWRcbiAgICB3YXRjaElmTmVlZGVkKGNvbXBvbmVudClcblxuICAgIC8vIGRvIGxhenlsb2FkIGlmIG5lZWRlZFxuICAgIGNvbXBvbmVudC5maXJlTGF6eWxvYWQoKVxuICAgIC8vIGxhenlsb2FkLnN0YXJ0SWZOZWVkZWQoY29tcG9uZW50KTtcbiAgfSxcblxuICBjcmVhdGVGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd3ZWV4OmNyZWF0ZWZpbmlzaCcpKVxuICB9LFxuXG4gIHVwZGF0ZUZpbmlzaCAoY2FsbGJhY2spIHtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3dlZXg6dXBkYXRlZmluaXNoJykpXG4gIH0sXG5cbiAgcmVmcmVzaEZpbmlzaCAoY2FsbGJhY2spIHtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3dlZXg6cmVmcmVzaGZpbmlzaCcpKVxuICB9XG5cbn1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGdsb2JhbCBYTUxIdHRwUmVxdWVzdCAqL1xuXG4ndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gbG9hZEJ5WEhSIChjb25maWcsIGNhbGxiYWNrKSB7XG4gIGlmICghY29uZmlnLnNvdXJjZSkge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcigneGhyIGxvYWRlcjogbWlzc2luZyBjb25maWcuc291cmNlLicpKVxuICB9XG4gIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCBjb25maWcuc291cmNlKVxuICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHRoaXMucmVzcG9uc2VUZXh0KVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpXG4gIH1cbiAgeGhyLnNlbmQoKVxufVxuXG5mdW5jdGlvbiBsb2FkQnlKc29ucCAoY29uZmlnLCBjYWxsYmFjaykge1xuICBpZiAoIWNvbmZpZy5zb3VyY2UpIHtcbiAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2pzb25wIGxvYWRlcjogbWlzc2luZyBjb25maWcuc291cmNlLicpKVxuICB9XG4gIGNvbnN0IGNhbGxiYWNrTmFtZSA9IGNvbmZpZy5qc29ucENhbGxiYWNrIHx8ICd3ZWV4SnNvbnBDYWxsYmFjaydcbiAgd2luZG93W2NhbGxiYWNrTmFtZV0gPSBmdW5jdGlvbiAoY29kZSkge1xuICAgIGlmIChjb2RlKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBjb2RlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignbG9hZCBieSBqc29ucCBlcnJvcicpKVxuICAgIH1cbiAgfVxuICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICBzY3JpcHQuc3JjID0gZGVjb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5zb3VyY2UpXG4gIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCdcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpXG59XG5cbmZ1bmN0aW9uIGxvYWRCeVNvdXJjZUNvZGUgKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgLy8gc3JjIGlzIHRoZSBqc2J1bmRsZS5cbiAgLy8gbm8gbmVlZCB0byBmZXRjaCBmcm9tIGFueXdoZXJlLlxuICBpZiAoY29uZmlnLnNvdXJjZSkge1xuICAgIGNhbGxiYWNrKG51bGwsIGNvbmZpZy5zb3VyY2UpXG4gIH1cbiAgZWxzZSB7XG4gICAgY2FsbGJhY2sobmV3IEVycm9yKCdzb3VyY2UgY29kZSBsYW9kZXI6IG1pc3NpbmcgY29uZmlnLnNvdXJjZS4nKSlcbiAgfVxufVxuXG5jb25zdCBjYWxsYmFja01hcCA9IHtcbiAgeGhyOiBsb2FkQnlYSFIsXG4gIGpzb25wOiBsb2FkQnlKc29ucCxcbiAgc291cmNlOiBsb2FkQnlTb3VyY2VDb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkIChvcHRpb25zLCBjYWxsYmFjaykge1xuICBjb25zdCBsb2FkRm4gPSBjYWxsYmFja01hcFtvcHRpb25zLmxvYWRlcl1cbiAgbG9hZEZuKG9wdGlvbnMsIGNhbGxiYWNrKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJMb2FkZXIgKG5hbWUsIGxvYWRlckZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBsb2FkZXJGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2tNYXBbbmFtZV0gPSBsb2FkZXJGdW5jXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBBIHNpbXBsZSB2aXJ0dWFsIGRvbSBpbXBsZW1lbnRhdGlvblxuICovXG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICcuL2NvbXBvbmVudE1hbmFnZXInXG5cbmV4cG9ydCB7IENvbXBvbmVudE1hbmFnZXIgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgTk9UX1BYX05VTUJFUl9QUk9QRVJUSUVTID0gWydmbGV4JywgJ29wYWNpdHknLCAnekluZGV4JywgJ2ZvbnRXZWlnaHQnXVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyU3R5bGVzIChzdHlsZXMpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdHlsZXNba2V5XVxuICAgIGNvbnN0IHBhcnNlciA9IHRoaXMuZ2V0RmlsdGVycyhrZXkpW3R5cGVvZiB2YWx1ZV1cbiAgICBpZiAodHlwZW9mIHBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3R5bGVzW2tleV0gPSBwYXJzZXIodmFsdWUpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJzIChrZXkpIHtcbiAgaWYgKE5PVF9QWF9OVU1CRVJfUFJPUEVSVElFUy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwgKyAncHgnXG4gICAgfSxcbiAgICBzdHJpbmc6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIC8vIHN0cmluZyBvZiBhIG51bWJlciBzdWZmaXhlZCB3aXRoIGEgJ3B4JyBvciAnd3gnIHVuaXQuIG9yaWdpbmFsIFJlZ0V4cCBpcyAvXi0/XFxkKlxcLj9cXGQrKD86cHgpPyQvXG4gICAgICBjb25zdCBtYXRjaCA9IHZhbC5tYXRjaCgvXihbKy1dP1xcZC4qKSsoW3Asd114KSQvKVxuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBpZiAobWF0Y2hbMl0gPT09ICdweCcpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXRjaFsxXSkgKyAncHgnXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWF0Y2hbMl0gPT09ICd3eCcpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXRjaFsxXSkgKiBnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VQaXhlbFJhdGlvICsgJ3B4J1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoa2V5Lm1hdGNoKC90cmFuc2Zvcm0vKSAmJiB2YWwubWF0Y2goL3RyYW5zbGF0ZS8pKSB7XG4gICAgICAgIGxldCByZXQgPSB2YWwucmVwbGFjZSgvXFxkKlxcLj9cXGQrcHgvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHBhcnNlRmxvYXQobWF0Y2gpKSArICdweCdcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJldC5tYXRjaCgvd3gvKSkge1xuICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKC9cXGQqXFwuP1xcZCt3eC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChwYXJzZUZsb2F0KG1hdGNoKSkgKiBnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VQaXhlbFJhdGlvICsgJ3B4J1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFxuICAgICAgfVxuICAgICAgaWYgKGtleS5tYXRjaCgvXmJvcmRlciQvKSAmJiB2YWwubWF0Y2goL15cXGQrKD86W3cscF14KT9cXHMrLykpIHtcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoL14oXFxkKyg/Olt3LHBdeCk/KS8sIGZ1bmN0aW9uICgkMCwgJDEpIHtcbiAgICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdCgkMSkgKiAodmFsLm1hdGNoKC9eXFxkKyg/Ond4KSsvKSA/IGdsb2JhbC5XWEVudmlyb25tZW50LmRldmljZVBpeGVsUmF0aW8gOiAxKVxuICAgICAgICAgIHJldHVybiB2ICsgJ3B4J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbFxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgZXh0ZW5kLCBjYW1lbFRvS2ViYWIgfSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCB7IGdldEZpbHRlcnMgfSBmcm9tICcuL3ZhbHVlRmlsdGVyJ1xuXG5sZXQgcHNldWRvSWQgPSAwXG5mdW5jdGlvbiBnZXRQc2V1ZG9JZCAoKSB7XG4gIHJldHVybiAnJyArIChwc2V1ZG9JZCsrKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlIChub2RlVHlwZSkge1xuICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlVHlwZSB8fCAnZGl2Jylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoaWxkcmVuICgpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgY29uc3QgcGFyZW50UmVmID0gdGhpcy5kYXRhLnJlZlxuICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgbGV0IGlzRmxleCA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRyZW5baV0uaW5zdGFuY2VJZCA9IHRoaXMuZGF0YS5pbnN0YW5jZUlkXG4gICAgICBjb25zdCBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChjaGlsZHJlbltpXSlcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG4gICAgICBjaGlsZC5wYXJlbnRSZWYgPSBwYXJlbnRSZWZcbiAgICAgIGlmICghaXNGbGV4XG4gICAgICAgICYmIGNoaWxkLmRhdGEuc3R5bGVcbiAgICAgICAgJiYgY2hpbGQuZGF0YS5zdHlsZS5oYXNPd25Qcm9wZXJ0eSgnZmxleCcpXG4gICAgICApIHtcbiAgICAgICAgaXNGbGV4ID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZENoaWxkIChkYXRhKSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICBjb25zdCBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChkYXRhKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgLy8gdXBkYXRlIHRoaXMuZGF0YS5jaGlsZHJlblxuICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICB0aGlzLmRhdGEuY2hpbGRyZW4gPSBbZGF0YV1cbiAgfVxuICBlbHNlIHtcbiAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gIH1cbiAgcmV0dXJuIGNoaWxkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKGNoaWxkLCBiZWZvcmUpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgbGV0IGkgPSAwXG4gIGxldCBsXG4gIGxldCBpc0FwcGVuZCA9IGZhbHNlXG5cbiAgLy8gdXBkYXRlIHRoaXMuZGF0YS5jaGlsZHJlblxuICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgIWJlZm9yZSkge1xuICAgIGlzQXBwZW5kID0gdHJ1ZVxuICB9XG4gIGVsc2Uge1xuICAgIGZvciAobCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gYmVmb3JlLmRhdGEucmVmKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpID09PSBsKSB7XG4gICAgICBpc0FwcGVuZCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBpZiAoaXNBcHBlbmQpIHtcbiAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICBjaGlsZHJlbi5wdXNoKGNoaWxkLmRhdGEpXG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKGJlZm9yZS5maXhlZFBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLm5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLm5vZGUsIGJlZm9yZS5maXhlZFBsYWNlaG9sZGVyKVxuICAgIH1cbiAgICBlbHNlIGlmIChiZWZvcmUuc3RpY2t5UGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLm5vZGUpXG4gICAgfVxuICAgIGNoaWxkcmVuLnNwbGljZShpLCAwLCBjaGlsZC5kYXRhKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDaGlsZCAoY2hpbGQpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgLy8gcmVtb3ZlIGZyb20gdGhpcy5kYXRhLmNoaWxkcmVuXG4gIGxldCBpID0gMFxuICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGxldCBsXG4gICAgZm9yIChsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoY2hpbGRyZW5baV0ucmVmID09PSBjaGlsZC5kYXRhLnJlZikge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA8IGwpIHtcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxKVxuICAgIH1cbiAgfVxuICAvLyByZW1vdmUgZnJvbSBjb21wb25lbnRNYXAgcmVjdXJzaXZlbHlcbiAgY29tcG9uZW50TWFuYWdlci5yZW1vdmVDb21wb25lbnQoY2hpbGQuZGF0YS5yZWYpXG4gIGNoaWxkLnVuc2V0UG9zaXRpb24oKVxuICBjaGlsZC5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQubm9kZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChhdHRycykge1xuICAvLyBOb3Rl77yaYXR0ciBtdXN0IGJlIGluamVjdGVkIGludG8gdGhlIGRvbSBlbGVtZW50IGJlY2F1c2VcbiAgLy8gaXQgd2lsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBvdXRzaWRlIGRldmVsb3BlciBieSBldmVudC50YXJnZXQuYXR0ci5cbiAgaWYgKCF0aGlzLm5vZGUuYXR0cikge1xuICAgIHRoaXMubm9kZS5hdHRyID0ge31cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cnNba2V5XVxuICAgIGNvbnN0IGF0dHJTZXR0ZXIgPSB0aGlzLmF0dHJba2V5XVxuICAgIGlmICh0eXBlb2YgYXR0clNldHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXR0clNldHRlci5jYWxsKHRoaXMsIHZhbHVlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0aGlzLm5vZGVba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKVxuICAgICAgfVxuICAgICAgdGhpcy5ub2RlLmF0dHJba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdHlsZSAoc3R5bGUpIHtcbiAgY29uc3QgcHNldWRvRGF0YSA9IHt9XG4gIGZvciAoY29uc3Qga2V5IGluIHN0eWxlKSB7XG4gICAgbGV0IHZhbHVlID0gc3R5bGVba2V5XVxuICAgIGNvbnN0IHBzZXVkb0NsYXNzUmVnID0gL14oW146XSspKCg/OjpbXjpdKykrKS9cbiAgICBjb25zdCBtYXRjaCA9IGtleS5tYXRjaChwc2V1ZG9DbGFzc1JlZylcbiAgICBsZXQgc3R5bGVOYW1lLCBwc2V1ZG9OYW1lXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBzdHlsZU5hbWUgPSBtYXRjaFsxXVxuICAgICAgcHNldWRvTmFtZSA9IG1hdGNoWzJdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3R5bGVOYW1lID0ga2V5XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVTZXR0ZXIgPSB0aGlzLnN0eWxlW3N0eWxlTmFtZV1cbiAgICBpZiAodHlwZW9mIHN0eWxlU2V0dGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZVNldHRlci5jYWxsKHRoaXMsIHZhbHVlKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgcGFyc2VyID0gZ2V0RmlsdGVycyhzdHlsZU5hbWUpW3R5cGVvZiB2YWx1ZV1cbiAgICBpZiAodHlwZW9mIHBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFsdWUgPSBwYXJzZXIodmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5ub2RlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAocHNldWRvRGF0YVtwc2V1ZG9OYW1lXSkge1xuICAgICAgcHNldWRvRGF0YVtwc2V1ZG9OYW1lXVtzdHlsZU5hbWVdID0gdmFsdWVcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwc2V1ZG9EYXRhW3BzZXVkb05hbWVdID0geyBbc3R5bGVOYW1lXTogdmFsdWUgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwc2V1ZG9EYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgcHJvY2Vzc1BzZXVkb0NsYXNzKHRoaXMsICdkYXRhLXBzZXVkby1pZCcsIHBzZXVkb0RhdGEpXG4gIH1cbn1cblxuLy8gbW9kaWZ5IHN0eWxlcyBvZiBwc2V1ZG8gY2xhc3MuXG5mdW5jdGlvbiBwcm9jZXNzUHNldWRvQ2xhc3MgKGNvbXBvbmVudCwgaWROYW1lLCBwc2V1ZG9EYXRhKSB7XG4gIGxldCBwc2V1ZG9JZCA9IGNvbXBvbmVudC5ub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1wc2V1ZG8taWQnKVxuXG4gIGZ1bmN0aW9uIGdldENzc1RleHQgKHNlbGVjdG9yLCBydWxlc09iaikge1xuICAgIC8vIFRPRE86IG11c3QgcHJvY2VzcyB2ZW5kb3JzIGlmIG5lZWRlZC5cbiAgICAvLyAhaW1wb3J0YW50IGlzIG5lZWRlZCBzaW5jZSB0aGUgc3R5bGUgcnVsZXMgaXMgaW5saW5lIGZvciBtb3N0IGNvbXBvbmVudHMuXG4gICAgY29uc3QgcnVsZXNUZXh0ID0gT2JqZWN0LmtleXMocnVsZXNPYmopLm1hcChrZXkgPT4gYCR7Y2FtZWxUb0tlYmFiKGtleSl9OiR7cnVsZXNPYmpba2V5XX0haW1wb3J0YW50O2ApLmpvaW4oJycpXG4gICAgcmV0dXJuIGAke3NlbGVjdG9yfXske3J1bGVzVGV4dH19YFxuICB9XG5cbiAgaWYgKCFwc2V1ZG9JZCkge1xuICAgIHBzZXVkb0lkID0gZ2V0UHNldWRvSWQoKVxuICAgIGNvbXBvbmVudC5ub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1wc2V1ZG8taWQnLCBwc2V1ZG9JZClcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJ1xuICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnZGF0YS1wc2V1ZG8taWQnLCBwc2V1ZG9JZClcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlKVxuICAgIGNvbnN0IGNzc1RleHQgPSBPYmplY3Qua2V5cyhwc2V1ZG9EYXRhKS5tYXAocHNldWRvID0+IHtcbiAgICAgIGNvbnN0IHJ1bGVzID0gcHNldWRvRGF0YVtwc2V1ZG9dXG4gICAgICByZXR1cm4gZ2V0Q3NzVGV4dChgW2RhdGEtcHNldWRvLWlkPVwiJHtwc2V1ZG9JZH1cIl0ke3BzZXVkb31gLCBydWxlcylcbiAgICB9KS5qb2luKCcnKVxuICAgIHJldHVybiBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NUZXh0KSlcbiAgfVxuXG4gIGNvbnN0IHN0eWxlU2hlZXRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuc3R5bGVTaGVldHMgfHwgW10pXG4gICAgLmZpbHRlcihzdHlsZSA9PiBzdHlsZS5vd25lck5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXBzZXVkby1pZCcpID09PSBwc2V1ZG9JZClcbiAgaWYgKCFzdHlsZVNoZWV0cyB8fCBzdHlsZVNoZWV0cy5sZW5ndGggPD0gMCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0WzBdXG4gIGNvbnN0IHJ1bGVzID0gc3R5bGVTaGVldC5jc3NSdWxlcyB8fCBzdHlsZVNoZWV0LnJ1bGVzXG4gIE9iamVjdC5rZXlzKHBzZXVkb0RhdGEpLmZvckVhY2gocHNldWRvID0+IHtcbiAgICBjb25zdCBkYXRhID0gcHNldWRvRGF0YVtwc2V1ZG9dXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgW2RhdGEtcHNldWRvLWlkPVwiJHtwc2V1ZG9JZH1cIl0ke3BzZXVkb31gXG4gICAgY29uc3QgcmVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocnVsZXMpLnJlZHVjZSgocmVzLCBydWxlLCBpZHgpID0+IHtcbiAgICAgIChydWxlLnNlbGVjdG9yVGV4dCA9PT0gc2VsZWN0b3IpICYmIChyZXMuaWR4ID0gaWR4KVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0sIHsgaWR4OiAtMSB9KVxuICAgIGNvbnN0IHsgaWR4IH0gPSByZXNcbiAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgY29uc3QgcHNldWRvUnVsZSA9IHJ1bGVzW2lkeF1cbiAgICAgIGNvbnN0IG1hdGNoID0gcHNldWRvUnVsZS5jc3NUZXh0Lm1hdGNoKC9eW157XStcXHsoW159XSspXFx9LylcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBydWxlc0RhdGEgPSBtYXRjaFsxXS5zcGxpdCgnOycpLnJlZHVjZSgocmVzLCBzdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCgvKFxcUyspXFxzKjpcXHMqKFxcUyspLylcbiAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0gJiYgbWF0Y2hbMl0pIHtcbiAgICAgICAgICAgIHJlc1ttYXRjaFsxXV0gPSBtYXRjaFsyXVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzXG4gICAgICAgIH0sIHt9KVxuICAgICAgICBleHRlbmQocnVsZXNEYXRhLCBkYXRhKVxuICAgICAgICBPYmplY3Qua2V5cyhydWxlc0RhdGEpLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgaWYgKCFydWxlc0RhdGFbcnVsZV0pIHsgZGVsZXRlIHJ1bGVzRGF0YVtydWxlXSB9XG4gICAgICAgIH0pXG4gICAgICAgIHN0eWxlU2hlZXQuZGVsZXRlUnVsZShpZHgpXG4gICAgICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShnZXRDc3NUZXh0KHNlbGVjdG9yLCBydWxlc0RhdGEpLCBydWxlcy5sZW5ndGggLSAxKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShnZXRDc3NUZXh0KHNlbGVjdG9yLCBkYXRhKSwgcnVsZXMubGVuZ3RoKVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRFdmVudHMgKGV2dHMpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgY29uc3Qgd2VleEluc3RhbmNlID0gdGhpcy5nZXRXZWV4SW5zdGFuY2UoKVxuICBldnRzLm1hcChmdW5jdGlvbiAoZXZ0KSB7XG4gICAgY29uc3QgZnVuYyA9IHNlbGYuZXZlbnRbZXZ0XSB8fCB7fVxuICAgIGNvbnN0IHNldHRlciA9IGZ1bmMuc2V0dGVyXG4gICAgaWYgKHNldHRlcikge1xuICAgICAgc2VsZi5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBzZXR0ZXIpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gd2VleEluc3RhbmNlLnNlbmRlclxuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIGRvIHN0b3AgYnViYmxpbmcuXG4gICAgICAvLyBkbyBub3QgcHJldmVudCBkZWZhdWx0LCBvdGhlcndpc2UgdGhlIHRvdWNoc3RhcnRcbiAgICAgIC8vIGV2ZW50IHdpbGwgbm8gbG9uZ2VyIHRyaWdnZXIgYSBjbGljayBldmVudFxuICAgICAgaWYgKGUuX2FscmVhZHlUcmlnZ2VyZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBlLl9hbHJlYWR5VHJpZ2dlcmVkID0gdHJ1ZVxuICAgICAgY29uc3QgZXZlbnQgPSBleHRlbmQoe30sIGUpXG4gICAgICBldmVudC50YXJnZXQgPSBzZWxmLmRhdGFcbiAgICAgIHNlbmRlci5maXJlRXZlbnQoc2VsZi5kYXRhLnJlZiwgZXZ0LCB7XG4gICAgICAgIGV4dHJhOiBmdW5jLmV4dHJhICYmIGZ1bmMuZXh0cmEuYmluZChzZWxmKSxcbiAgICAgICAgdXBkYXRvcjogZnVuYy51cGRhdG9yICYmIGZ1bmMudXBkYXRvci5iaW5kKHNlbGYpXG4gICAgICB9LCBldmVudClcbiAgICB9XG4gICAgc2VsZi5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lciwgZmFsc2UsIGZhbHNlKVxuICAgIGxldCBsaXN0ZW5lcnMgPSBzZWxmLl9saXN0ZW5lcnNcbiAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXJzID0gc2VsZi5fbGlzdGVuZXJzID0ge31cbiAgICAgIHNlbGYubm9kZS5fbGlzdGVuZXJzID0ge31cbiAgICB9XG4gICAgbGlzdGVuZXJzW2V2dF0gPSBsaXN0ZW5lclxuICAgIHNlbGYubm9kZS5fbGlzdGVuZXJzW2V2dF0gPSBsaXN0ZW5lclxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kRXZlbnRzIChldnRzKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGV2dHMubWFwKGZ1bmN0aW9uIChldnQpIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuX2xpc3RlbmVyc1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgc2VsZi5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lcilcbiAgICAgIHNlbGYuX2xpc3RlbmVyc1tldnRdID0gbnVsbFxuICAgICAgc2VsZi5ub2RlLl9saXN0ZW5lcnNbZXZ0XSA9IG51bGxcbiAgICB9XG4gIH0pXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBIVE1MRWxlbWVudCAqL1xuXG5pbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuXG5jb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnRcbmNvbnN0IGlzRmlyZWZveCA9ICEhdWEubWF0Y2goL0ZpcmVmb3gvaSlcbmNvbnN0IGlzSUVNb2JpbGUgPSAhIXVhLm1hdGNoKC9JRU1vYmlsZS9pKVxuY29uc3QgY3NzUHJlZml4ID0gaXNGaXJlZm94ID8gJy1tb3otJyA6IGlzSUVNb2JpbGUgPyAnLW1zLScgOiAnLXdlYmtpdC0nXG5jb25zdCBzdHlsZVByZWZpeCA9IGlzRmlyZWZveCA/ICdNb3onIDogaXNJRU1vYmlsZSA/ICdtcycgOiAnd2Via2l0J1xuXG4vLyBldmVuIHN0aWNreSwgc3RpbGwgbm90IHdvcmsuIHNvLi4uXG4vLyBjb25zdCBzdXBwb3J0U3RpY2t5ID0gZGV0ZWN0U3RpY2t5KClcblxuZnVuY3Rpb24gYmluZFBhcmVudCAoc3RpY2t5KSB7XG4gIGlmICghc3RpY2t5IGluc3RhbmNlb2YgU3RpY2t5KSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgc2Nyb2xsZXIgPSBzdGlja3kuY29tcG9uZW50LmdldFBhcmVudFNjcm9sbGVyKClcbiAgbGV0IHB0XG4gIGlmIChzY3JvbGxlcikge1xuICAgIHB0ID0gc3RpY2t5LnBhcmVudCA9IHNjcm9sbGVyXG4gICAgc3RpY2t5LnBhcmVudEVsZW1lbnQgPSBwdC5ub2RlXG4gIH1cbiAgZWxzZSB7XG4gICAgcHQgPSBzdGlja3kucGFyZW50ID0gc3RpY2t5LmNvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKClcbiAgICBzdGlja3kucGFyZW50RWxlbWVudCA9IHB0XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U3RpY2t5IChzdGlja3kpIHtcbiAgY29uc3QgY29tcCA9IHN0aWNreS5jb21wb25lbnRcbiAgY29uc3QgZWxlbWVudCA9IHN0aWNreS5lbGVtZW50XG4gIGNvbXAuc3RpY2t5UGxhY2Vob2xkZXIgPSBzdGlja3kuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgY29tcC5zdGlja3lQbGFjZWhvbGRlci5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcmVmJylcbiAgY29tcC5zdGlja3lQbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCd3ZWV4LXN0aWNreS1wbGFjZWhvbGRlcicpXG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnd2VleC1zdGlja3knKVxuICBzdGlja3kucHJlTWFyZ2luVG9wID0gZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3BcbiAgc3RpY2t5LnByZVRvcCA9IGVsZW1lbnQuc3R5bGUudG9wXG4gIGVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gc3RpY2t5LnRvcCB8fCAnMCcgKyAncHgnXG5cbiAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShcbiAgICBjb21wLnN0aWNreVBsYWNlaG9sZGVyLCBlbGVtZW50KVxuICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICBsZXQgdG9wXG4gIGlmIChzdGlja3kucGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICB0b3AgPSAwXG4gIH1cbiAgZWxzZSB7XG4gICAgdG9wID0gc3RpY2t5LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gIH1cbiAgZWxlbWVudC5zdHlsZS50b3AgPSB0b3AgKyAncHgnXG4gIHN0aWNreS5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpXG59XG5cbi8qKlxuICogdW5zZXRTdGlja3lcbiAqIEBwYXJhbSAge1N0aWNreX0gc3RpY2t5IDogYSBzdGlja3kgaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHBvc2l0aW9uIDogcG9zaXRpb24gcmVwbGFjaW5nIHdpdGggKGRlZmF1bHQ6ICdyZWxhdGl2ZScpLlxuICovXG5mdW5jdGlvbiB1bnNldFN0aWNreSAoc3RpY2t5LCBwb3NpdGlvbikge1xuICBjb25zdCBjb21wID0gc3RpY2t5LmNvbXBvbmVudFxuICBjb25zdCBlbGVtZW50ID0gc3RpY2t5LmVsZW1lbnRcbiAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uICsgJycgOiBzdGlja3kucHJlUG9zaXRpb25cbiAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uXG4gIGVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gc3RpY2t5LnByZU1hcmdpblRvcCB8fCAnJ1xuICBlbGVtZW50LnN0eWxlLnRvcCA9IHN0aWNreS5wcmVUb3AgfHwgJydcbiAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd3ZWV4LXN0aWNreScpXG4gIGlmIChjb21wLnN0aWNreVBsYWNlaG9sZGVyKSB7XG4gICAgY29uc3QgcGFyZW50ID0gY29tcC5zdGlja3lQbGFjZWhvbGRlci5wYXJlbnROb2RlXG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbGVtZW50LCBjb21wLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgIHBhcmVudC5yZW1vdmVDaGlsZChjb21wLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgIGNvbXAuc3RpY2t5UGxhY2Vob2xkZXIgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgIFN0aWNreVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudDogYSB3ZWV4IGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIGNvbmZpZyBvcHRpb25zLlxuICogIC0gb3B0aW9ucy5jb21wb25lbnQgKG9wdGlvbmFsKSBpbmNhc2UgdGhlIGNvbXBvbmVudCBwYXJhbSBpcyBtaXNzaW5nLCBpdCBjYW5cbiAqICAgIGJlIHNwZWNpZmllZCBpbiB0aGlzIG9wdGlvbnMuXG4gKiAgLSBvcHRpb25zLndpdGhpblBhcmVudD1mYWxzZe+8iG9wdGlvbmFs77yMb25seSBmb3IgQW5kcm9pZO+8iXRoZSBzdGlja3kgZWZmZWN0IGlzXG4gKiAgICBsaW1pdGVkIHdpdGhpbiB0aGUgcGFyZW50IGVsZW1lbnQgb25seS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU3RpY2t5IChjb21wb25lbnQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnRcbiAgdGhpcy5lbGVtZW50ID0gY29tcG9uZW50Lm5vZGVcbiAgdGhpcy5wcmVQb3NpdGlvbiA9IHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvblxuICB0aGlzLndpdGhpblBhcmVudCA9IG9wdGlvbnMud2l0aGluUGFyZW50IHx8IGZhbHNlXG4gIHRoaXMucGFyZW50ID0gbnVsbFxuICB0aGlzLmluaXQoKVxufVxuXG5TdGlja3kucHJvdG90eXBlID0ge1xuXG4gIGNvbnN0cnVjdG9yOiBTdGlja3ksXG5cbiAgaW5pdCAoKSB7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlXG4gICAgZWxlbWVudFN0eWxlW3N0eWxlUHJlZml4ICsgJ1RyYW5zZm9ybSddID0gJ3RyYW5zbGF0ZVooMCknIC8vIGZpeCBmbGlja2VyaW5nXG4gICAgZWxlbWVudFN0eWxlWyd0cmFuc2Zvcm0nXSA9ICd0cmFuc2xhdGVaKDApJ1xuICAgIGJpbmRQYXJlbnQodGhpcylcbiAgICAvLyBpZiAoc3VwcG9ydFN0aWNreSkge1xuICAgIC8vICAgZWxlbWVudFN0eWxlLnBvc2l0aW9uID0gY3NzUHJlZml4ICsgJ3N0aWNreSdcbiAgICAvLyB9XG4gICAgdGhpcy5fc2ltdWxhdGVTdGlja3koKVxuICAgIHRoaXMuX2JpbmRSZXNpemUoKVxuICB9LFxuXG4gIF9iaW5kUmVzaXplICgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgIGNvbnN0IGlzQW5kcm9pZCA9ICgvYW5kcm9pZC9naSkudGVzdChuYXZpZ2F0b3IuYXBwVmVyc2lvbilcbiAgICBjb25zdCByZXNpemVFdmVudCA9IHNlbGYuX3Jlc2l6ZUV2ZW50ID0gJ29ub3JpZW50YXRpb25jaGFuZ2UnIGluIHdpbmRvd1xuICAgICAgPyAnb3JpZW50YXRpb25jaGFuZ2UnXG4gICAgICA6ICdyZXNpemUnXG4gICAgY29uc3QgcmVzaXplSGFuZGxlciA9IHNlbGYuX3Jlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5yZWZyZXNoKClcbiAgICAgIH0sIGlzQW5kcm9pZCA/IDIwMCA6IDApXG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHJlc2l6ZUV2ZW50LCByZXNpemVIYW5kbGVyLCBmYWxzZSlcbiAgfSxcblxuICAvKipcbiAgICogUmVmcmVzaCBhIGluc3RhbmNlLlxuICAgKiBJZiB3aXRoUGFyZW50IGlzIHRydWUgYW5kIHRoZSBwYXJlbnQnIGhlaWdodCBhbHRlcmVkLCB0aGlzXG4gICAqIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLlxuICAgKi9cbiAgcmVmcmVzaCAoKSB7XG4gICAgLy8gaWYgKHN1cHBvcnRTdGlja3kpIHtcbiAgICAvLyAgIHJldHVyblxuICAgIC8vIH1cbiAgICB0aGlzLl9kZXRhY2goKVxuICAgIHRoaXMuX3NpbXVsYXRlU3RpY2t5KClcbiAgfSxcblxuICBfc2ltdWxhdGVTdGlja3kgKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgY29uc3QgaXNJblNjcm9sbGFibGUgPSB0aGlzLmlzSW5TY3JvbGxhYmxlKClcbiAgICAvLyB0aGUgaW5pdGlhbCB5IG9mZnNldC5cbiAgICB0aGlzLm9mZnNldCA9IChpc0luU2Nyb2xsYWJsZVxuICAgICAgPyB0aGlzLmdldFBhcmVudFNjcm9sbGVyKCkub2Zmc2V0XG4gICAgICA6IHdpbmRvdy5wYWdlWU9mZnNldClcbiAgICAgIHx8IDBcbiAgICBjb25zdCByZWN0VG9wID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxuICAgIGxldCB3cmFwcGVyVG9wID0gMFxuICAgIGlmIChpc0luU2Nyb2xsYWJsZSkge1xuICAgICAgd3JhcHBlclRvcCA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICB9XG4gICAgY29uc3Qgd2l0aGluUGFyZW50ID0gdGhpcy53aXRoaW5QYXJlbnRcbiAgICBjb25zdCB0aHJlc2hvbGRCYXNlID0gcmVjdFRvcCAtIHdyYXBwZXJUb3AgKyB0aGlzLm9mZnNldFxuICAgIC8qKlxuICAgICAqIGN1clN0YXRlOlxuICAgICAqICAgMSAtIG5vcm1hbFxuICAgICAqICAgMiAtIHN0aWNreVxuICAgICAqICAgMyAtIGV4Y2VlZCBwYXJlbnRcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuY3VyU3RhdGUgPSAxXG4gICAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9IHRoaXMuX3Njcm9sbEhhbmRsZXIgPSB0aHJvdHRsZShmdW5jdGlvbiAoZSkge1xuICAgICAgY29uc3QgdGhyZXNob2xkVG9wID0gdGhyZXNob2xkQmFzZVxuICAgICAgY29uc3QgeXBvcyA9IHNlbGYuaXNJblNjcm9sbGFibGUoKSA/IGUub2Zmc2V0IDogd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgICBzZWxmLm9mZnNldCA9IHlwb3NcbiAgICAgIGlmICh5cG9zIDwgdGhyZXNob2xkVG9wKSB7XG4gICAgICAgIGlmIChzZWxmLmN1clN0YXRlICE9PSAxKSB7XG4gICAgICAgICAgdW5zZXRTdGlja3koc2VsZilcbiAgICAgICAgICBzZWxmLmN1clN0YXRlID0gMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgoIXdpdGhpblBhcmVudCAmJiB5cG9zID49IHRocmVzaG9sZFRvcCkgfHxcbiAgICAgICAgKHdpdGhpblBhcmVudCAmJiB5cG9zID49IHRocmVzaG9sZFRvcC8qICYmIHlwb3MgPCB0aHJlc2hvbGRCb3R0b20qLykpIHtcbiAgICAgICAgaWYgKHNlbGYuY3VyU3RhdGUgIT09IDIpIHtcbiAgICAgICAgICBzZXRTdGlja3koc2VsZilcbiAgICAgICAgICBzZWxmLmN1clN0YXRlID0gMlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTAwKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyLCBmYWxzZSlcblxuICAgIC8vIHRha2UgZWZmZWN0IG9uY2UgaW5pdGVkIGFmdGVyIGEgZGVzdHJveW1lbnQuXG4gICAgaWYgKHRoaXMub2Zmc2V0ID49IHRocmVzaG9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGR1bW15RXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpXG4gICAgICBkdW1teUV2ZW50LmluaXRFdmVudCgnc2Nyb2xsJywgdHJ1ZSwgdHJ1ZSlcbiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGR1bW15RXZlbnQpXG4gICAgfVxuICB9LFxuXG4gIF9kZXRhY2ggKHBvc2l0aW9uKSB7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uICsgJycgOiAncmVsYXRpdmUnXG4gICAgLy8gaWYgKHN1cHBvcnRTdGlja3kpIHtcbiAgICAvLyAgIHJldHVyblxuICAgIC8vIH1cbiAgICBpZiAodGhpcy5jdXJTdGF0ZSA9PT0gMikge1xuICAgICAgdW5zZXRTdGlja3kodGhpcylcbiAgICB9XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX3Njcm9sbEhhbmRsZXIsIGZhbHNlKVxuICB9LFxuXG4gIGlzSW5TY3JvbGxhYmxlICgpIHtcbiAgICBpZiAoIXRoaXMuX2lzSW5TY3JvbGxhYmxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9pc0luU2Nyb2xsYWJsZSA9IHRoaXMuY29tcG9uZW50LmlzSW5TY3JvbGxhYmxlKClcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVGhlIHBhcmVudFJlZiBpcyBub3QgaW4gY29tcG9uZW50TWFuYWdlcidzIGNvbXBvbmVudE1hcCB5ZXQsIHNvXG4gICAgICAgIC8vIGl0J3MgaW52YWxpZCB0byBnZXQgdGhlIHBhcmVudCBhbmQgdGVzdCBpZiBpdCdzIHNjcm9sbGFibGUuXG4gICAgICAgIC8vIFRoaXMgaXMgbW9zdCBsaWtlbHkgdG8gaGFwcGVuIGluIHRoZSBjYXNlIHRoYXQgdGhlIHBhcmVudFxuICAgICAgICAvLyBjb21wb25lbnQncyAnYXBwZW5kJyBhdHRyaWJ1dGUgaXMgc2V0IHRvICd0cmVlJy5cbiAgICAgICAgY29uc29sZS5lcnJvcignaXNJblNjcm9sbGFibGUgaXMgbm90IHlldCBhdmFpbGFibGUgdG8gY2FsbCcsIGVycilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lzSW5TY3JvbGxhYmxlXG4gIH0sXG5cbiAgZ2V0UGFyZW50U2Nyb2xsZXIgKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5nZXRQYXJlbnRTY3JvbGxlcigpXG4gIH0sXG5cbiAgZGVzdHJveSAocG9zaXRpb24pIHtcbiAgICB0aGlzLl9kZXRhY2gocG9zaXRpb24pXG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlXG4gICAgZWxlbWVudFN0eWxlLnJlbW92ZVByb3BlcnR5KGNzc1ByZWZpeCArICd0cmFuc2Zvcm0nKVxuICAgIGVsZW1lbnRTdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNmb3JtJylcbiAgICAvLyBpZiAoc3VwcG9ydFN0aWNreSkge1xuICAgIC8vICAgcmV0dXJuXG4gICAgLy8gfVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX3Jlc2l6ZUV2ZW50LCB0aGlzLl9yZXNpemVIYW5kbGVyLCBmYWxzZSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFN0aWNreSBmcm9tICcuL3N0aWNreSdcblxuLy8gU2V0IHBvc2l0b24gdG8gZml4ZWQsIHdpdGggYSBwbGFjZWhvbGRlciBpZiBpdCdzIGluIGFcbi8vIHNjcm9sbGFibGUgY29tcG9uZW50LlxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpeGVkICgpIHtcbiAgLy8gZGVsYXkgcHJvY2Vzc2luZyBpbiBjYXNlIHRoZSBub2RlIGlzIG5vdCBhcHBlbmRlZCB5ZXQuXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCdcbiAgICBpZiAoIXRoaXMuaXNJblNjcm9sbGFibGUoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubm9kZS5wYXJlbnROb2RlXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgLy8gRm9yIHRoZSBlbGVtZW50cyB3aG8gYXJlIGZpeGVkOiB0aGlzIGZpeGVkUGxhY2Vob2xkZXJcbiAgICAgIC8vIHNob3VkIGJlIGluc2VydGVkLCBhbmQgdGhlIGZpeGVkIGVsZW1lbnQgaXRzZWxmIHNob3VsZFxuICAgICAgLy8gYmUgbW92ZWQgdG8gdGhlIHJvb3QgY29udGFpbmVyLlxuICAgICAgdGhpcy5maXhlZFBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIHRoaXMuZml4ZWRQbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCd3ZWV4LWZpeGVkLXBsYWNlaG9sZGVyJylcbiAgICAgIHRoaXMuZml4ZWRQbGFjZWhvbGRlci5zdHlsZS5jc3NUZXh0ID0gW1xuICAgICAgICAnZGlzcGxheTpub25lOycsXG4gICAgICAgICd3aWR0aDowcHg7JyxcbiAgICAgICAgJ2hlaWdodDowcHg7J1xuICAgICAgXS5qb2luKCcnKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmZpeGVkUGxhY2Vob2xkZXIsIHRoaXMubm9kZSlcbiAgICAgIHRoaXMuZ2V0Um9vdENvbnRhaW5lcigpLmFwcGVuZENoaWxkKHRoaXMubm9kZSlcbiAgICB9XG4gIH0uYmluZCh0aGlzKSwgMClcbn1cblxuLy8gdW5zZXQgYSBmaXhlZCBub2RlIHRvIHRoZSBwZWNpZmllZCAncG9zaXRpb24nIG9yICdyZWxhdGl2ZScgYnkgZGVmYXVsdC5cbmV4cG9ydCBmdW5jdGlvbiB1bnNldEZpeGVkIChwb3NpdGlvbikge1xuICAvLyBGb3IgdGhlIGVsZW1lbnRzIHdobyBhcmUgZml4ZWQgZWxlbWVudHMgYmVmb3JlLCBub3dcbiAgLy8gYXJlIG5vdCBmaXhlZDogdGhlIGZpeGVkUGxhY2Vob2xkZXIgaGFzIHRvIGJlIHJlcGxhY2VkXG4gIC8vIGJ5IHRoaXMgZWxlbWVudC5cbiAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uICsgJycgOiAncmVsYXRpdmUnXG4gIGlmICh0aGlzLmZpeGVkUGxhY2Vob2xkZXIpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpeGVkUGxhY2Vob2xkZXIucGFyZW50Tm9kZVxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLCB0aGlzLmZpeGVkUGxhY2Vob2xkZXIpXG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuZml4ZWRQbGFjZWhvbGRlcilcbiAgICB0aGlzLmZpeGVkUGxhY2Vob2xkZXIgPSBudWxsXG4gICAgdGhpcy5ub2RlLnN0eWxlLnBvc2l0aW9uID0gcG9zaXRpb25cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RpY2t5ICgpIHtcbiAgdGhpcy5ub2RlLnN0eWxlLnpJbmRleCA9IDEwMFxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnN0aWNreSA9IG5ldyBTdGlja3kodGhpcylcbiAgfS5iaW5kKHRoaXMpLCAwKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRTdGlja3kgKCkge1xuICBpZiAodGhpcy5zdGlja3kpIHtcbiAgICB0aGlzLnN0aWNreS5kZXN0cm95KClcbiAgICB0aGlzLnN0aWNreSA9IG51bGxcbiAgfVxufVxuXG4vLyB1c2FsbHkgdXNlZCB0byB1bnNldCBzdGlja3kgYW5kIGZpeGVkXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgdGhpcy5zdHlsZS5wb3NpdGlvbi5jYWxsKHRoaXMsIHBvc2l0aW9uKVxufVxuXG5leHBvcnQgY29uc3Qgc3R5bGUgPSB7XG4gIHBvc2l0aW9uICh2YWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYSBwZWFjZSBvZiBoYWNraW5nIHRvIGZpeCB0aGUgcHJvYmxlbSBhYm91dFxuICAgIC8vIG1peGluZyBmaXhlZCBhbmQgdHJhbnNmb3JtLiBTZWUgJ2h0dHA6Ly9zdGFja292ZXJmbG9cbiAgICAvLyB3LmNvbS9xdWVzdGlvbnMvMTUxOTQzMTMvd2Via2l0LWNzcy10cmFuc2Zvcm0zZC1wb3NpXG4gICAgLy8gdGlvbi1maXhlZC1pc3N1ZScgZm9yIG1vcmUgaW5mby5cbiAgICB2YWx1ZSAhPT0gJ2ZpeGVkJyAmJiB0aGlzLnVuc2V0Rml4ZWQoKVxuICAgIHZhbHVlICE9PSAnc3RpY2t5JyAmJiB0aGlzLnVuc2V0U3RpY2t5KClcbiAgICBpZiAodmFsdWUgPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldEZpeGVkKClcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnc3RpY2t5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0U3RpY2t5KClcbiAgICB9XG4gICAgdGhpcy5ub2RlLnN0eWxlLnBvc2l0aW9uID0gdmFsdWVcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYm94QWxpZ25NYXAgPSB7XG4gIHN0cmV0Y2g6ICdzdHJldGNoJyxcbiAgJ2ZsZXgtc3RhcnQnOiAnc3RhcnQnLFxuICAnZmxleC1lbmQnOiAnZW5kJyxcbiAgY2VudGVyOiAnY2VudGVyJ1xufVxuXG5jb25zdCBib3hPcmllbnRNYXAgPSB7XG4gIHJvdzogJ2hvcml6b250YWwnLFxuICBjb2x1bW46ICd2ZXJ0aWNhbCdcbn1cblxuY29uc3QgYm94UGFja01hcCA9IHtcbiAgJ2ZsZXgtc3RhcnQnOiAnc3RhcnQnLFxuICAnZmxleC1lbmQnOiAnZW5kJyxcbiAgY2VudGVyOiAnY2VudGVyJyxcbiAgJ3NwYWNlLWJldHdlZW4nOiAnanVzdGlmeScsXG4gICdzcGFjZS1hcm91bmQnOiAnanVzdGlmeScgLy8gSnVzdCBzYW1lIGFzIGBzcGFjZS1iZXR3ZWVuYFxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN0eWxlOiB7XG4gICAgZmxleCAodmFsdWUpIHtcbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRCb3hGbGV4ID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRGbGV4ID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5mbGV4ID0gdmFsdWVcbiAgICB9LFxuXG4gICAgYWxpZ25JdGVtcyAodmFsdWUpIHtcbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRCb3hBbGlnbiA9IGJveEFsaWduTWFwW3ZhbHVlXVxuICAgICAgdGhpcy5ub2RlLnN0eWxlLndlYmtpdEFsaWduSXRlbXMgPSB2YWx1ZVxuICAgICAgdGhpcy5ub2RlLnN0eWxlLmFsaWduSXRlbXMgPSB2YWx1ZVxuICAgIH0sXG5cbiAgICBhbGlnblNlbGYgKHZhbHVlKSB7XG4gICAgICB0aGlzLm5vZGUuc3R5bGUud2Via2l0QWxpZ25TZWxmID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5hbGlnblNlbGYgPSB2YWx1ZVxuICAgIH0sXG5cbiAgICBmbGV4RGlyZWN0aW9uICh2YWx1ZSkge1xuICAgICAgdGhpcy5ub2RlLnN0eWxlLndlYmtpdEJveE9yaWVudCA9IGJveE9yaWVudE1hcFt2YWx1ZV1cbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRGbGV4RGlyZWN0aW9uID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gdmFsdWVcbiAgICB9LFxuXG4gICAganVzdGlmeUNvbnRlbnQgKHZhbHVlKSB7XG4gICAgICB0aGlzLm5vZGUuc3R5bGUud2Via2l0Qm94UGFjayA9IGJveFBhY2tNYXBbdmFsdWVdXG4gICAgICB0aGlzLm5vZGUuc3R5bGUud2Via2l0SnVzdGlmeUNvbnRlbnQgPSB2YWx1ZVxuICAgICAgdGhpcy5ub2RlLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gdmFsdWVcbiAgICB9XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgKi9cbjtcbi8qIGVzbGludC1lbmFibGUgKi9cbiIsIjtcbihmdW5jdGlvbiAod2luLCBsaWIpIHtcbiAgdmFyIGRvYyA9IGRvY3VtZW50O1xuICB2YXIgYXBwZWFyRXZ0O1xuICB2YXIgZGlzYXBwZWFyRXZ0O1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KCkge1xuICAgIGFwcGVhckV2dCA9IGRvYy5jcmVhdGVFdmVudChcIkhUTUxFdmVudHNcIik7Ly/liJvlu7roh6rlrprkuYnmmL7npLrkuovku7YgIFxuICAgIGRpc2FwcGVhckV2dCA9IGRvYy5jcmVhdGVFdmVudChcIkhUTUxFdmVudHNcIik7Ly/liJvlu7roh6rlrprkuYnmtojlpLHkuovku7YgIFxuICAgIGFwcGVhckV2dC5pbml0RXZlbnQoJ19hcHBlYXInLCBmYWxzZSwgdHJ1ZSk7ICAgICAgXG4gICAgZGlzYXBwZWFyRXZ0LmluaXRFdmVudCgnX2Rpc2FwcGVhcicsIGZhbHNlLCB0cnVlKTsgICAgICBcbiAgfVxuXG4gIC8qKlxuICAgKiBbdGhyb3R0bGUg6IqC5rWB5Ye95pWwXVxuICAgKiBAcGFyYW0gIHtbZnVuY3Rpb25dfSBmdW5jIFvmiafooYzlh73mlbBdXG4gICAqIEBwYXJhbSAge1tpbnRdfSB3YWl0IFvnrYnlvoXml7bplb9dXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0KSB7XG4gICAgdmFyIGxhdGVzdCA9IERhdGUubm93KCksXG4gICAgICBwcmV2aW91cyA9IDAsLy/kuIrmrKHmiafooYznmoTml7bpl7RcbiAgICAgIHRpbWVvdXQgPSBudWxsLC8vc2V0VGltb3V05Lu75YqhXG4gICAgICBjb250ZXh0LC8v5LiK5LiL5paHXG4gICAgICBhcmdzLC8v5Y+C5pWwXG4gICAgICByZXN1bHQ7Ly/nu5PmnpxcbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcmV2aW91cyA9IERhdGUubm93KCk7XG4gICAgICB0aW1lb3V0ID0gbnVsbDsvL+a4heepuuiuoeaXtuWZqFxuICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID49IHdhaXQpIHtcbiAgICAgICAgLy/lpoLmnpzmsqHmnInliankvZnml7bpl7TvvIzmiJbogIXlrZjlnKjkv67mlLnov4fns7vnu5/ml7bpl7Tlr7zoh7TliankvZnml7bpl7Tlop7lpKfnmoTmg4XlhrXvvIzliJnmiafooYxcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAodGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW2dldE9mZnNldCDojrflj5bovrnot53lsLrlr7hdXG4gICAqIEBwYXJhbSAge1t0eXBlXX0gZWwgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge1t0eXBlXX0gcGFyYW0gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldChlbCwgcGFyYW0pIHtcbiAgICB2YXIgZWwsIGwsICByLCBiLCB0O1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFwYXJhbSkge1xuICAgICAgcGFyYW0gPSB7eDogMCwgeTogMH07XG4gICAgfVxuXG4gICAgaWYgKGVsICE9IHdpbmRvdykge1xuICAgICAgZWwgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGwgPSBlbC5sZWZ0O1xuICAgICAgdCA9IGVsLnRvcDtcbiAgICAgIHIgPSBlbC5yaWdodDtcbiAgICAgIGIgPSBlbC5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSAwO1xuICAgICAgdCA9IDA7XG4gICAgICByID0gbCArIGVsLmlubmVyV2lkdGg7XG4gICAgICBiID0gdCArIGVsLmlubmVySGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgJ2xlZnQnOiBsLFxuICAgICAgJ3RvcCc6IHQsXG4gICAgICAncmlnaHQnOiByICsgcGFyYW0ueCxcbiAgICAgICdib3R0b20nOiBiICsgcGFyYW0ueVxuICAgIH07XG4gIH1cbiAgLy/lhYPntKDkvY3nva7mr5TovoNcbiAgZnVuY3Rpb24gY29tcGFyZU9mZnNldChkMSwgZDIpIHtcbiAgICB2YXIgbGVmdCA9IGQyLnJpZ2h0ID4gZDEubGVmdCAmJiBkMi5sZWZ0IDwgZDEucmlnaHQ7XG4gICAgdmFyIHRvcCA9IGQyLmJvdHRvbSA+IGQxLnRvcCAmJiBkMi50b3AgPCBkMS5ib3R0b207XG4gICAgcmV0dXJuIGxlZnQgJiYgdG9wO1xuICB9XG4gIC8v6I635Y+W56e75Yqo5pa55ZCRXG4gIGZ1bmN0aW9uIGdldERpcmVjdGlvbihiZWZvcmVPZmZzZXQsIG5vd09mZnNldCkge1xuICAgIHZhciBkaXJlY3Rpb24gPSAnbm9uZSc7XG4gICAgdmFyIGhvcml6ZW50YWwgPSBiZWZvcmVPZmZzZXQubGVmdCAtIG5vd09mZnNldC5sZWZ0O1xuICAgIHZhciB2ZXJ0aWNhbCA9IGJlZm9yZU9mZnNldC50b3AgLSBub3dPZmZzZXQudG9wO1xuICAgIGlmICh2ZXJ0aWNhbCA9PSAwKSB7XG4gICAgICBpZiAoaG9yaXplbnRhbCAhPSAwKSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IGhvcml6ZW50YWwgPiAwID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGlvbiA9ICdub25lJ1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaG9yaXplbnRhbCA9PSAwKSB7XG4gICAgICBpZiAodmVydGljYWwgIT0gMCkge1xuICAgICAgICBkaXJlY3Rpb24gPSB2ZXJ0aWNhbCA+IDAgPyAndXAnIDogJ2Rvd24nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyZWN0aW9uID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgZWwpIHtcbiAgICBmb3IgKHZhciBrIGluIGVsKSB7XG4gICAgICBpZiAoZWwuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgdGFyZ2V0W2tdID0gZWxba107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICAvKipcbiAgICogW19fYmluZEV2ZW50IOe7keWumuS6i+S7tu+8jOWMheaLrOa7muWKqOOAgXRvdWNobW92ZeOAgXRyYW5zZm9ybeOAgXJlc2l6ZeetiV1cbiAgICogQHJldHVybiB7W3R5cGVdfSAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGZ1bmN0aW9uIF9fYmluZEV2ZW50KCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaGFuZGxlID0gdGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgICAgX19maXJlLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfSwgdGhpcy5vcHRpb25zLndhaXQpO1xuICAgIGlmICh0aGlzLl9faGFuZGxlKSB7XG4gICAgICAvL+mBv+WFjemHjeWkjee7keWumlxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fX2hhbmRsZSk7XG4gICAgICB0aGlzLl9faGFuZGxlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fX2hhbmRsZSA9IGhhbmRsZTtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGUsIGZhbHNlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbihldikge1xuICAgICAgX19maXJlLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfSwgZmFsc2UpO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbkVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgX19maXJlLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfSwgZmFsc2UpO1xuICAgIC8vIGFuZHJvaWQ0LjDku6XkuItcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRBbmltYXRpb25FbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgIF9fZmlyZS5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgIH0sIGZhbHNlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICBfX2ZpcmUuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICB9LCBmYWxzZSk7XG4gIH1cblxuICAvL+iOt+WPluWuueWZqOWGheaJgOacieeahOWKoOi9veWFg+e0oFxuICBmdW5jdGlvbiBfX2dldEVsZW1lbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8v6I635Y+W5a655ZmoXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5jb250YWluZXI7XG4gICAgaWYgKHR5cGVvZiBjb250YWluZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgIC8v5aaC5p6c5piv5a2X56ym5Liy77yM5YiZ6YCJ5oup5ZmoXG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGRvYy5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8v5a+56LGh5Lyg5YC8XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9XG4gICAgLy/ojrflj5blrrnlmajlhoXnmoTmiYDmnInnm67moIflhYPntKBcbiAgICBpZiAodGhpcy5jb250YWluZXIgPT0gd2luZG93KSB7XG4gICAgICB2YXIgYXBwZWFyV2F0Y2hFbGVtZW50cyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgICAgICAgICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFwcGVhcldhdGNoRWxlbWVudHMgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGFwcGVhcldhdGNoRWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGFwcGVhcldhdGNoRWxlbWVudHMsIG51bGwpO1xuXG4gICAgYXBwZWFyV2F0Y2hFbGVtZW50cyA9IGFwcGVhcldhdGNoRWxlbWVudHMuZmlsdGVyKGZ1bmN0aW9uKGVsZSkge1xuICAgICAgLy8g5aaC5p6c5bey57uP57uR5a6a6L+H77yM5riF6ZmkYXBwZWFy54q25oCB77yM5LiN5YaN5Yqg5YWl5Yiw5pWw57uE6YeMXG4gICAgICBpZiAoZWxlLmRhdGFzZXRbJ2JpbmQnXSA9PSAnMScpIHtcbiAgICAgICAgZGVsZXRlIGVsZS5faGFzQXBwZWFyO1xuICAgICAgICBkZWxldGUgZWxlLl9oYXNEaXNBcHBlYXI7XG4gICAgICAgIGRlbGV0ZSBlbGUuX2FwcGVhcjsgICAgICBcbiAgICAgICAgZWxlLmNsYXNzTGlzdC5yZW1vdmUoc2VsZi5vcHRpb25zLmNscyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFwcGVhcldhdGNoRWxlbWVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBfX2luaXRCb3VuZGluZ1JlY3QoZWxlbWVudHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGVsZW1lbnRzICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIFtdLmZvckVhY2guY2FsbChlbGVtZW50cywgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBlbGUuX2VsZU9mZnNldCA9IGdldE9mZnNldChlbGUpOyBcbiAgICAgICAgLy/np7vpmaTnsbvlkI1cbiAgICAgICAgZWxlLmNsYXNzTGlzdC5yZW1vdmUoc2VsZi5vcHRpb25zLmNscyk7XG4gICAgICAgIC8vIOagh+W/l+W3sue7j+e7keWumlxuICAgICAgICBlbGUuZGF0YXNldFsnYmluZCddID0gMTtcbiAgICAgIH0pO1xuICAgIH0gICAgICAgIFxuICB9XG5cbiAgLy8g6Kem5Y+R5Yqg6L29XG4gIGZ1bmN0aW9uIF9fZmlyZSgpIHtcbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsXG4gICAgICBlbGVtZW50cyA9IHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyxcbiAgICAgIGFwcGVhckNhbGxiYWNrID0gdGhpcy5vcHRpb25zLm9uQXBwZWFyLC8vYXBwZWFy55qE5omn6KGM5Ye95pWwXG4gICAgICBkaXNhcHBlYXJDYWxsYmFjayA9IHRoaXMub3B0aW9ucy5vbkRpc2FwcGVhciwvL2Rpc2FwcGVhcueahOaJp+ihjOWHveaVsFxuICAgICAgY29udGFpbmVyT2Zmc2V0ID0gZ2V0T2Zmc2V0KGNvbnRhaW5lciwge1xuICAgICAgICB4OiB0aGlzLm9wdGlvbnMueCxcbiAgICAgICAgeTogdGhpcy5vcHRpb25zLnlcbiAgICAgIH0pLFxuICAgICAgaXNPbmNlID0gdGhpcy5vcHRpb25zLm9uY2UsLy/mmK/lkKblj6rmiafooYzkuIDmrKFcbiAgICAgIGV2ID0gYXJndW1lbnRzWzBdIHx8IHt9O1xuICAgIGlmIChlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBbXS5mb3JFYWNoLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICAgICAgLy/ojrflj5blt6blj7Pot53nprtcbiAgICAgICAgdmFyIGVsZU9mZnNldCA9IGdldE9mZnNldChlbGUpO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGVsZS5fZWxlT2Zmc2V0LCBlbGVPZmZzZXQpO1xuICAgICAgICAvL+S/neWtmOS4iuS4quaXtuauteeahOS9jee9ruS/oeaBr1xuICAgICAgICBlbGUuX2VsZU9mZnNldCA9IGVsZU9mZnNldDtcbiAgICAgICAgLy/mn6XnnIvmmK/lkKblnKjlj6/op4bljLrln5/ojIPlm7TlhoVcbiAgICAgICAgdmFyIGlzSW5WaWV3ID0gY29tcGFyZU9mZnNldChjb250YWluZXJPZmZzZXQsIGVsZU9mZnNldCk7XG4gICAgICAgIHZhciBhcHBlYXIgPSBlbGUuX2FwcGVhcjtcbiAgICAgICAgdmFyIF9oYXNBcHBlYXIgPSBlbGUuX2hhc0FwcGVhcjtcbiAgICAgICAgdmFyIF9oYXNEaXNBcHBlYXIgPSBlbGUuX2hhc0Rpc0FwcGVhcjtcbiAgICAgICAgYXBwZWFyRXZ0LmRhdGEgPSB7XG4gICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgICAgfVxuICAgICAgICBkaXNhcHBlYXJFdnQuZGF0YSA9IHtcbiAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luVmlldyAmJiAhYXBwZWFyKSB7XG4gICAgICAgICAgaWYgKChpc09uY2UgJiYgIV9oYXNBcHBlYXIpIHx8ICFpc09uY2UpIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5Y+q6Kem5Y+R5LiA5qyh5bm25LiU5rKh5pyJ6Kem5Y+R6L+H5oiW6ICF5YWB6K646Kem5Y+R5aSa5qyhXG4gICAgICAgICAgICAvL+WmguaenOWcqOWPr+inhuWMuuWfn+WGhe+8jOW5tuS4lOaYr+S7jmRpc3BwZWFy6L+b5YWlYXBwZWFy77yM5YiZ5omn6KGM5Zue6LCDXG4gICAgICAgICAgICBhcHBlYXJDYWxsYmFjayAmJiBhcHBlYXJDYWxsYmFjay5jYWxsKGVsZSwgZXYpO1xuICAgICAgICAgICAgLy/op6blj5Hoh6rlrprkuYnkuovku7ZcbiAgICAgICAgICAgIGVsZS5kaXNwYXRjaEV2ZW50KGFwcGVhckV2dCk7XG4gICAgICAgICAgICBlbGUuX2hhc0FwcGVhciA9IHRydWU7XG4gICAgICAgICAgICBlbGUuX2FwcGVhciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc0luVmlldyAmJiBhcHBlYXIpIHtcbiAgICAgICAgICBpZiAoKGlzT25jZSAmJiAhX2hhc0Rpc0FwcGVhcikgfHwgIWlzT25jZSkge1xuICAgICAgICAgICAgLy/lpoLmnpzkuI3lnKjlj6/op4bljLrln5/lhoXvvIzlubbkuJTmmK/ku45hcHBlYXLov5vlhaVkaXNhcHBlYXLvvIzmiafooYxkaXNhcHBlYXLlm57osINcbiAgICAgICAgICAgIGRpc2FwcGVhckNhbGxiYWNrICYmIGRpc2FwcGVhckNhbGxiYWNrLmNhbGwoZWxlLCBldik7XG4gICAgICAgICAgICAvL+inpuWPkeiHquWumuS5ieS6i+S7tlxuICAgICAgICAgICAgZWxlLmRpc3BhdGNoRXZlbnQoZGlzYXBwZWFyRXZ0KTtcbiAgICAgICAgICAgIGVsZS5faGFzRGlzQXBwZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsZS5fYXBwZWFyID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm90byA9IGV4dGVuZChwcm90bywgbGlzdGVuZXIpO1xuXG4gIGZ1bmN0aW9uIF9faW5pdChvcHRzKSB7XG4gICAgLy/mianlsZXlj4LmlbBcbiAgICBleHRlbmQodGhpcy5vcHRpb25zLCBvcHRzIHx8IChvcHRzID0ge30pKTtcbiAgICAvL+iOt+WPluebruagh+WFg+e0oFxuICAgIHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyA9IHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyB8fCBfX2dldEVsZW1lbnRzLmNhbGwodGhpcywgJy4nICsgdGhpcy5vcHRpb25zLmNscyk7XG4gICAgLy/liJ3lp4vljJbkvY3nva7kv6Hmga9cbiAgICBfX2luaXRCb3VuZGluZ1JlY3QuY2FsbCh0aGlzLCB0aGlzLmFwcGVhcldhdGNoRWxlbWVudHMpO1xuICAgIC8v57uR5a6a5LqL5Lu2XG4gICAgX19iaW5kRXZlbnQuY2FsbCh0aGlzKTtcbiAgfVxuICBcbiAgdmFyIEFwcGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICBfX2luaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG5cbiAgdmFyIGFwcGVhciA9IHtcbiAgICBpbnN0YW5jZXM6IFtdLFxuICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICB2YXIgcHJvdG8gPSB7XG4gICAgICAgIC8v6buY6K6k5Y+C5pWwXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb250YWluZXI6IHdpbmRvdyxcbiAgICAgICAgICB3YWl0OiAxMDAsXG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIGNsczogJ2xpYi1hcHBlYXInLFxuICAgICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICAgIG9uUmVzZXQ6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgIG9uQXBwZWFyOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICBvbkRpc2FwcGVhcjogZnVuY3Rpb24gKCkge31cbiAgICAgICAgfSxcbiAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICBhcHBlYXJXYXRjaEVsZW1lbnRzOiBudWxsLFxuICAgICAgICBiaW5kOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIHZhciBjbHMgPSB0aGlzLm9wdGlvbnMuY2xzO1xuICAgICAgICAgIC8vIOa3u+WKoOmcgOimgee7keWumueahGFwcGVhcuWFg+e0oFxuICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gX19nZXRFbGVtZW50cy5jYWxsKHRoaXMsIG5vZGUpO1xuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgICAgICAgICAgIGlmICghZWxlLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSB7XG4gICAgICAgICAgICAgICAgZWxlLmNsYXNzTGlzdC5hZGQoY2xzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhub2RlKSkge1xuICAgICAgICAgICAgLy/lpoLmnpzkvKDlhaXnmoTmmK/lhYPntKDlubbkuJTlnKjljIXlkKvlnKjlrrnlmajkuK3vvIznm7TmjqXmt7vliqDnsbvlkI1cbiAgICAgICAgICAgIGlmICghbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xzKSkge1xuICAgICAgICAgICAgICAvL+a3u+WKoOexu+WQjVxuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoY2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8v5paw5aKe55qE5a2Q5YWD57SgXG4gICAgICAgICAgdmFyIG5ld0VsZW1lbnRzID0gX19nZXRFbGVtZW50cy5jYWxsKHRoaXMsICcuJyArIHRoaXMub3B0aW9ucy5jbHMpO1xuICAgICAgICAgIC8v5a+557yT5a2Y55qE5a2Q5YWD57Sg5YGa5aKe6YePXG4gICAgICAgICAgdGhpcy5hcHBlYXJXYXRjaEVsZW1lbnRzID0gdGhpcy5hcHBlYXJXYXRjaEVsZW1lbnRzLmNvbmNhdChuZXdFbGVtZW50cyk7XG4gICAgICAgICAgLy/liJ3lp4vljJbmlrDlrZDlhYPntKDnmoTkvY3nva7kv6Hmga9cbiAgICAgICAgICBfX2luaXRCb3VuZGluZ1JlY3QuY2FsbCh0aGlzLCBuZXdFbGVtZW50cyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOmHjee9ruWHveaVsFxuICAgICAgICByZXNldDogZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgICBfX2luaXQuY2FsbCh0aGlzLCBvcHRzKTtcbiAgICAgICAgICB0aGlzLmFwcGVhcldhdGNoRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBlbGUuX2hhc0FwcGVhcjtcbiAgICAgICAgICAgIGRlbGV0ZSBlbGUuX2hhc0Rpc0FwcGVhcjtcbiAgICAgICAgICAgIGRlbGV0ZSBlbGUuX2FwcGVhcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgZmlyZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghdGhpcy5hcHBlYXJXYXRjaEVsZW1lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVhcldhdGNoRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG5ld0VsZW1lbnRzID0gX19nZXRFbGVtZW50cy5jYWxsKHRoaXMsICcuJyArIHRoaXMub3B0aW9ucy5jbHMpO1xuICAgICAgICAgIHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyA9IHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cy5jb25jYXQobmV3RWxlbWVudHMpO1xuICAgICAgICAgIC8v5Yid5aeL5YyW5L2N572u5L+h5oGvXG4gICAgICAgICAgX19pbml0Qm91bmRpbmdSZWN0LmNhbGwodGhpcywgbmV3RWxlbWVudHMpO1xuICAgICAgICAgIF9fZmlyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBcHBlYXIucHJvdG90eXBlID0gcHJvdG87XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQXBwZWFyKG9wdHMpO1xuICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfSxcbiAgICBmaXJlQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW5zdGFuY2VzID0gdGhpcy5pbnN0YW5jZXM7XG4gICAgICBpbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgaW5zdGFuY2UuZmlyZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8v5rOo5YaM5LqL5Lu2XG4gIGNyZWF0ZUV2ZW50KCk7XG5cbiAgbGliLmFwcGVhciA9IGFwcGVhcjtcblxufSkod2luZG93LCB3aW5kb3cubGliIHx8ICh3aW5kb3cubGliID0ge30pKTsiLCIvKlxuICAgIGxhenlpbWcgXG4gICAgQXV0aG9yOiBfZGFuelxuKi9cbjtcblxuKGZ1bmN0aW9uICh3aW4sIGxpYikge1xuICAgIHJlcXVpcmUoJ2FwcGVhcmpzJyk7XG5cbiAgICB2YXIgYWRhcHRlciA9IHt9O1xuICAgIHZhciBhcHBlYXJJbnN0YW5jZTtcbiAgICB2YXIgcnVudGltZUZsYWdzID0ge307XG5cbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICAnZGF0YVNyYyc6ICdpbWctc3JjJywgLy/mjIflrprlm77niYflnLDlnYDnmoRhdHRyaWJ1dGXlkI0sIOWFvOWBmmxhenktY2xhc3PnmoTkvZznlKhcbiAgICAgICAgJ2xhenlIZWlnaHQnOiAwLCAvL+S7peatpOmrmOW6puaPkOWJjeinpuWPkeaHkuWKoOi9vVxuICAgICAgICAnbGF6eVdpZHRoJzogMCAvL+S7peatpOWuveW6puaPkOWJjeinpuWPkeaHkuWKoOi9vVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBleHRlbmRTdHJpY3QobWFpbiwgc3ViKSB7XG4gICAgICAgIHZhciByZXQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBtYWluKSB7XG4gICAgICAgICAgICBpZiAobWFpbi5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgIHJldFtrXSA9IHN1Yi5oYXNPd25Qcm9wZXJ0eShrKSA/IHN1YltrXSA6IG1haW5ba107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVMb2FkSW1nIChzcmMsIGxvYWRDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5zcmMgPSBzcmNcbiAgICAgICAgaW1nLm9ubG9hZCA9IGxvYWRDYWxsYmFjayA/IGxvYWRDYWxsYmFjay5iaW5kKGltZykgOiBudWxsXG4gICAgICAgIGltZy5vbmVycm9yID0gZXJyb3JDYWxsYmFjayA/IGVycm9yQ2FsbGJhY2suYmluZChpbWcpIDogbnVsbFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQgKGl0ZW0sIHR5cGUsIGRhdGEpIHtcbiAgICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCBkYXRhKVxuICAgICAgICBpdGVtLmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5U3JjKGl0ZW0sIHByb2Nlc3NlZFNyYywgcGxhY2Vob2xkZXJTcmMpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzZWRTcmMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09ICdJTUcnKSB7XG4gICAgICAgICAgICBpdGVtLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNyYyA9IHBsYWNlaG9sZGVyU3JjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnc3JjJywgcHJvY2Vzc2VkU3JjKTtcbiAgICAgICAgICAgIGlmICghcGxhY2Vob2xkZXJTcmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZUxvYWRJbWcocHJvY2Vzc2VkU3JjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKFwiJyArIHByb2Nlc3NlZFNyYyArICdcIiknO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdHVyYWxXaWR0aCA9IHRoaXMud2lkdGhcbiAgICAgICAgICAgICAgICBjb25zdCBuYXR1cmFsSGVpZ2h0ID0gdGhpcy5oZWlnaHRcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KGl0ZW0sICdsb2FkJywge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IG5hdHVyYWxXaWR0aCwgbmF0dXJhbEhlaWdodCB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KGl0ZW0sICdsb2FkJywgeyBzdWNjZXNzOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHByZUxvYWRJbWcocGxhY2Vob2xkZXJTcmMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKFwiJyArIHBsYWNlaG9sZGVyU3JjICsgJ1wiKSc7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICBhcHBlYXJJbnN0YW5jZSA9IGxpYi5hcHBlYXIuaW5pdCh7XG4gICAgICAgICAgICBjbHM6ICdpbWd0bXAnLCAvL+WPr+mAie+8jOmcgOimgemBjeWOhueahOWFg+e0oFxuICAgICAgICAgICAgb25jZTogdHJ1ZSwgLy/lj6/pgInvvIzmmK/lkKblj6rop6blj5HkuIDmrKFcbiAgICAgICAgICAgIHg6IGNvbmZpZy5sYXp5V2lkdGgsIC8v5Y+v6YCJ77yM5a655Zmo5Y+z6L656Led56a7eOS7peWGheeahOWFg+e0oOWKoOi9ve+8jOm7mOiupOS4ujBcbiAgICAgICAgICAgIHk6IGNvbmZpZy5sYXp5SGVpZ2h0LCAvL+WPr+mAie+8jOWuueWZqOW6lemDqOi3neemu3nku6XlhoXnmoTlhYPntKDliqDovb3vvIzpu5jorqTkuLowXG4gICAgICAgICAgICBvbkFwcGVhcjogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcztcbiAgICAgICAgICAgICAgICBhcHBseVNyYyhpdGVtLCBpdGVtLmdldEF0dHJpYnV0ZSgnaS1sYXp5LXNyYycpLCBpdGVtLmRhdGFzZXQucGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdpLWxhenktc3JjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkYXB0ZXIubG9nQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnbGliLWltZyBDb25maWdcXG4nLCBjb25maWcpO1xuICAgIH1cblxuICAgIGFkYXB0ZXIuZmlyZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpZiAoIWFwcGVhckluc3RhbmNlKSB7XG4gICAgICAgICAgICBpbml0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFiZWwgPSAnaV8nICsgRGF0ZS5ub3coKSAlIDEwMDAwMDtcbiAgICAgICAgdmFyIGRvbUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGNvbmZpZy5kYXRhU3JjICsgJ10nKTtcblxuICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZG9tTGlzdCwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmRhdGFzZXQubGF6eSA9PSAnZmFsc2UnICYmIGl0ZW0uZGF0YXNldC5sYXp5ICE9ICd0cnVlJykge1xuICAgICAgICAgICAgICAgIGFwcGx5U3JjKGl0ZW0sIGl0ZW0uZ2V0QXR0cmlidXRlKGNvbmZpZy5kYXRhU3JjKSwgaXRlbS5kYXRhc2V0LnBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGxhYmVsKTtcbiAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnaS1sYXp5LXNyYycsIGl0ZW0uZ2V0QXR0cmlidXRlKGNvbmZpZy5kYXRhU3JjKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnJlbW92ZUF0dHJpYnV0ZShjb25maWcuZGF0YVNyYyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGVhckluc3RhbmNlLmJpbmQoJy4nICsgbGFiZWwpO1xuICAgICAgICBhcHBlYXJJbnN0YW5jZS5maXJlKCk7XG4gICAgfVxuXG4gICAgYWRhcHRlci5kZWZhdWx0U3JjID0gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFEVWxFUVZRSW1XTmdZR0JnQUFBQUJRQUJoNkZPMUFBQUFBQkpSVTVFcmtKZ2dnPT0nO1xuXG4gICAgbGliLmltZyA9IGFkYXB0ZXI7XG4gICAgXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBhZGFwdGVyO1xuXG59KSh3aW5kb3csIHdpbmRvd1snbGliJ10gfHwgKHdpbmRvd1snbGliJ10gPSB7fSkpO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgbGliLCBIVE1MRWxlbWVudCAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICdsYXp5aW1nJ1xuXG5sZXQgbGF6eWxvYWRUaW1lclxuXG4vLyBmaXJlIGxhenlpbWcgb24gaW1hZ2VzLlxuZnVuY3Rpb24gZmlyZSAoKSB7XG4gIHNldFRpbWVvdXQoKCkgPT4gbGliLmltZy5maXJlKCksIDApXG59XG5cbi8vIHdlIGRvbid0IGtub3cgd2hlbiBhbGwgaW1hZ2VzIGFyZSBhcHBlbmRlZFxuLy8ganVzdCB1c2Ugc2V0VGltZW91dCB0byBkbyBkZWxheSBsYXp5bG9hZFxuLy9cbi8vIC0tIGFjdHVhbGx5IGV2ZXJ5dGltZSB3ZSBhZGQgYSBlbGVtZW50IG9yIHVwZGF0ZSBzdHlsZXMsXG4vLyB0aGUgY29tcG9uZW50IG1hbmFnZXIgd2lsbCBjYWxsIHN0YXJ0SWZOZWVkIHRvIGZpcmVcbi8vIGxhenlsb2FkIG9uY2UgYWdhaW4gaW4gdGhlIGhhbmRsZUFwcGVuZCBmdW5jdGlvbi4gc28gdGhlcmVcbi8vIGlzIG5vIHdheSB0aGF0IGFueSBpbWFnZSBlbGVtZW50IGNhbiBtaXNzIGl0LiBTZWUgc291cmNlXG4vLyBjb2RlIGluIGNvbXBvbmVudE1hbmdhZ2VyLmpzLlxuXG4vLyBqdXN0IGZvciB0aGUgaW1hZ2UgY29tcG9uZW50IHRvIHN0YXJ0IGxhenlsb2FkLlxuZnVuY3Rpb24gc3RhcnRJZk5lZWRlZCAodGFyZ2V0KSB7XG4gIGlmICghbGF6eWxvYWRUaW1lcikge1xuICAgIGxhenlsb2FkVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGZpcmUoKVxuICAgICAgY2xlYXJUaW1lb3V0KGxhenlsb2FkVGltZXIpXG4gICAgICBsYXp5bG9hZFRpbWVyID0gbnVsbFxuICAgIH0sIDE2KVxuICB9XG59XG5cbi8vIGZvciBhIHNjb3BlIG9mIGVsZW1lbnQsIG5vdCBmb3IgYSBpbWFnZS5cbmZ1bmN0aW9uIGxvYWRJZk5lZWRlZCAoZWxlbWVudFNjb3BlKSB7XG4gIGNvbnN0IG5vdFByZVByb2Nlc3NlZCA9IGVsZW1lbnRTY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdbaW1nLXNyY10nKVxuICAvLyBpbWFnZSBlbGVtZW50cyB3aGljaCBoYXZlIGF0dHJpYnV0ZSAnaS1sYXp5LXNyYycgd2VyZSBlbGVtZW50c1xuICAvLyB0aGF0IGhhZCBiZWVuIHByZXByb2Nlc3NlZCBieSBsaWItaW1nLWNvcmUsIGJ1dCBub3QgbG9hZGVkIHlldCwgYW5kXG4gIC8vIG11c3QgYmUgbG9hZGVkIHdoZW4gJ2FwcGVhcicgZXZlbnRzIHdlcmUgZmlyZWQuIEl0IHR1cm5zIG91dCB0aGVcbiAgLy8gJ2FwcGVhcicgZXZlbnQgd2FzIG5vdCBmaXJlZCBjb3JyZWN0bHkgaW4gdGhlIGNzcy10cmFuc2xhdGUtdHJhbnNpdGlvblxuICAvLyBzaXR1YXRpb24sIHNvICdpLWxhenktc3JjJyBtdXN0IGJlIGNoZWNrZWQgYW5kIGxhenlsb2FkIG11c3QgYmVcbiAgLy8gZmlyZWQgbWFudWFsbHkuXG4gIGNvbnN0IHByZVByb2Nlc3NlZCA9IGVsZW1lbnRTY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdbaS1sYXp5LXNyY10nKVxuICBpZiAobm90UHJlUHJvY2Vzc2VkLmxlbmd0aCA+IDAgfHwgcHJlUHJvY2Vzc2VkLmxlbmd0aCA+IDApIHtcbiAgICBmaXJlKClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUltYWdlTGF6eSAoaW1hZ2UsIHNyYykge1xuICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ2ltZy1zcmMnKVxuICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ2ktbGF6eS1zcmMnKVxuICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpXG4gIGltYWdlLnNldEF0dHJpYnV0ZSgnaW1nLXNyYycsIHNyYylcbiAgZmlyZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJlTGF6eWxvYWQgKHRhcmdldCkge1xuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQubm9kZVxuICB9XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbWFnZScpIHtcbiAgICByZXR1cm4gc3RhcnRJZk5lZWRlZCh0YXJnZXQpXG4gIH1cbiAgcmV0dXJuIGxvYWRJZk5lZWRlZCh0YXJnZXQpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCB7IENvbXBvbmVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi9kb20nXG5pbXBvcnQgeyBpc0NvbXBvbmVudEFwcGVhciB9IGZyb20gJy4uLy4uL2RvbS9hcHBlYXJXYXRjaGVyJ1xuaW1wb3J0ICogYXMgb3BlcmF0ZSBmcm9tICcuL29wZXJhdGUnXG5pbXBvcnQgKiBhcyBwb3NpdGlvbiBmcm9tICcuL3Bvc2l0aW9uJ1xuaW1wb3J0IGZsZXhib3ggZnJvbSAnLi9mbGV4Ym94J1xuaW1wb3J0IHsgbWFrZUltYWdlTGF6eSwgZmlyZUxhenlsb2FkIH0gZnJvbSAnLi9sYXp5bG9hZCdcblxuY29uc3QgYXBwZWFyRXZ0cyA9IFsnYXBwZWFyJywgJ2Rpc2FwcGVhciddXG5cbi8qKlxuICogY2hlY2sgd2hldGhlciBhIGV2ZW50IGlzIHZhbGlkIHRvIGRpc3BhdGNoLlxuICogQHBhcmFtICB7Q29tcG9uZW50fSAgICAgIGNvbXAgIHRoZSBjb21wb25lbnQgdGhhdCB0aGlzIGV2ZW50IGlzIHRvIHRyaWdnZXIgb24uXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0eXBlICAgdGhlIGV2ZW50IHR5cGUuXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgaXMgaXQgdmFsaWQgdG8gZGlzcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIGlzRXZlbnRWYWxpZCAoY29tcCwgdHlwZSkge1xuICAvLyBpZiBhIGNvbXBvbmVudCBoYXMgYWxlYXJ5IHRyaWdnZXJlZCAnYXBwZWFyJyBldmVudCwgdGhlblxuICAvLyB0aGUgJ2FwcGVhcicgZXZlbuKAoCBjYW4ndCBiZSB0cmlnZ2VyZWQgYWdhaW4gdXRpbGwgdGhlXG4gIC8vICdkaXNhcHBlYXInIGV2ZW50IHRyaWdnZXJlZC5cbiAgaWYgKGFwcGVhckV2dHMuaW5kZXhPZih0eXBlKSA8PSAtMSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKGNvbXAuX2FwcGVhciA9PT0gdW5kZWZpbmVkICYmIHR5cGUgPT09ICdkaXNhcHBlYXInKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgbGV0IHJlc1xuICBpZiAoY29tcC5fYXBwZWFyID09PSB1bmRlZmluZWQgJiYgdHlwZSA9PT0gJ2FwcGVhcicpIHtcbiAgICByZXMgPSB0cnVlXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzID0gdHlwZSAhPT0gY29tcC5fYXBwZWFyXG4gIH1cbiAgcmVzICYmIChjb21wLl9hcHBlYXIgPSB0eXBlKVxuICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbXBvbmVudCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgdGhpcy5kYXRhID0gZGF0YVxuICB0aGlzLm5vZGUgPSB0aGlzLmNyZWF0ZShub2RlVHlwZSlcbiAgdGhpcy5jcmVhdGVDaGlsZHJlbigpXG4gIHRoaXMudXBkYXRlQXR0cnModGhpcy5kYXRhLmF0dHIgfHwge30pXG4gIC8vIGlzc3VlOiB3aGVuIGFkZCBlbGVtZW50IHRvIGEgbGlzdCBpbiBsaWZldGltZSBob29rICdyZWFkeScsIHRoZVxuICAvLyBzdHlsZXMgaXMgc2V0IHRvIHRoZSBjbGFzc1N0eWxlLCBub3Qgc3R5bGUuIFRoaXMgaXMgYSBpc3N1ZVxuICAvLyB0aGF0IGpzZnJhbWV3b3JrIHNob3VsZCBkbyBzb21ldGhpbmcgYWJvdXQuXG4gIGNvbnN0IGNsYXNzU3R5bGUgPSB0aGlzLmRhdGEuY2xhc3NTdHlsZVxuICBjbGFzc1N0eWxlICYmIHRoaXMudXBkYXRlU3R5bGUodGhpcy5kYXRhLmNsYXNzU3R5bGUpXG4gIHRoaXMudXBkYXRlU3R5bGUodGhpcy5kYXRhLnN0eWxlIHx8IHt9KVxuICB0aGlzLmJpbmRFdmVudHModGhpcy5kYXRhLmV2ZW50IHx8IFtdKVxufVxuXG5Db21wb25lbnQucHJvdG90eXBlID0ge1xuXG4gIGdldENvbXBvbmVudE1hbmFnZXIgKCkge1xuICAgIHJldHVybiBDb21wb25lbnRNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMuZGF0YS5pbnN0YW5jZUlkKVxuICB9LFxuXG4gIGdldFdlZXhJbnN0YW5jZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldFdlZXhJbnN0YW5jZSgpXG4gIH0sXG5cbiAgZ2V0UGFyZW50ICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKCkuY29tcG9uZW50TWFwW3RoaXMucGFyZW50UmVmXVxuICB9LFxuXG4gIGdldFBhcmVudFNjcm9sbGVyICgpIHtcbiAgICBpZiAodGhpcy5pc0luU2Nyb2xsYWJsZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFyZW50U2Nyb2xsZXJcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICBnZXRSb290U2Nyb2xsZXIgKCkge1xuICAgIGlmICh0aGlzLmlzSW5TY3JvbGxhYmxlKCkpIHtcbiAgICAgIGxldCBzY3JvbGxlciA9IHRoaXMuX3BhcmVudFNjcm9sbGVyXG4gICAgICBsZXQgcGFyZW50ID0gc2Nyb2xsZXIuX3BhcmVudFNjcm9sbGVyXG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIHNjcm9sbGVyID0gcGFyZW50XG4gICAgICAgIHBhcmVudCA9IHNjcm9sbGVyLl9wYXJlbnRTY3JvbGxlclxuICAgICAgfVxuICAgICAgcmV0dXJuIHNjcm9sbGVyXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgZ2V0Um9vdENvbnRhaW5lciAoKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZ2V0V2VleEluc3RhbmNlKCkuZ2V0Um9vdCgpXG4gICAgICB8fCBkb2N1bWVudC5ib2R5XG4gICAgcmV0dXJuIHJvb3RcbiAgfSxcblxuICBpc1Njcm9sbGFibGUgKCkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEudHlwZVxuICAgIHJldHVybiBDb21wb25lbnRNYW5hZ2VyLmdldFNjcm9sbGFibGVUeXBlcygpLmluZGV4T2YodCkgIT09IC0xXG4gIH0sXG5cbiAgaXNJblNjcm9sbGFibGUgKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5faXNJblNjcm9sbGFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzSW5TY3JvbGxhYmxlXG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KClcbiAgICBpZiAocGFyZW50XG4gICAgICAgICYmICh0eXBlb2YgcGFyZW50Ll9pc0luU2Nyb2xsYWJsZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgICAmJiAhcGFyZW50LmlzU2Nyb2xsYWJsZSgpKSB7XG4gICAgICBpZiAocGFyZW50LmRhdGEucmVmID09PSAnX3Jvb3QnKSB7XG4gICAgICAgIHRoaXMuX2lzSW5TY3JvbGxhYmxlID0gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICB0aGlzLl9pc0luU2Nyb2xsYWJsZSA9IHBhcmVudC5pc0luU2Nyb2xsYWJsZSgpXG4gICAgICB0aGlzLl9wYXJlbnRTY3JvbGxlciA9IHBhcmVudC5fcGFyZW50U2Nyb2xsZXJcbiAgICAgIHJldHVybiB0aGlzLl9pc0luU2Nyb2xsYWJsZVxuICAgIH1cbiAgICBpZiAocGFyZW50ICYmIHR5cGVvZiBwYXJlbnQuX2lzSW5TY3JvbGxhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuX2lzSW5TY3JvbGxhYmxlID0gcGFyZW50Ll9pc0luU2Nyb2xsYWJsZVxuICAgICAgdGhpcy5fcGFyZW50U2Nyb2xsZXIgPSBwYXJlbnQuX3BhcmVudFNjcm9sbGVyXG4gICAgICByZXR1cm4gdGhpcy5faXNJblNjcm9sbGFibGVcbiAgICB9XG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuaXNTY3JvbGxhYmxlKCkpIHtcbiAgICAgIHRoaXMuX2lzSW5TY3JvbGxhYmxlID0gdHJ1ZVxuICAgICAgdGhpcy5fcGFyZW50U2Nyb2xsZXIgPSBwYXJlbnRcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIC8vIGRpc3BhdGNoIGEgc3BlY2lmaWVkIGV2ZW50IG9uIHRoaXMubm9kZVxuICAvLyAgLSB0eXBlOiBldmVudCB0eXBlXG4gIC8vICAtIGRhdGE6IGV2ZW50IGRhdGFcbiAgLy8gIC0gY29uZmlnOiBldmVudCBjb25maWcgb2JqZWN0XG4gIC8vICAgICAtIGJ1YmJsZXNcbiAgLy8gICAgIC0gY2FuY2VsYWJsZVxuICBkaXNwYXRjaEV2ZW50ICh0eXBlLCBkYXRhLCBjb25maWcpIHtcbiAgICBpZiAoIWlzRXZlbnRWYWxpZCh0aGlzLCB0eXBlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKVxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICAgIGV2ZW50LmluaXRFdmVudCh0eXBlLCBjb25maWcuYnViYmxlcyB8fCBmYWxzZSwgY29uZmlnLmNhbmNlbGFibGUgfHwgZmFsc2UpXG4gICAgIWRhdGEgJiYgKGRhdGEgPSB7fSlcbiAgICBldmVudC5kYXRhID0gZXh0ZW5kKHt9LCBkYXRhKVxuICAgIGV4dGVuZChldmVudCwgZGF0YSlcbiAgICB0aGlzLm5vZGUuZGlzcGF0Y2hFdmVudChldmVudClcbiAgfSxcblxuICBvbkFwcGVuZDogZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV2dHMgPSB0aGlzLmRhdGEuZXZlbnRcbiAgICBpZiAoIWV2dHMgfHwgIWV2dHMubGVuZ3RoKSB7IHJldHVybiB9XG4gICAgbGV0IGZsYWcgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gZXZ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChldnRzW2ldID09PSAnYXBwZWFyJykge1xuICAgICAgICBmbGFnID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZsYWcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyB0cmlnZ2VyICdhcHBlYXInIGV2ZW50IGluIHRoZSBuZXh0IHRpY2suXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoaXNDb21wb25lbnRBcHBlYXIodGhpcykpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdhcHBlYXInLCB7IGRpcmVjdGlvbjogJycgfSlcbiAgICAgIH1cbiAgICB9LCAwKVxuICB9LFxuXG4gIGFkZEFwcGVuZEhhbmRsZXIgKGNiKSB7XG4gICAgbGV0IHByZVxuICAgIGlmICh0aGlzLm9uQXBwZW5kKSB7XG4gICAgICBwcmUgPSB0aGlzLm9uQXBwZW5kLmJpbmQodGhpcylcbiAgICB9XG4gICAgdGhpcy5vbkFwcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByZSAmJiBwcmUuY2FsbCh0aGlzKVxuICAgICAgY2IgJiYgY2IuY2FsbCh0aGlzKVxuICAgIH0uYmluZCh0aGlzKVxuICB9LFxuXG4gIC8vIGNoYW5nZSBzcmMgdG8gaW1nLXNyYyBmb3IgbGliLmltZyB0byBmaXJlIGxhenlsb2FkIGxhdGVyLlxuICBlbmFibGVMYXp5bG9hZCAoc3JjKSB7XG4gICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgbWFrZUltYWdlTGF6eSh0aGlzLm5vZGUsIHNyYylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB0aGlzLm5vZGUgZG9lcyBub3QgZXhpc3QuJylcbiAgICB9XG4gIH0sXG5cbiAgLy8gdGFyZ2V0IGNhbiBiZSBib3RoIHdlZXggY29tcG9uZW50IGFuZCBkb20gZWxlbWVudC5cbiAgZmlyZUxhenlsb2FkICh0YXJnZXQpIHtcbiAgICAhdGFyZ2V0ICYmICh0YXJnZXQgPSB0aGlzKVxuICAgIGZpcmVMYXp5bG9hZCh0YXJnZXQpXG4gIH0sXG5cbiAgYXR0cjoge30sIC8vIGF0dHIgc2V0dGVyc1xuXG4gIHN0eWxlOiB7fSwgLy8gc3R5bGUgc2V0dGVyc1xuXG4gIC8vIGV2ZW50IGZ1bmNzXG4gIC8vICAtIDEuICd1cGRhdG9yJyBmb3IgdXBkYXRpbmcgYXR0cnMgb3Igc3R5bGVzIHdpdGggb3V0IHRyaWdnZXJpbmcgbWVzc2FnZXMuXG4gIC8vICAtIDIuICdleHRyYScgZm9yIGJpbmRpbmcgZXh0cmEgZGF0YS5cbiAgLy8gIC0gMy4gJ3NldHRlcicgc2V0IGEgc3BlY2lmaWVkIGV2ZW50IGhhbmRsZXIuXG4gIC8vIGZ1bmNzIHNob3VsZCBiZSBmdW5jdGlvbnMgbGlrZSB0aGlzOiAodGFrZSAnY2hhbmdlJyBldmVudCBhcyBhIGV4YW1wbGUpXG4gIC8vIHtcbiAgLy8gICBjaGFuZ2U6IHtcbiAgLy8gICAgIHVwZGF0b3IgKCkge1xuICAvLyAgICAgICByZXR1cm4ge1xuICAvLyAgICAgICAgIGF0dHJzOiB7XG4gIC8vICAgICAgICAgICBjaGVja2VkOiB0aGlzLmNoZWNrZWRcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0sXG4gIC8vICAgICBleHRyYSAoKSB7XG4gIC8vICAgICAgIHJldHVybiB7XG4gIC8vICAgICAgICAgdmFsdWU6IHRoaXMuY2hlY2tlZFxuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG4gIGV2ZW50OiB7fSxcblxuICBjbGVhckF0dHIgKCkge1xuICB9LFxuXG4gIGNsZWFyU3R5bGUgKCkge1xuICAgIHRoaXMubm9kZS5jc3NUZXh0ID0gJydcbiAgfVxufVxuXG4vLyBleHRlbmQgb3BlcmF0aW9ucy5cbmV4dGVuZChDb21wb25lbnQucHJvdG90eXBlLCBvcGVyYXRlKVxuXG4vLyBleHRlbmQgYXR0ciBhbmQgc3R5bGUgc2V0dGVycyBmcm9tICdwb3NpdGlvbicgYW5kICdmbGV4Ym94Jy5cbmV4dGVuZChDb21wb25lbnQucHJvdG90eXBlLCBwb3NpdGlvbilcbmV4dGVuZChDb21wb25lbnQucHJvdG90eXBlLnN0eWxlLCBmbGV4Ym94LnN0eWxlKVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudCdcblxuLy8gQ29tcG9uZW50IHdoaWNoIGNhbiBoYXZlIG5vIHN1YmNvbXBvbmVudHMuXG4vLyBUaGlzIGNvbXBvbmVudCBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSwgc2luY2Vcbi8vIGl0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIHRvIGV4dGVuZCBmcm9tLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXRvbWljIChkYXRhKSB7XG4gIENvbXBvbmVudC5jYWxsKHRoaXMsIGRhdGEpXG59XG5cbkF0b21pYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG5cbkF0b21pYy5wcm90b3R5cGUuY3JlYXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAvLyBkbyBub250aGluZ1xuICByZXR1cm5cbn1cblxuQXRvbWljLnByb3RvdHlwZS5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIC8vIGRvIG5vdGhpbmdcbiAgcmV0dXJuXG59XG5cbkF0b21pYy5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKGNoaWxkLCBiZWZvcmUpIHtcbiAgLy8gZG8gbm90aGluZ1xuICByZXR1cm5cbn1cblxuQXRvbWljLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAvLyBkbyBub3RoaW5nXG4gIHJldHVyblxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogc2F2ZSB0aGUgb3JpZ2luYWwgbGlzdGVuZXIgZm9yICdhZGRFdmVudExpc3RlbmVyJy5cbiAqIHRoaXMgaXMgdGhlIGRpcGFjaGluZyBsaXN0ZW5lciB3aGljaCBpcyB3YWl0aW5nIGZvciBmZWVkLlxuICogbWFwIHN0cnVjdHVyZTogbW9kdWxlTmFtZSAtPiBldmVudE5hbWUgLT4gW2hhbmRsZXJzXS5cbiAqL1xuY29uc3QgaGFuZGxlck1hcCA9IHt9XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb2R1bGVldmVudCcsIGV2ZW50ID0+IHtcbiAgY29uc3QgZHQgPSBldmVudC5kZXRhaWwgfHwge31cbiAgY29uc3QgbW9kdWxlID0gZHQubW9kdWxlXG4gIGNvbnN0IHR5cGUgPSBkdC50eXBlXG4gIHRyeSB7XG4gICAgaGFuZGxlck1hcFttb2R1bGVdW3R5cGVdLmZvckVhY2goaGFuZGxlciA9PiBoYW5kbGVyKGR0KSlcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gbm8gc3VjaCBldmVudCAke3R5cGV9IGZvciBtb2R1bGUgJHttb2R1bGV9LmApXG4gIH1cbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyIChtb2R1bGUsIGV2dCwgY2FsbGJhY2tJZCwgb3B0aW9ucykge1xuICBjb25zdCBvbmNlID0gb3B0aW9ucyAmJiAhIW9wdGlvbnMub25jZVxuICBsZXQgbW9kdWxlTWFwID0gaGFuZGxlck1hcFttb2R1bGVdXG4gIGlmICghbW9kdWxlTWFwKSB7XG4gICAgbW9kdWxlTWFwID0gaGFuZGxlck1hcFttb2R1bGVdID0ge31cbiAgfVxuICBsZXQgaGFuZGxlcnMgPSBtb2R1bGVNYXBbZXZ0XVxuICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgaGFuZGxlcnMgPSBtb2R1bGVNYXBbZXZ0XSA9IFtdXG4gIH1cbiAgaGFuZGxlcnMucHVzaCgoZGF0YSkgPT4gdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIGRhdGEsICFvbmNlKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzIChtb2R1bGUsIGV2dCkge1xuICB0cnkge1xuICAgIGRlbGV0ZSBoYW5kbGVyTWFwW21vZHVsZV1bZXZ0XVxuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgLy8gZG8gbm90aGluZy5cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICcuLi9kb20vY29tcG9uZW50TWFuYWdlcidcbmltcG9ydCB7IHJlZ2lzdGVyTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXInXG5pbXBvcnQgeyBwcm90b2NvbCB9IGZyb20gJy4uL2JyaWRnZSdcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRMaXN0ZW5lciwgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMgfSBmcm9tICcuLi9iYXNlL21vZHVsZUV2ZW50J1xuXG4vKipcbiAqIHJlZ2lzdGVyIG1vZHVsZSBldmVudCBsaXN0ZW5lciBmb3IgZXZlcnkgYXBpIG1vZHVsZSBleGNlcHQgJ2dsb2JhbEV2ZW50Jy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVFdmVudExpc3RlbmVyIChuYW1lLCBtb2R1bGUsIG1ldGEpIHtcbiAgaWYgKG5hbWUgIT09ICdnbG9iYWxFdmVudCcpIHtcbiAgICBtb2R1bGVbJ2FkZEV2ZW50TGlzdGVuZXInXSA9IGZ1bmN0aW9uIChldnQsIGNhbGxiYWNrSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgbmFtZSwgZXZ0LCBjYWxsYmFja0lkLCBvcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGVbJ3JlbW92ZUFsbEV2ZW50TGlzdGVuZXJzJ10gPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICByZXR1cm4gcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMuY2FsbCh0aGlzLCBuYW1lLCBldnQpXG4gICAgfVxuICAgIDsgW3tcbiAgICAgIG5hbWU6ICdhZGRFdmVudExpc3RlbmVyJyxcbiAgICAgIGFyZ3M6IFsnc3RyaW5nJywgJ2Z1bmN0aW9uJywgJ29iamVjdCddXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3JlbW92ZUFsbEV2ZW50TGlzdGVuZXJzJyxcbiAgICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgICB9XS5mb3JFYWNoKGluZm8gPT4gbWV0YVtuYW1lXS5wdXNoKGluZm8pKVxuICB9XG59XG5cbmNvbnN0IG1ldGhvZHMgPSB7XG4gIC8vIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgcmVnaXN0ZXJDb21wb25lbnQgKG5hbWUsIGNvbXApIHtcbiAgICBDb21wb25lbnRNYW5hZ2VyLnJlZ2lzdGVyQ29tcG9uZW50KG5hbWUsIGNvbXApXG4gIH0sXG5cbiAgLy8gUmVnaXN0ZXIgYSBuZXcgYXBpIG1vZHVsZS5cbiAgLy8gSWYgdGhlIG1vZHVsZSBhbHJlYWR5IGV4aXN0cywganVzdCBhZGQgbWV0aG9kcyBmcm9tIHRoZVxuICAvLyBuZXcgbW9kdWxlIHRvIHRoZSBvbGQgb25lLlxuICByZWdpc3RlckFwaU1vZHVsZSAobmFtZSwgbW9kdWxlLCBtZXRhKSB7XG4gICAgcmVnaXN0ZXJNb2R1bGVFdmVudExpc3RlbmVyKG5hbWUsIG1vZHVsZSwgbWV0YSlcbiAgICBpZiAoIXByb3RvY29sLmFwaU1vZHVsZVtuYW1lXSkge1xuICAgICAgcHJvdG9jb2wuYXBpTW9kdWxlW25hbWVdID0gbW9kdWxlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kdWxlKSB7XG4gICAgICAgIGlmIChtb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHByb3RvY29sLmFwaU1vZHVsZVtuYW1lXVtrZXldID0gbW9kdWxlW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyByZWdpc3RlciBBUEkgbW9kdWxlJ3MgbWV0YSBpbmZvIHRvIGpzZnJhbWV3b3JrXG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHByb3RvY29sLnNldEFwaU1vZHVsZU1ldGEobWV0YSlcbiAgICAgIGdsb2JhbC5yZWdpc3Rlck1vZHVsZXMocHJvdG9jb2wuZ2V0QXBpTW9kdWxlTWV0YShuYW1lKSwgdHJ1ZSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gUmVnaXN0ZXIgYSBuZXcgYXBpIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuXG4gIC8vIG9wdHM6XG4gIC8vICAtIGFyZ3M6IHR5cGUgb2YgYXJndW1lbnRzIHRoZSBBUEkgbWV0aG9kIHRha2VzIHN1Y2hcbiAgLy8gICAgYXMgWydzdHJpbmcnLCAnZnVuY3Rpb24nXVxuICByZWdpc3RlckFwaSAobW9kdWxlTmFtZSwgbmFtZSwgbWV0aG9kLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBtZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXByb3RvY29sLmFwaU1vZHVsZVttb2R1bGVOYW1lXSkge1xuICAgICAgcHJvdG9jb2wuYXBpTW9kdWxlW21vZHVsZU5hbWVdID0ge31cbiAgICAgIHByb3RvY29sLl9tZXRhW21vZHVsZU5hbWVdID0gW11cbiAgICB9XG4gICAgcHJvdG9jb2wuYXBpTW9kdWxlW21vZHVsZU5hbWVdW25hbWVdID0gbWV0aG9kXG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcmVnaXN0ZXIgQVBJIG1ldGEgaW5mbyB0byBqc2ZyYW1ld29ya1xuICAgIHByb3RvY29sLnNldEFwaU1ldGEobW9kdWxlTmFtZSwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KVxuICAgIGdsb2JhbC5yZWdpc3Rlck1vZHVsZXMocHJvdG9jb2wuZ2V0QXBpTW9kdWxlTWV0YShtb2R1bGVOYW1lKSwgdHJ1ZSlcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIG5ldyB3ZWV4LWJ1bmRsZS1sb2FkZXIuXG4gIHJlZ2lzdGVyTG9hZGVyIChuYW1lLCBsb2FkZXJGdW5jKSB7XG4gICAgcmVnaXN0ZXJMb2FkZXIobmFtZSwgbG9hZGVyRnVuYylcbiAgfVxuXG59XG5cbi8vIFRvIGluc3RhbGwgY29tcG9uZW50cyBhbmQgcGx1Z2lucy5cbmZ1bmN0aW9uIGluc3RhbGwgKG1vZCkge1xuICBtb2QuaW5pdCh0aGlzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZCAoV2VleCkge1xuICBXZWV4Lmluc3RhbGwgPSBpbnN0YWxsLmJpbmQoV2VleClcbiAgZXh0ZW5kKFdlZXgsIG1ldGhvZHMpXG59XG4iLCIodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpICYmICh3aW5kb3cgPSB7Y3RybDoge30sIGxpYjoge319KTshd2luZG93LmN0cmwgJiYgKHdpbmRvdy5jdHJsID0ge30pOyF3aW5kb3cubGliICYmICh3aW5kb3cubGliID0ge30pOyFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ2YWxcIix7dmFsdWU6YS50b1N0cmluZygpLGVudW1lcmFibGU6ITB9KSx0aGlzLmd0PWZ1bmN0aW9uKGEpe3JldHVybiBjLmNvbXBhcmUodGhpcyxhKT4wfSx0aGlzLmd0ZT1mdW5jdGlvbihhKXtyZXR1cm4gYy5jb21wYXJlKHRoaXMsYSk+PTB9LHRoaXMubHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuY29tcGFyZSh0aGlzLGEpPDB9LHRoaXMubHRlPWZ1bmN0aW9uKGEpe3JldHVybiBjLmNvbXBhcmUodGhpcyxhKTw9MH0sdGhpcy5lcT1mdW5jdGlvbihhKXtyZXR1cm4gMD09PWMuY29tcGFyZSh0aGlzLGEpfX1iLmVudj1iLmVudnx8e30sYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx9LGMucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52YWwuc3BsaXQoXCIuXCIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1wYXJzZUludChhW2NdLDEwKTtpc05hTihkKSYmKGQ9MCk7dmFyIGU9ZC50b1N0cmluZygpO2UubGVuZ3RoPDUmJihlPUFycmF5KDYtZS5sZW5ndGgpLmpvaW4oXCIwXCIpK2UpLGIucHVzaChlKSwxPT09Yi5sZW5ndGgmJmIucHVzaChcIi5cIil9cmV0dXJuIHBhcnNlRmxvYXQoYi5qb2luKFwiXCIpKX0sYy5jb21wYXJlPWZ1bmN0aW9uKGEsYil7YT1hLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLGI9Yi50b1N0cmluZygpLnNwbGl0KFwiLlwiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RofHxjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9cGFyc2VJbnQoYVtjXSwxMCksZT1wYXJzZUludChiW2NdLDEwKTtpZih3aW5kb3cuaXNOYU4oZCkmJihkPTApLHdpbmRvdy5pc05hTihlKSYmKGU9MCksZT5kKXJldHVybi0xO2lmKGQ+ZSlyZXR1cm4gMX1yZXR1cm4gMH0sYi52ZXJzaW9uPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYyhhKX19KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjPWEubG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoL15cXD8vLFwiXCIpO2lmKGIuZW52LnBhcmFtcz17fSxjKWZvcih2YXIgZD1jLnNwbGl0KFwiJlwiKSxlPTA7ZTxkLmxlbmd0aDtlKyspe2RbZV09ZFtlXS5zcGxpdChcIj1cIik7dHJ5e2IuZW52LnBhcmFtc1tkW2VdWzBdXT1kZWNvZGVVUklDb21wb25lbnQoZFtlXVsxXSl9Y2F0Y2goZil7Yi5lbnYucGFyYW1zW2RbZV1bMF1dPWRbZV1bMV19fX0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSksZnVuY3Rpb24oYSxiKXtiLmVudj1iLmVudnx8e307dmFyIGMsZD1hLm5hdmlnYXRvci51c2VyQWdlbnQ7aWYoYz1kLm1hdGNoKC9XaW5kb3dzXFxzUGhvbmVcXHMoPzpPU1xccyk/KFtcXGRcXC5dKykvKSliLmVudi5vcz17bmFtZTpcIldpbmRvd3MgUGhvbmVcIixpc1dpbmRvd3NQaG9uZTohMCx2ZXJzaW9uOmNbMV19O2Vsc2UgaWYoZC5tYXRjaCgvU2FmYXJpLykmJihjPWQubWF0Y2goL0FuZHJvaWRbXFxzXFwvXShbXFxkXFwuXSspLykpKWIuZW52Lm9zPXt2ZXJzaW9uOmNbMV19LGQubWF0Y2goL01vYmlsZVxccytTYWZhcmkvKT8oYi5lbnYub3MubmFtZT1cIkFuZHJvaWRcIixiLmVudi5vcy5pc0FuZHJvaWQ9ITApOihiLmVudi5vcy5uYW1lPVwiQW5kcm9pZFBhZFwiLGIuZW52Lm9zLmlzQW5kcm9pZFBhZD0hMCk7ZWxzZSBpZihjPWQubWF0Y2goLyhpUGhvbmV8aVBhZHxpUG9kKS8pKXt2YXIgZT1jWzFdO2M9ZC5tYXRjaCgvT1MgKFtcXGRfXFwuXSspIGxpa2UgTWFjIE9TIFgvKSxiLmVudi5vcz17bmFtZTplLGlzSVBob25lOlwiaVBob25lXCI9PT1lfHxcImlQb2RcIj09PWUsaXNJUGFkOlwiaVBhZFwiPT09ZSxpc0lPUzohMCx2ZXJzaW9uOmNbMV0uc3BsaXQoXCJfXCIpLmpvaW4oXCIuXCIpfX1lbHNlIGIuZW52Lm9zPXtuYW1lOlwidW5rbm93blwiLHZlcnNpb246XCIwLjAuMFwifTtiLnZlcnNpb24mJihiLmVudi5vcy52ZXJzaW9uPWIudmVyc2lvbihiLmVudi5vcy52ZXJzaW9uKSl9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjLGQ9YS5uYXZpZ2F0b3IudXNlckFnZW50OyhjPWQubWF0Y2goLyg/OlVDV0VCfFVDQnJvd3NlclxcLykoW1xcZFxcLl0rKS8pKT9iLmVudi5icm93c2VyPXtuYW1lOlwiVUNcIixpc1VDOiEwLHZlcnNpb246Y1sxXX06KGM9ZC5tYXRjaCgvTVFRQnJvd3NlclxcLyhbXFxkXFwuXSspLykpP2IuZW52LmJyb3dzZXI9e25hbWU6XCJRUVwiLGlzUVE6ITAsdmVyc2lvbjpjWzFdfTooYz1kLm1hdGNoKC9GaXJlZm94XFwvKFtcXGRcXC5dKykvKSk/Yi5lbnYuYnJvd3Nlcj17bmFtZTpcIkZpcmVmb3hcIixpc0ZpcmVmb3g6ITAsdmVyc2lvbjpjWzFdfTooYz1kLm1hdGNoKC9NU0lFXFxzKFtcXGRcXC5dKykvKSl8fChjPWQubWF0Y2goL0lFTW9iaWxlXFwvKFtcXGRcXC5dKykvKSk/KGIuZW52LmJyb3dzZXI9e3ZlcnNpb246Y1sxXX0sZC5tYXRjaCgvSUVNb2JpbGUvKT8oYi5lbnYuYnJvd3Nlci5uYW1lPVwiSUVNb2JpbGVcIixiLmVudi5icm93c2VyLmlzSUVNb2JpbGU9ITApOihiLmVudi5icm93c2VyLm5hbWU9XCJJRVwiLGIuZW52LmJyb3dzZXIuaXNJRT0hMCksZC5tYXRjaCgvQW5kcm9pZHxpUGhvbmUvKSYmKGIuZW52LmJyb3dzZXIuaXNJRUxpa2VXZWJraXQ9ITApKTooYz1kLm1hdGNoKC8oPzpDaHJvbWV8Q3JpT1MpXFwvKFtcXGRcXC5dKykvKSk/KGIuZW52LmJyb3dzZXI9e25hbWU6XCJDaHJvbWVcIixpc0Nocm9tZTohMCx2ZXJzaW9uOmNbMV19LGQubWF0Y2goL1ZlcnNpb25cXC9bXFxkK1xcLl0rXFxzKkNocm9tZS8pJiYoYi5lbnYuYnJvd3Nlci5uYW1lPVwiQ2hyb21lIFdlYnZpZXdcIixiLmVudi5icm93c2VyLmlzV2Vidmlldz0hMCkpOmQubWF0Y2goL1NhZmFyaS8pJiYoYz1kLm1hdGNoKC9BbmRyb2lkW1xcc1xcL10oW1xcZFxcLl0rKS8pKT9iLmVudi5icm93c2VyPXtuYW1lOlwiQW5kcm9pZFwiLGlzQW5kcm9pZDohMCx2ZXJzaW9uOmNbMV19OmQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvKT9kLm1hdGNoKC9TYWZhcmkvKT8oYz1kLm1hdGNoKC9WZXJzaW9uXFwvKFtcXGRcXC5dKykvKSxiLmVudi5icm93c2VyPXtuYW1lOlwiU2FmYXJpXCIsaXNTYWZhcmk6ITAsdmVyc2lvbjpjWzFdfSk6KGM9ZC5tYXRjaCgvT1MgKFtcXGRfXFwuXSspIGxpa2UgTWFjIE9TIFgvKSxiLmVudi5icm93c2VyPXtuYW1lOlwiaU9TIFdlYnZpZXdcIixpc1dlYnZpZXc6ITAsdmVyc2lvbjpjWzFdLnJlcGxhY2UoL1xcXy9nLFwiLlwiKX0pOmIuZW52LmJyb3dzZXI9e25hbWU6XCJ1bmtub3duXCIsdmVyc2lvbjpcIjAuMC4wXCJ9LGIudmVyc2lvbiYmKGIuZW52LmJyb3dzZXIudmVyc2lvbj1iLnZlcnNpb24oYi5lbnYuYnJvd3Nlci52ZXJzaW9uKSl9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjPWEubmF2aWdhdG9yLnVzZXJBZ2VudDtjLm1hdGNoKC9XZWliby9pKT9iLmVudi50aGlyZGFwcD17YXBwbmFtZTpcIldlaWJvXCIsaXNXZWlibzohMH06Yy5tYXRjaCgvTWljcm9NZXNzZW5nZXIvaSk/Yi5lbnYudGhpcmRhcHA9e2FwcG5hbWU6XCJXZWl4aW5cIixpc1dlaXhpbjohMH06Yi5lbnYudGhpcmRhcHA9ITF9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjLGQsZT1hLm5hdmlnYXRvci51c2VyQWdlbnQ7KGQ9ZS5tYXRjaCgvV2luZFZhbmVbXFwvXFxzXShbXFxkXFwuXFxfXSspLykpJiYoYz1kWzFdKTt2YXIgZj0hMSxnPVwiXCIsaD1cIlwiLGk9XCJcIjsoZD1lLm1hdGNoKC9BbGlBcHBcXCgoW0EtWlxcLV0rKVxcLyhbXFxkXFwuXSspXFwpL2kpKSYmKGY9ITAsZz1kWzFdLGk9ZFsyXSxoPWcuaW5kZXhPZihcIi1QRFwiKT4wP2IuZW52Lm9zLmlzSU9TP1wiaVBhZFwiOmIuZW52Lm9zLmlzQW5kcm9pZD9cIkFuZHJvaWRQYWRcIjpiLmVudi5vcy5uYW1lOmIuZW52Lm9zLm5hbWUpLCFnJiZlLmluZGV4T2YoXCJUQklPU1wiKT4wJiYoZz1cIlRCXCIpLGY/Yi5lbnYuYWxpYXBwPXt3aW5kdmFuZTpiLnZlcnNpb24oY3x8XCIwLjAuMFwiKSxhcHBuYW1lOmd8fFwidW5rb3duXCIsdmVyc2lvbjpiLnZlcnNpb24oaXx8XCIwLjAuMFwiKSxwbGF0Zm9ybTpofHxiLmVudi5vcy5uYW1lfTpiLmVudi5hbGlhcHA9ITEsYi5lbnYudGFvYmFvQXBwPWIuZW52LmFsaWFwcH0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSk7O21vZHVsZS5leHBvcnRzID0gd2luZG93LmxpYlsnZW52J107IiwiKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSAmJiAod2luZG93ID0ge2N0cmw6IHt9LCBsaWI6IHt9fSk7IXdpbmRvdy5jdHJsICYmICh3aW5kb3cuY3RybCA9IHt9KTshd2luZG93LmxpYiAmJiAod2luZG93LmxpYiA9IHt9KTshZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3ZhciBiPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicGFyYW1zXCIse3NldDpmdW5jdGlvbihhKXtpZihcIm9iamVjdFwiPT10eXBlb2YgYSl7Zm9yKHZhciBjIGluIGIpZGVsZXRlIGJbY107Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdfX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ9LGVudW1lcmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInNlYXJjaFwiLHtzZXQ6ZnVuY3Rpb24oYSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEpezA9PT1hLmluZGV4T2YoXCI/XCIpJiYoYT1hLnN1YnN0cigxKSk7dmFyIGM9YS5zcGxpdChcIiZcIik7Zm9yKHZhciBkIGluIGIpZGVsZXRlIGJbZF07Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWNbZV0uc3BsaXQoXCI9XCIpO2lmKHZvaWQgMCE9PWZbMV0mJihmWzFdPWZbMV0udG9TdHJpbmcoKSksZlswXSl0cnl7YltkZWNvZGVVUklDb21wb25lbnQoZlswXSldPWRlY29kZVVSSUNvbXBvbmVudChmWzFdKX1jYXRjaChnKXtiW2ZbMF1dPWZbMV19fX19LGdldDpmdW5jdGlvbigpe3ZhciBhPVtdO2Zvcih2YXIgYyBpbiBiKWlmKHZvaWQgMCE9PWJbY10paWYoXCJcIiE9PWJbY10pdHJ5e2EucHVzaChlbmNvZGVVUklDb21wb25lbnQoYykrXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGJbY10pKX1jYXRjaChkKXthLnB1c2goYytcIj1cIitiW2NdKX1lbHNlIHRyeXthLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGMpKX1jYXRjaChkKXthLnB1c2goYyl9cmV0dXJuIGEubGVuZ3RoP1wiP1wiK2Euam9pbihcIiZcIik6XCJcIn0sZW51bWVyYWJsZTohMH0pO3ZhciBjO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiaGFzaFwiLHtzZXQ6ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09dHlwZW9mIGEmJihhJiZhLmluZGV4T2YoXCIjXCIpPDAmJihhPVwiI1wiK2EpLGM9YXx8XCJcIil9LGdldDpmdW5jdGlvbigpe3JldHVybiBjfSxlbnVtZXJhYmxlOiEwfSksdGhpcy5zZXQ9ZnVuY3Rpb24oYSl7YT1hfHxcIlwiO3ZhciBiO2lmKCEoYj1hLm1hdGNoKG5ldyBSZWdFeHAoXCJeKFthLXowLTktXSs6KT9bL117Mn0oPzooW15ALzo/XSspKD86OihbXkAvOl0rKSk/QCk/KFteOi8/I10rKSg/Ols6XShbMC05XSspKT8oWy9dW14/IztdKik/KD86Wz9dKFteI10qKSk/KFsjXVteP10qKT8kXCIsXCJpXCIpKSkpdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgdXJpIHNjaGVtZS5cIik7dGhpcy5wcm90b2NvbD1iWzFdfHwoXCJvYmplY3RcIj09dHlwZW9mIGxvY2F0aW9uP2xvY2F0aW9uLnByb3RvY29sOlwiXCIpLHRoaXMudXNlcm5hbWU9YlsyXXx8XCJcIix0aGlzLnBhc3N3b3JkPWJbM118fFwiXCIsdGhpcy5ob3N0bmFtZT10aGlzLmhvc3Q9Yls0XSx0aGlzLnBvcnQ9Yls1XXx8XCJcIix0aGlzLnBhdGhuYW1lPWJbNl18fFwiL1wiLHRoaXMuc2VhcmNoPWJbN118fFwiXCIsdGhpcy5oYXNoPWJbOF18fFwiXCIsdGhpcy5vcmlnaW49dGhpcy5wcm90b2NvbCtcIi8vXCIrdGhpcy5ob3N0bmFtZX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucHJvdG9jb2wrXCIvL1wiO3JldHVybiB0aGlzLnVzZXJuYW1lJiYoYSs9dGhpcy51c2VybmFtZSx0aGlzLnBhc3N3b3JkJiYoYSs9XCI6XCIrdGhpcy5wYXNzd29yZCksYSs9XCJAXCIpLGErPXRoaXMuaG9zdCx0aGlzLnBvcnQmJlwiODBcIiE9PXRoaXMucG9ydCYmKGErPVwiOlwiK3RoaXMucG9ydCksdGhpcy5wYXRobmFtZSYmKGErPXRoaXMucGF0aG5hbWUpLHRoaXMuc2VhcmNoJiYoYSs9dGhpcy5zZWFyY2gpLHRoaXMuaGFzaCYmKGErPXRoaXMuaGFzaCksYX0sYSYmdGhpcy5zZXQoYS50b1N0cmluZygpKX1iLmh0dHB1cmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBjKGEpfX0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSk7O21vZHVsZS5leHBvcnRzID0gd2luZG93LmxpYlsnaHR0cHVybCddOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBpc0luaXRpYWxpemVkID0gZmFsc2VcblxuLy8gbWFqb3IgZXZlbnRzIHN1cHBvcnRlZDpcbi8vICAgcGFuc3RhcnRcbi8vICAgcGFubW92ZVxuLy8gICBwYW5lbmRcbi8vICAgc3dpcGVcbi8vICAgbG9uZ3ByZXNzXG4vLyBleHRyYSBldmVudHMgc3VwcG9ydGVkOlxuLy8gICBkdWFsdG91Y2hzdGFydFxuLy8gICBkdWFsdG91Y2hcbi8vICAgZHVhbHRvdWNoZW5kXG4vLyAgIHRhcFxuLy8gICBkb3VibGV0YXBcbi8vICAgcHJlc3NlbmRcblxudmFyIGRvYyA9IHdpbmRvdy5kb2N1bWVudFxudmFyIGRvY0VsID0gZG9jLmRvY3VtZW50RWxlbWVudFxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG52YXIgZ2VzdHVyZXMgPSB7fVxudmFyIGxhc3RUYXAgPSBudWxsXG5cbi8qKlxuICogZmluZCB0aGUgY2xvc2VzdCBjb21tb24gYW5jZXN0b3JcbiAqIGlmIHRoZXJlJ3Mgbm8gb25lLCByZXR1cm4gbnVsbFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsMSBmaXJzdCBlbGVtZW50XG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbDIgc2Vjb25kIGVsZW1lbnRcbiAqIEByZXR1cm4ge0VsZW1lbnR9ICAgICBjb21tb24gYW5jZXN0b3JcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tbW9uQW5jZXN0b3IoZWwxLCBlbDIpIHtcbiAgdmFyIGVsID0gZWwxXG4gIHdoaWxlIChlbCkge1xuICAgIGlmIChlbC5jb250YWlucyhlbDIpIHx8IGVsID09IGVsMikge1xuICAgICAgcmV0dXJuIGVsXG4gICAgfVxuICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogZmlyZSBhIEhUTUxFdmVudFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsZW1lbnQgd2hpY2ggZWxlbWVudCB0byBmaXJlIGEgZXZlbnQgb25cbiAqIEBwYXJhbSAge3N0cmluZ30gIHR5cGUgICAgdHlwZSBvZiBldmVudFxuICogQHBhcmFtICB7b2JqZWN0fSAgZXh0cmEgICBleHRyYSBkYXRhIGZvciB0aGUgZXZlbnQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudChlbGVtZW50LCB0eXBlLCBleHRyYSkge1xuICB2YXIgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKVxuICBldmVudC5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSlcblxuICBpZiAodHlwZW9mIGV4dHJhID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIHAgaW4gZXh0cmEpIHtcbiAgICAgIGV2ZW50W3BdID0gZXh0cmFbcF1cbiAgICB9XG4gIH1cblxuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG59XG5cbi8qKlxuICogY2FsYyB0aGUgdHJhbnNmb3JtXG4gKiBhc3N1bWUgNCBwb2ludHMgQUJDRCBvbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW1cbiAqID4gcm90YXRl77yaYW5nbGUgcm90YXRpbmcgZnJvbSBBQiB0byBDRFxuICogPiBzY2FsZe+8mnNjYWxlIHJhdGlvIGZyb20gQUIgdG8gQ0RcbiAqID4gdHJhbnNsYXRl77yadHJhbnNsYXRlIHNoaWZ0IGZyb20gQSB0byBDXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSB4MSBhYnNjaXNzYSBvZiBBXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkxIG9yZGluYXRlIG9mIEFcbiAqIEBwYXJhbSAge251bWJlcn0geDIgYWJzY2lzc2Egb2YgQlxuICogQHBhcmFtICB7bnVtYmVyfSB5MiBvcmRpbmF0ZSBvZiBCXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgzIGFic2Npc3NhIG9mIENcbiAqIEBwYXJhbSAge251bWJlcn0geTMgb3JkaW5hdGUgb2YgQ1xuICogQHBhcmFtICB7bnVtYmVyfSB4NCBhYnNjaXNzYSBvZiBEXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHk0IG9yZGluYXRlIG9mIERcbiAqIEByZXR1cm4ge29iamVjdH0gICAgdHJhbnNmb3JtIG9iamVjdCBsaWtlXG4gKiAgIHtyb3RhdGUsIHNjYWxlLCB0cmFuc2xhdGVbMl0sIG1hdHJpeFszXVszXX1cbiAqL1xuZnVuY3Rpb24gY2FsYyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgdmFyIHJvdGF0ZSA9IE1hdGguYXRhbjIoeTQgLSB5MywgeDQgLSB4MykgLSBNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpXG4gIHZhciBzY2FsZSA9IE1hdGguc3FydCgoTWF0aC5wb3coeTQgLSB5MywgMilcbiAgICArIE1hdGgucG93KHg0IC0geDMsIDIpKSAvIChNYXRoLnBvdyh5MiAtIHkxLCAyKVxuICAgICsgTWF0aC5wb3coeDIgLSB4MSwgMikpKVxuICB2YXIgdHJhbnNsYXRlID0gW1xuICAgIHgzXG4gICAgLSBzY2FsZSAqIHgxICogTWF0aC5jb3Mocm90YXRlKVxuICAgICsgc2NhbGUgKiB5MSAqIE1hdGguc2luKHJvdGF0ZSksXG4gICAgeTNcbiAgICAtIHNjYWxlICogeTEgKiBNYXRoLmNvcyhyb3RhdGUpXG4gICAgLSBzY2FsZSAqIHgxICogTWF0aC5zaW4ocm90YXRlKV1cblxuICByZXR1cm4ge1xuICAgIHJvdGF0ZTogcm90YXRlLFxuICAgIHNjYWxlOiBzY2FsZSxcbiAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZSxcbiAgICBtYXRyaXg6IFtcbiAgICAgIFtzY2FsZSAqIE1hdGguY29zKHJvdGF0ZSksIC1zY2FsZSAqIE1hdGguc2luKHJvdGF0ZSksIHRyYW5zbGF0ZVswXV0sXG4gICAgICBbc2NhbGUgKiBNYXRoLnNpbihyb3RhdGUpLCBzY2FsZSAqIE1hdGguY29zKHJvdGF0ZSksIHRyYW5zbGF0ZVsxXV0sXG4gICAgICBbMCwgMCwgMV1cbiAgICBdXG4gIH1cbn1cblxuLyoqXG4gKiB0YWtlIG92ZXIgdGhlIHRvdWNoc3RhcnQgZXZlbnRzLiBBZGQgbmV3IHRvdWNoZXMgdG8gdGhlIGdlc3R1cmVzLlxuICogSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgcmVjb3JkcywgdGhlbiBiaW5kIHRvdWNobW92ZSwgdG9jaGVuZFxuICogYW5kIHRvdWNoY2FuY2VsIGV2ZW50cy5cbiAqIG5ldyB0b3VjaGVzIGluaXRpYWxpemVkIHdpdGggc3RhdGUgJ3RhcHBpbmcnLCBhbmQgd2l0aGluIDUwMCBtaWxsaXNlY29uZHNcbiAqIGlmIHRoZSBzdGF0ZSBpcyBzdGlsbCB0YXBwaW5nLCB0aGVuIHRyaWdnZXIgZ2VzdHVyZSAncHJlc3MnLlxuICogSWYgdGhlcmUgYXJlIHR3byB0b3VjaGUgcG9pbnRzLCB0aGVuIHRoZSAnZHVhbHRvdWNoc3RhcnQnIGlzIHRyaWdnZXJkLiBUaGVcbiAqIG5vZGUgb2YgdGhlIHRvdWNoIGdlc3R1cmUgaXMgdGhlaXIgY2xvZXN0IGNvbW1vbiBhbmNlc3Rvci5cbiAqXG4gKiBAZXZlbnRcbiAqIEBwYXJhbSAge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiB0b3VjaHN0YXJ0SGFuZGxlcihldmVudCkge1xuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09PSAwKSB7XG4gICAgZG9jRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlSGFuZGxlciwgZmFsc2UpXG4gICAgZG9jRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZEhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyLCBmYWxzZSlcbiAgfVxuXG4gIC8vIHJlY29yZCBldmVyeSB0b3VjaFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV1cbiAgICB2YXIgdG91Y2hSZWNvcmQgPSB7fVxuXG4gICAgZm9yICh2YXIgcCBpbiB0b3VjaCkge1xuICAgICAgdG91Y2hSZWNvcmRbcF0gPSB0b3VjaFtwXVxuICAgIH1cblxuICAgIHZhciBnZXN0dXJlID0ge1xuICAgICAgc3RhcnRUb3VjaDogdG91Y2hSZWNvcmQsXG4gICAgICBzdGFydFRpbWU6IERhdGUubm93KCksXG4gICAgICBzdGF0dXM6ICd0YXBwaW5nJyxcbiAgICAgIGVsZW1lbnQ6IGV2ZW50LnNyY0VsZW1lbnQgfHwgZXZlbnQudGFyZ2V0LFxuICAgICAgcHJlc3NpbmdIYW5kbGVyOiBzZXRUaW1lb3V0KGZ1bmN0aW9uIChlbGVtZW50LCB0b3VjaCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3RhcHBpbmcnKSB7XG4gICAgICAgICAgICBnZXN0dXJlLnN0YXR1cyA9ICdwcmVzc2luZydcblxuICAgICAgICAgICAgZmlyZUV2ZW50KGVsZW1lbnQsICdsb25ncHJlc3MnLCB7XG4gICAgICAgICAgICAgIC8vIGFkZCB0b3VjaCBkYXRhIGZvciB3ZWV4XG4gICAgICAgICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjbGVhclRpbWVvdXQoZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIpXG4gICAgICAgICAgZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH0oZXZlbnQuc3JjRWxlbWVudCB8fCBldmVudC50YXJnZXQsIGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldKSwgNTAwKVxuICAgIH1cbiAgICBnZXN0dXJlc1t0b3VjaC5pZGVudGlmaWVyXSA9IGdlc3R1cmVcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09IDIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXVxuXG4gICAgZm9yICh2YXIgcCBpbiBnZXN0dXJlcykge1xuICAgICAgZWxlbWVudHMucHVzaChnZXN0dXJlc1twXS5lbGVtZW50KVxuICAgIH1cblxuICAgIGZpcmVFdmVudChnZXRDb21tb25BbmNlc3RvcihlbGVtZW50c1swXSwgZWxlbWVudHNbMV0pLCAnZHVhbHRvdWNoc3RhcnQnLCB7XG4gICAgICB0b3VjaGVzOiBzbGljZS5jYWxsKGV2ZW50LnRvdWNoZXMpLFxuICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogdGFrZSBvdmVyIHRvdWNobW92ZSBldmVudHMsIGFuZCBoYW5kbGUgcGFuIGFuZCBkdWFsIHJlbGF0ZWQgZ2VzdHVyZXMuXG4gKlxuICogMS4gdHJhdmVyc2UgZXZlcnkgdG91Y2ggcG9pbnTvvJpcbiAqID4gaWYgJ3RhcHBpbmcnIGFuZCB0aGUgc2hpZnQgaXMgb3ZlciAxMCBwaXhsZXMsIHRoZW4gaXQncyBhICdwYW5uaW5nJy5cbiAqIDIuIGlmIHRoZXJlIGFyZSB0d28gdG91Y2ggcG9pbnRzLCB0aGVuIGNhbGMgdGhlIHRyYW5mb3JtIGFuZCB0cmlnZ2VyXG4gKiAgICdkdWFsdG91Y2gnLlxuICpcbiAqIEBldmVudFxuICogQHBhcmFtICB7ZXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHRvdWNobW92ZUhhbmRsZXIoZXZlbnQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldXG4gICAgdmFyIGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaC5pZGVudGlmaWVyXVxuXG4gICAgaWYgKCFnZXN0dXJlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWdlc3R1cmUubGFzdFRvdWNoKSB7XG4gICAgICBnZXN0dXJlLmxhc3RUb3VjaCA9IGdlc3R1cmUuc3RhcnRUb3VjaFxuICAgIH1cbiAgICBpZiAoIWdlc3R1cmUubGFzdFRpbWUpIHtcbiAgICAgIGdlc3R1cmUubGFzdFRpbWUgPSBnZXN0dXJlLnN0YXJ0VGltZVxuICAgIH1cbiAgICBpZiAoIWdlc3R1cmUudmVsb2NpdHlYKSB7XG4gICAgICBnZXN0dXJlLnZlbG9jaXR5WCA9IDBcbiAgICB9XG4gICAgaWYgKCFnZXN0dXJlLnZlbG9jaXR5WSkge1xuICAgICAgZ2VzdHVyZS52ZWxvY2l0eVkgPSAwXG4gICAgfVxuICAgIGlmICghZ2VzdHVyZS5kdXJhdGlvbikge1xuICAgICAgZ2VzdHVyZS5kdXJhdGlvbiA9IDBcbiAgICB9XG5cbiAgICB2YXIgdGltZSA9ICBEYXRlLm5vdygpIC0gZ2VzdHVyZS5sYXN0VGltZVxuICAgIHZhciB2eCA9ICh0b3VjaC5jbGllbnRYIC0gZ2VzdHVyZS5sYXN0VG91Y2guY2xpZW50WCkgLyB0aW1lXG4gICAgdmFyIHZ5ID0gKHRvdWNoLmNsaWVudFkgLSBnZXN0dXJlLmxhc3RUb3VjaC5jbGllbnRZKSAvIHRpbWVcblxuICAgIHZhciBSRUNPUkRfRFVSQVRJT04gPSA3MFxuICAgIGlmICh0aW1lID4gUkVDT1JEX0RVUkFUSU9OKSB7XG4gICAgICB0aW1lID0gUkVDT1JEX0RVUkFUSU9OXG4gICAgfVxuICAgIGlmIChnZXN0dXJlLmR1cmF0aW9uICsgdGltZSA+IFJFQ09SRF9EVVJBVElPTikge1xuICAgICAgZ2VzdHVyZS5kdXJhdGlvbiA9IFJFQ09SRF9EVVJBVElPTiAtIHRpbWVcbiAgICB9XG5cbiAgICBnZXN0dXJlLnZlbG9jaXR5WCA9IChnZXN0dXJlLnZlbG9jaXR5WCAqIGdlc3R1cmUuZHVyYXRpb24gKyB2eCAqIHRpbWUpXG4gICAgICAvIChnZXN0dXJlLmR1cmF0aW9uICsgdGltZSlcbiAgICBnZXN0dXJlLnZlbG9jaXR5WSA9IChnZXN0dXJlLnZlbG9jaXR5WSAqIGdlc3R1cmUuZHVyYXRpb24gKyB2eSAqIHRpbWUpXG4gICAgICAvIChnZXN0dXJlLmR1cmF0aW9uICsgdGltZSlcbiAgICBnZXN0dXJlLmR1cmF0aW9uICs9IHRpbWVcblxuICAgIGdlc3R1cmUubGFzdFRvdWNoID0ge31cblxuICAgIGZvciAodmFyIHAgaW4gdG91Y2gpIHtcbiAgICAgIGdlc3R1cmUubGFzdFRvdWNoW3BdID0gdG91Y2hbcF1cbiAgICB9XG4gICAgZ2VzdHVyZS5sYXN0VGltZSA9IERhdGUubm93KClcblxuICAgIHZhciBkaXNwbGFjZW1lbnRYID0gdG91Y2guY2xpZW50WCAtIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRYXG4gICAgdmFyIGRpc3BsYWNlbWVudFkgPSB0b3VjaC5jbGllbnRZIC0gZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFlcbiAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coZGlzcGxhY2VtZW50WCwgMilcbiAgICAgICsgTWF0aC5wb3coZGlzcGxhY2VtZW50WSwgMikpXG4gICAgdmFyIGlzVmVydGljYWwgPSAhKE1hdGguYWJzKGRpc3BsYWNlbWVudFgpID4gTWF0aC5hYnMoZGlzcGxhY2VtZW50WSkpXG4gICAgdmFyIGRpcmVjdGlvbiA9IGlzVmVydGljYWxcbiAgICAgID8gZGlzcGxhY2VtZW50WSA+PSAwID8gJ2Rvd24nIDogJ3VwJ1xuICAgICAgOiBkaXNwbGFjZW1lbnRYID49IDAgPyAncmlnaHQnIDogJ2xlZnQnXG5cbiAgICAvLyBtYWdpYyBudW1iZXIgMTA6IG1vdmluZyAxMHB4IG1lYW5zIHBhbiwgbm90IHRhcFxuICAgIGlmICgoZ2VzdHVyZS5zdGF0dXMgPT09ICd0YXBwaW5nJyB8fCBnZXN0dXJlLnN0YXR1cyA9PT0gJ3ByZXNzaW5nJylcbiAgICAgICAgJiYgZGlzdGFuY2UgPiAxMCkge1xuICAgICAgZ2VzdHVyZS5zdGF0dXMgPSAncGFubmluZydcbiAgICAgIGdlc3R1cmUuaXNWZXJ0aWNhbCA9IGlzVmVydGljYWxcbiAgICAgIGdlc3R1cmUuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG5cbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5zdGFydCcsIHtcbiAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICB0b3VjaGVzOiBldmVudC50b3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlczogZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50LFxuICAgICAgICBpc1ZlcnRpY2FsOiBnZXN0dXJlLmlzVmVydGljYWwsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3Bhbm5pbmcnKSB7XG4gICAgICBnZXN0dXJlLnBhblRpbWUgPSBEYXRlLm5vdygpXG5cbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5tb3ZlJywge1xuICAgICAgICBkaXNwbGFjZW1lbnRYOiBkaXNwbGFjZW1lbnRYLFxuICAgICAgICBkaXNwbGFjZW1lbnRZOiBkaXNwbGFjZW1lbnRZLFxuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoZXM6IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzOiBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnQsXG4gICAgICAgIGlzVmVydGljYWw6IGdlc3R1cmUuaXNWZXJ0aWNhbCxcbiAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT0gMikge1xuICAgIHZhciBwb3NpdGlvbiA9IFtdXG4gICAgdmFyIGN1cnJlbnQgPSBbXVxuICAgIHZhciBlbGVtZW50cyA9IFtdXG4gICAgdmFyIHRyYW5zZm9ybVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC50b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG91Y2ggPSBldmVudC50b3VjaGVzW2ldXG4gICAgICB2YXIgZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoLmlkZW50aWZpZXJdXG4gICAgICBwb3NpdGlvbi5wdXNoKFtnZXN0dXJlLnN0YXJ0VG91Y2guY2xpZW50WCwgZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFldKVxuICAgICAgY3VycmVudC5wdXNoKFt0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZXSlcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIGdlc3R1cmVzKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGdlc3R1cmVzW3BdLmVsZW1lbnQpXG4gICAgfVxuXG4gICAgdHJhbnNmb3JtID0gY2FsYyhcbiAgICAgIHBvc2l0aW9uWzBdWzBdLFxuICAgICAgcG9zaXRpb25bMF1bMV0sXG4gICAgICBwb3NpdGlvblsxXVswXSxcbiAgICAgIHBvc2l0aW9uWzFdWzFdLFxuICAgICAgY3VycmVudFswXVswXSxcbiAgICAgIGN1cnJlbnRbMF1bMV0sXG4gICAgICBjdXJyZW50WzFdWzBdLFxuICAgICAgY3VycmVudFsxXVsxXVxuICAgIClcbiAgICBmaXJlRXZlbnQoZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHNbMF0sIGVsZW1lbnRzWzFdKSwgJ2R1YWx0b3VjaCcsIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGhhbmRsZSB0b3VjaGVuZCBldmVudFxuICpcbiAqIDEuIGlmIHRoZXJlIGFyZSB0b3cgdG91Y2ggcG9pbnRzLCB0aGVuIHRyaWdnZXIgJ2R1YWx0b3VjaGVuZCflpoJcbiAqXG4gKiAyLiB0cmF2ZXJzZSBldmVyeSB0b3VjaCBwaW9udO+8mlxuICogPiBpZiB0YXBwaW5nLCB0aGVuIHRyaWdnZXIgJ3RhcCcuXG4gKiBJZiB0aGVyZSBpcyBhIHRhcCAzMDAgbWlsbGlzZWNvbmRzIGJlZm9yZSwgdGhlbiBpdCdzIGEgJ2RvdWJsZXRhcCcuXG4gKiA+IGlmIHBhZGRpbmcsIHRoZW4gZGVjaWRlIHRvIHRyaWdnZXIgJ3BhbmVuZCcgb3IgJ3N3aXBlJ1xuICogPiBpZiBwcmVzc2luZywgdGhlbiB0cmlnZ2VyICdwcmVzc2VuZCcuXG4gKlxuICogMy4gcmVtb3ZlIGxpc3RlbmVycy5cbiAqXG4gKiBAZXZlbnRcbiAqIEBwYXJhbSAge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiB0b3VjaGVuZEhhbmRsZXIoZXZlbnQpIHtcblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PSAyKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW11cbiAgICBmb3IgKHZhciBwIGluIGdlc3R1cmVzKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGdlc3R1cmVzW3BdLmVsZW1lbnQpXG4gICAgfVxuICAgIGZpcmVFdmVudChnZXRDb21tb25BbmNlc3RvcihlbGVtZW50c1swXSwgZWxlbWVudHNbMV0pLCAnZHVhbHRvdWNoZW5kJywge1xuICAgICAgdG91Y2hlczogc2xpY2UuY2FsbChldmVudC50b3VjaGVzKSxcbiAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXVxuICAgIHZhciBpZCA9IHRvdWNoLmlkZW50aWZpZXJcbiAgICB2YXIgZ2VzdHVyZSA9IGdlc3R1cmVzW2lkXVxuXG4gICAgaWYgKCFnZXN0dXJlKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcikge1xuICAgICAgY2xlYXJUaW1lb3V0KGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyKVxuICAgICAgZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAndGFwcGluZycpIHtcbiAgICAgIGdlc3R1cmUudGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3RhcCcsIHtcbiAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgfSlcblxuICAgICAgaWYgKGxhc3RUYXAgJiYgZ2VzdHVyZS50aW1lc3RhbXAgLSBsYXN0VGFwLnRpbWVzdGFtcCA8IDMwMCkge1xuICAgICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAnZG91YmxldGFwJywge1xuICAgICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBsYXN0VGFwID0gZ2VzdHVyZVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3Bhbm5pbmcnKSB7XG4gICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgdmFyIGR1cmF0aW9uID0gbm93IC0gZ2VzdHVyZS5zdGFydFRpbWVcbiAgICAgIHZhciBkaXNwbGFjZW1lbnRYID0gdG91Y2guY2xpZW50WCAtIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRYXG4gICAgICB2YXIgZGlzcGxhY2VtZW50WSA9IHRvdWNoLmNsaWVudFkgLSBnZXN0dXJlLnN0YXJ0VG91Y2guY2xpZW50WVxuXG4gICAgICB2YXIgdmVsb2NpdHkgPSBNYXRoLnNxcnQoZ2VzdHVyZS52ZWxvY2l0eVkgKiBnZXN0dXJlLnZlbG9jaXR5WVxuICAgICAgICArIGdlc3R1cmUudmVsb2NpdHlYICogZ2VzdHVyZS52ZWxvY2l0eVgpXG4gICAgICB2YXIgaXNTd2lwZSA9IHZlbG9jaXR5ID4gMC41ICYmIChub3cgLSBnZXN0dXJlLmxhc3RUaW1lKSA8IDEwMFxuICAgICAgdmFyIGV4dHJhID0ge1xuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgIGlzU3dpcGU6IGlzU3dpcGUsXG4gICAgICAgIHZlbG9jaXR5WDogZ2VzdHVyZS52ZWxvY2l0eVgsXG4gICAgICAgIHZlbG9jaXR5WTogZ2VzdHVyZS52ZWxvY2l0eVksXG4gICAgICAgIGRpc3BsYWNlbWVudFg6IGRpc3BsYWNlbWVudFgsXG4gICAgICAgIGRpc3BsYWNlbWVudFk6IGRpc3BsYWNlbWVudFksXG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudCxcbiAgICAgICAgaXNWZXJ0aWNhbDogZ2VzdHVyZS5pc1ZlcnRpY2FsLFxuICAgICAgICBkaXJlY3Rpb246IGdlc3R1cmUuZGlyZWN0aW9uXG4gICAgICB9XG5cbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5lbmQnLCBleHRyYSlcbiAgICAgIGlmIChpc1N3aXBlKSB7XG4gICAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdzd2lwZScsIGV4dHJhKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3ByZXNzaW5nJykge1xuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3ByZXNzZW5kJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICB9KVxuICAgIH1cblxuICAgIGRlbGV0ZSBnZXN0dXJlc1tpZF1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09PSAwKSB7XG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlSGFuZGxlciwgZmFsc2UpXG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZEhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyLCBmYWxzZSlcbiAgfVxufVxuXG4vKipcbiAqIGhhbmRsZSB0b3VjaGNhbmNlbFxuICpcbiAqIDEuIGlmIHRoZXJlIGFyZSB0d28gdG91Y2ggcG9pbnRzLCB0aGVuIHRyaWdnZXIgJ2R1YWx0b3VjaGVuZCdcbiAqXG4gKiAyLiB0cmF2ZXJzZSBldmVydHkgdG91Y2ggcG9pbnQ6XG4gKiA+IGlmIHBhbm5uaWcsIHRoZW4gdHJpZ2dlciAncGFuZW5kJ1xuICogPiBpZiBwcmVzc2luZywgdGhlbiB0cmlnZ2VyICdwcmVzc2VuZCdcbiAqXG4gKiAzLiByZW1vdmUgbGlzdGVuZXJzXG4gKlxuICogQGV2ZW50XG4gKiBAcGFyYW0gIHtldmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gdG91Y2hjYW5jZWxIYW5kbGVyKGV2ZW50KSB7XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT0gMikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdXG4gICAgZm9yICh2YXIgcCBpbiBnZXN0dXJlcykge1xuICAgICAgZWxlbWVudHMucHVzaChnZXN0dXJlc1twXS5lbGVtZW50KVxuICAgIH1cbiAgICBmaXJlRXZlbnQoZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHNbMF0sIGVsZW1lbnRzWzFdKSwgJ2R1YWx0b3VjaGVuZCcsIHtcbiAgICAgIHRvdWNoZXM6IHNsaWNlLmNhbGwoZXZlbnQudG91Y2hlcyksXG4gICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV1cbiAgICB2YXIgaWQgPSB0b3VjaC5pZGVudGlmaWVyXG4gICAgdmFyIGdlc3R1cmUgPSBnZXN0dXJlc1tpZF1cblxuICAgIGlmICghZ2VzdHVyZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcilcbiAgICAgIGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3Bhbm5pbmcnKSB7XG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncGFuZW5kJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoZXM6IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzOiBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3ByZXNzaW5nJykge1xuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3ByZXNzZW5kJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICB9KVxuICAgIH1cbiAgICBkZWxldGUgZ2VzdHVyZXNbaWRdXG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRvY0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRvdWNobW92ZUhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyLCBmYWxzZSlcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRvdWNoY2FuY2VsSGFuZGxlciwgZmFsc2UpXG4gIH1cbn1cblxuaWYgKCFpc0luaXRpYWxpemVkKSB7XG4gIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0b3VjaHN0YXJ0SGFuZGxlciwgZmFsc2UpXG4gIGlzSW5pdGlhbGl6ZWQgPSB0cnVlXG59XG5cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKiBnbG9iYWwgbGliLCBXZWJTb2NrZXQgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi9zdHlsZS9iYXNlLmNzcydcblxuaW1wb3J0IHsgc3VidmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3BhY2thZ2UuanNvbidcbmltcG9ydCBydW50aW1lIGZyb20gJy4uLy4uLy4uL3J1bnRpbWUnXG5pbXBvcnQgZnJhbWV3b3JrcyBmcm9tICcuLi8uLi8uLi9mcmFtZXdvcmtzJ1xuXG5ydW50aW1lLmNvbmZpZy5mcmFtZXdvcmtzID0gZnJhbWV3b3Jrc1xuY29uc3QgeyBmcmFtZXdvcmssIHRyYW5zZm9ybWVyIH0gPSBzdWJ2ZXJzaW9uXG5cbi8vIHJlZ2lzdGVyIGZyYW1ld29yayBtZXRhIGluZm9cbmdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uID0gZnJhbWV3b3JrXG5nbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uID0gdHJhbnNmb3JtZXJcblxuLy8gaW5pdCBicmlkZ2UuXG5pbXBvcnQgeyBTZW5kZXIsIHJlY2VpdmVyIH0gZnJvbSAnLi4vYnJpZGdlJ1xucmVjZWl2ZXIuaW5pdCgpXG5cbi8vIGluaXQgZnJhbWV3b3Jrc1xuaW1wb3J0IExpc3RlbmVyIGZyb20gJy4uL2RvbS9jb21wb25lbnRNYW5hZ2VyJ1xucnVudGltZS5jb25maWcuRG9jdW1lbnQuTGlzdGVuZXIgPSBMaXN0ZW5lclxuY29uc3QgZ2xvYmFsTWV0aG9kcyA9IHJ1bnRpbWUuaW5pdChydW50aW1lLmNvbmZpZylcblxuLy8gc2V0IGdsb2JhbCBtZXRob2RzXG5mb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gZ2xvYmFsTWV0aG9kcykge1xuICBnbG9iYWxbbWV0aG9kTmFtZV0gPSAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IHJldCA9IGdsb2JhbE1ldGhvZHNbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICBpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocmV0LnRvU3RyaW5nKCkpXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxufVxuXG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgbG9hZCB9IGZyb20gJy4vbG9hZGVyJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2Jhc2UvY29tcG9uZW50J1xuaW1wb3J0IEF0b21pYyBmcm9tICcuLi9iYXNlL2F0b21pYydcbmltcG9ydCBDb21wb25lbnRNYW5hZ2VyIGZyb20gJy4uL2RvbS9jb21wb25lbnRNYW5hZ2VyJ1xuaW1wb3J0IHsgYmluZCBhcyBiaW5kUmVnaXN0ZXIgfSBmcm9tICcuL3JlZ2lzdGVyJ1xuXG5pbXBvcnQgJ2VudmQnXG5pbXBvcnQgJ2h0dHB1cmwnXG5cbi8vIGdlc3R1cmVcbmltcG9ydCAnLi9nZXN0dXJlJ1xuXG5jb25zdCBERUZBVUxUX0RFU0lHTl9XSURUSCA9IDc1MFxuY29uc3QgREVGQVVMVF9ST09UX0lEID0gJ3dlZXgnXG5jb25zdCBERUZBVUxUX0pTT05QX0NBTExCQUNLX05BTUUgPSAnd2VleEpzb25wQ2FsbGJhY2snXG5cbmdsb2JhbC5XWEVudmlyb25tZW50ID0ge1xuICB3ZWV4VmVyc2lvbjogY29uZmlnLndlZXhWZXJzaW9uLFxuICBhcHBOYW1lOiBsaWIuZW52LmFsaWFwcCA/IGxpYi5lbnYuYWxpYXBwLmFwcG5hbWUgOiBudWxsLFxuICBhcHBWZXJzaW9uOiBsaWIuZW52LmFsaWFwcCA/IGxpYi5lbnYuYWxpYXBwLnZlcnNpb24udmFsIDogbnVsbCxcbiAgcGxhdGZvcm06ICdXZWInLFxuICBvc05hbWU6IGxpYi5lbnYuYnJvd3NlciA/IGxpYi5lbnYuYnJvd3Nlci5uYW1lIDogbnVsbCxcbiAgb3NWZXJzaW9uOiBsaWIuZW52LmJyb3dzZXIgPyBsaWIuZW52LmJyb3dzZXIudmVyc2lvbi52YWwgOiBudWxsLFxuICBkZXZpY2VXaWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gIGRldmljZUhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA/IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDogKHdpbmRvdy5zY3JlZW4ud2lkdGggPj0gMTQ0MCA/IDMuNSA6ICh3aW5kb3cuc2NyZWVuLndpZHRoID49IDEwODAgPyAzIDogKHdpbmRvdy5zY3JlZW4ud2lkdGggPj0gODAwID8gMi41IDogKHdpbmRvdy5zY3JlZW4ud2lkdGggPj0gNjQwID8gMiA6ICh3aW5kb3cuc2NyZWVuLndpZHRoID49IDQ4MCA/IDEuNSA6IDEpKSkpKVxufVxuXG5jb25zdCBfd2VleEluc3RhbmNlID0ge31cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBzZXR1cFZpZXdwb3J0ICh3aWR0aCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJykuc2V0QXR0cmlidXRlKCdjb250ZW50JywgYHdpZHRoPSR7d2lkdGh9LCB1c2VyLXNjYWxhYmxlPW5vYClcbn1cblxuOyAoZnVuY3Rpb24gaW5pdGlhbGl6ZVdpdGhVcmxQYXJhbXMgKCkge1xuICAvLyBpbiBjYXNwZXJqcyB0aGUgcHJvdG9jb2wgaXMgZmlsZS5cbiAgaWYgKGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9maWxlLykpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHBhcmFtcyA9IGxpYi5odHRwdXJsKGxvY2F0aW9uLmhyZWYpLnBhcmFtc1xuXG4gIC8vIHNldCBnbG9iYWwgJ2RlYnVnJyBjb25maWcgdG8gdHJ1ZSBpZiB0aGVyZSdzIGEgZGVidWcgZmxhZyBpbiBjdXJyZW50IHVybC5cbiAgY29uc3QgZGVidWcgPSBwYXJhbXNbJ2RlYnVnJ11cbiAgY29uZmlnLmRlYnVnID0gZGVidWcgPT09IHRydWUgfHwgZGVidWcgPT09ICd0cnVlJ1xuXG4gICFjb25maWcuZGVidWcgJiYgKGNvbnNvbGUuZGVidWcgPSBub29wKVxuXG4gIC8vIGNvbmZpZyBmb3IgdGhlICdkb3duZ3JhZGUnLlxuICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0ga2V5Lm1hdGNoKC9eZG93bmdyYWRlXyhcXHcrKSQvKVxuICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2hbMV0pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRrID0gbWF0Y2hbMV1cbiAgICAgIC8vIGRvd25ncmFkZSBpbiB0aGUgY29uZmlnIGZpbGUgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LlxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuZG93bmdyYWRlW2RrXSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkciA9IHBhcmFtc1tgZG93bmdyYWRlXyR7ZGt9YF1cbiAgICAgIGNvbmZpZy5kb3duZ3JhZGVbZGtdID0gZHIgPT09IHRydWUgfHwgZHIgPT09ICd0cnVlJ1xuICAgIH1cbiAgfVxufSkoKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBXZWV4IChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXZWV4KSkge1xuICAgIHJldHVybiBuZXcgV2VleChvcHRpb25zKVxuICB9XG5cbiAgLy8gV2lkdGggb2YgdGhlIHJvb3QgY29udGFpbmVyLiBEZWZhdWx0IGlzIHdpbmRvdy5pbm5lcldpZHRoLlxuICB0aGlzLndpZHRoID0gb3B0aW9ucy53aWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aFxuICB0aGlzLmJ1bmRsZVVybCA9IG9wdGlvbnMuYnVuZGxlVXJsIHx8IGxvY2F0aW9uLmhyZWZcbiAgdGhpcy5pbnN0YW5jZUlkID0gb3B0aW9ucy5hcHBJZFxuICB0aGlzLnJvb3RJZCA9IG9wdGlvbnMucm9vdElkIHx8IChERUZBVUxUX1JPT1RfSUQgKyB1dGlscy5nZXRSYW5kb20oMTApKVxuICB0aGlzLmpzb25wQ2FsbGJhY2sgPSBvcHRpb25zLmpzb25wQ2FsbGJhY2sgfHwgREVGQVVMVF9KU09OUF9DQUxMQkFDS19OQU1FXG4gIHRoaXMuc291cmNlID0gb3B0aW9ucy5zb3VyY2VcbiAgdGhpcy5sb2FkZXIgPSBvcHRpb25zLmxvYWRlclxuICB0aGlzLmVtYmVkID0gb3B0aW9ucy5lbWJlZFxuXG4gIC8vIGluaXQgdmlld3BvcnRcbiAgc2V0dXBWaWV3cG9ydChERUZBVUxUX0RFU0lHTl9XSURUSClcblxuICAvLyBkb3duZ3JhZGUgb3B0aW9ucy5cbiAgY29uc3QgZGcgPSBvcHRpb25zLmRvd25ncmFkZSB8fCBbXVxuICBkZy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wKSB7XG4gICAgY29uZmlnLmRvd25ncmFkZVtjb21wXSA9IHRydWVcbiAgfSlcblxuICB0aGlzLmRhdGEgPSBvcHRpb25zLmRhdGFcbiAgdGhpcy5zZW5kZXIgPSBuZXcgU2VuZGVyKHRoaXMpXG5cbiAgX3dlZXhJbnN0YW5jZVt0aGlzLmluc3RhbmNlSWRdID0gdGhpc1xuXG4gIC8vIGxvYWQgYnVuZGxlLlxuICBsb2FkKHtcbiAgICBqc29ucENhbGxiYWNrOiB0aGlzLmpzb25wQ2FsbGJhY2ssXG4gICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICBsb2FkZXI6IHRoaXMubG9hZGVyXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGFwcENvZGUpIHtcbiAgICBpZiAoIWVycikge1xuICAgICAgdGhpcy5jcmVhdGVBcHAoY29uZmlnLCBhcHBDb2RlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvYWQgYnVuZGxlIGVycjonLCBlcnIpXG4gICAgfVxuICB9LmJpbmQodGhpcykpXG59XG5cbldlZXguaW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmICh1dGlscy5pc0FycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIG5ldyBXZWV4KGNvbmZpZylcbiAgICB9KVxuICB9XG4gIGVsc2UgaWYgKHV0aWxzLmdldFR5cGUob3B0aW9ucykgPT09ICdvYmplY3QnKSB7XG4gICAgbmV3IFdlZXgob3B0aW9ucylcbiAgfVxufVxuXG5XZWV4LmdldEluc3RhbmNlID0gZnVuY3Rpb24gKGluc3RhbmNlSWQpIHtcbiAgcmV0dXJuIF93ZWV4SW5zdGFuY2VbaW5zdGFuY2VJZF1cbn1cblxuV2VleC5wcm90b3R5cGUgPSB7XG5cbiAgY3JlYXRlQXBwOiBmdW5jdGlvbiAoY29uZmlnLCBhcHBDb2RlKSB7XG4gICAgbGV0IHJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMucm9vdElkKVxuICAgIGlmICghcm9vdCkge1xuICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICByb290LmlkID0gdGhpcy5yb290SWRcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocm9vdClcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHdpbmRvdy5jcmVhdGVJbnN0YW5jZShcbiAgICAgIHRoaXMuaW5zdGFuY2VJZCxcbiAgICAgIGFwcENvZGUsXG4gICAgICB7XG4gICAgICAgIGJ1bmRsZVVybDogdGhpcy5idW5kbGVVcmwsXG4gICAgICAgIGRlYnVnOiBjb25maWcuZGVidWdcbiAgICAgIH0sXG4gICAgICB0aGlzLmRhdGFcbiAgICApXG5cbiAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdJywgaW5zdGFuY2UpXG4gICAgfVxuXG4gICAgLy8gRG8gbm90IGRlc3Ryb3kgaW5zdGFuY2UgYmVmb3JlIHVubG9hZCwgYmVjYXVzZSBpbiBtb3N0IGJyb3dzZXJcbiAgICAvLyBwcmVzcyBiYWNrIGJ1dHRvbiB0byBiYWNrIHRvIHRoaXMgcGFnZSB3aWxsIG5vdCByZWZyZXNoXG4gICAgLy8gdGhlIHdpbmRvdyBhbmQgdGhlIGluc3RhbmNlIHdpbGwgbm90IGJlIHJlY3JlYXRlZCB0aGVuLlxuICAgIC8vIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbiAoZSkge1xuICAgIC8vIH0pXG4gIH0sXG5cbiAgZ2V0Q29tcG9uZW50TWFuYWdlcjogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fY29tcG9uZW50TWFuYWdlcikge1xuICAgICAgdGhpcy5fY29tcG9uZW50TWFuYWdlciA9IENvbXBvbmVudE1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50TWFuYWdlclxuICB9LFxuXG4gIGdldFJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLnJvb3RJZClcbiAgfVxufVxuXG5XZWV4LnN0b3BUaGVXb3JsZCA9IGZ1bmN0aW9uIChpbnN0YW5jZUlkKSB7XG4gIGlmICghaW5zdGFuY2VJZCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhfd2VleEluc3RhbmNlKS5tYXAoZnVuY3Rpb24gKGluc3RhbmNlSWQpIHtcbiAgICAgIFdlZXguc3RvcFRoZVdvcmxkKGluc3RhbmNlSWQpXG4gICAgfSlcbiAgfVxuICB3aW5kb3cuZGVzdHJveUluc3RhbmNlKGluc3RhbmNlSWQpXG59XG5cbi8vIGZvciB3ZWV4LXRvb2xraXQuXG47IChmdW5jdGlvbiBzdGFydFJlZnJlc2hDb250cm9sbGVyICgpIHtcbiAgaWYgKGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9maWxlLykpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobG9jYXRpb24uc2VhcmNoLmluZGV4T2YoJ2hvdC1yZWxvYWRfY29udHJvbGxlcicpID09PSAtMSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICh0eXBlb2YgV2ViU29ja2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnNvbGUuaW5mbygnYXV0byByZWZyZXNoIG5lZWQgV2ViU29ja2V0IHN1cHBvcnQnKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZVxuICBjb25zdCBwb3J0ID0gODA4MlxuICBjb25zdCBjbGllbnQgPSBuZXcgV2ViU29ja2V0KCd3czovLycgKyBob3N0ICsgJzonICsgcG9ydCArICcvJyxcbiAgICAnZWNoby1wcm90b2NvbCdcbiAgKVxuICBjbGllbnQub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygncmVmcmVzaCBjb250cm9sbGVyIHdlYnNvY2tldCBjb25uZWN0aW9uIGVycm9yJylcbiAgfVxuICBjbGllbnQub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBjb25zb2xlLmxvZygnUmVjZWl2ZWQ6IFxcJycgKyBlLmRhdGEgKyAnXFwnJylcbiAgICBpZiAoZS5kYXRhID09PSAncmVmcmVzaCcpIHtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgfVxuICB9XG59KSgpXG5cbmJpbmRSZWdpc3RlcihXZWV4KVxuXG51dGlscy5leHRlbmQoV2VleCwge1xuICBDb21wb25lbnQsXG4gIEF0b21pYyxcbiAgQ29tcG9uZW50TWFuYWdlcixcbiAgdXRpbHMsXG4gIGNvbmZpZ1xufSlcblxuZ2xvYmFsLndlZXggPSBXZWV4XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICcuLi9kb20vY29tcG9uZW50TWFuYWdlcidcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vcmVuZGVyL2NvbmZpZydcblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuXG4gIGZ1bmN0aW9uIFJvb3RDb21wb25lbnQgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgY29uc3QgaWQgPSBkYXRhLnJvb3RJZCArICctcm9vdCdcbiAgICBjb25zdCBjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2RhdGEucm9vdElkfWApXG4gICAgY29uc3QgY20gPSBDb21wb25lbnRNYW5hZ2VyLmdldEluc3RhbmNlKGRhdGEuaW5zdGFuY2VJZClcblxuICAgIHRoaXMuZGF0YSA9IGRhdGFcblxuICAgIGN0LmNsYXNzTGlzdC5hZGQoJ3dlZXgtY29udGFpbmVyJylcbiAgICBpZiAoIWRhdGEuc3R5bGUuaGVpZ2h0ICYmICFkYXRhLnN0eWxlLmZsZXgpIHtcbiAgICAgIC8vIGlmIG5vIHNwZWNpZmljYXRpb24gb24gcm9vdCdzIGhlaWdodCwgdGhlblxuICAgICAgLy8gZmlsbCByb290IGNvbnRhaW5lciB3aXRoIHRoZSByb290IGVsZW1lbnQgYnkgZnVsbCBzY2FsZS5cbiAgICAgIGRhdGEuc3R5bGUuZmxleCA9IDFcbiAgICB9XG5cbiAgICAvLyBUaGUgcm9vdCBjb21wb25lbnQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgZGl2IGNvbXBvbmVudCwgYXMgdGhlIHNjcm9sbGFibGVcbiAgICAvLyBjb21wb25lbnRzIGhhdmUgcGVyZm9ybWFuY2UgaXNzdWUgY29tcGFyZSB0byB0aGUgb3JpZ2luYWwgYm9keSBzY3JvbGwuXG4gICAgaWYgKCFub2RlVHlwZSkge1xuICAgICAgY29uc29sZS53YXJuKGBbaDUtcmVuZGVyXSBubyBub2RlVHlwZSBpcyBzcGVjaWZpZWQsIGNvbnN0cnVjdCBSb290IHVzZSAnZHJvb3QnIGJ5IGRlZmF1bHQuYClcbiAgICAgIG5vZGVUeXBlID0gJ2Ryb290J1xuICAgIH1cbiAgICBlbHNlIGlmIChjb25maWcudmFsaWRSb290cy5pbmRleE9mKG5vZGVUeXBlKSA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gdGhlIHJvb3QgY29tcG9uZW50IHR5cGUgJyR7bm9kZVR5cGV9JyBpcyBub3Qgb25lIG9mXG50aGUgdHlwZXMgaW4gWyR7Y29uZmlnLnZhbGlkUm9vdHN9XSBsaXN0LiBJdCBpcyBhdXRvIGRvd25ncmFkZWRcbnRvICdkcm9vdCcuYClcbiAgICAgIG5vZGVUeXBlID0gJ2Ryb290J1xuICAgIH1cbiAgICBlbHNlIGlmIChjb25maWcuZG93bmdyYWRlLnJvb3QpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gdGhlIHJvb3QgaXMgZG93bmdyYWRlIHRvICdkcm9vdCcgZHVlIHRvIHRoZSBkb3duZ3JhZGVcbmNvbmZpZ3VyYXRpb24gb2Ygd2VleC5gKVxuICAgICAgbm9kZVR5cGUgPSAnZHJvb3QnXG4gICAgfVxuXG4gICAgZGF0YS50eXBlID0gbm9kZVR5cGVcbiAgICBjb25zdCBjbXAgPSBjbS5jcmVhdGVFbGVtZW50KGRhdGEpXG4gICAgY21wLm5vZGUuaWQgPSBpZFxuICAgIHJldHVybiBjbXBcbiAgfVxuXG4gIFJvb3RDb21wb25lbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDb21wb25lbnQucHJvdG90eXBlKVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3Jvb3QnLCBSb290Q29tcG9uZW50KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuXG4gIGZ1bmN0aW9uIERpdiAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBDb21wb25lbnQuY2FsbCh0aGlzLCBkYXRhLCBub2RlVHlwZSlcbiAgICB0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICB9XG4gIERpdi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnZGl2JywgRGl2KVxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdjb250YWluZXInLCBEaXYpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBERUZBVUxUX0xPQURfTU9SRV9PRkZTRVQgPSAwXG5sZXQgQ29tcG9uZW50XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKG5vZGVUeXBlKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZVR5cGUgfHwgJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWRyb290JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtY29udGFpbmVyJylcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGJpbmRFdmVudHMgKGV2dHMpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzLCBldnRzKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gZmlyZSBsb2FkbW9yZSBldmVudC5cbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XG4gICAgICBjb25zdCBsZWZ0RGlzdCA9IGJvZHkuc2Nyb2xsSGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0IC0gYm9keS5zY3JvbGxUb3BcbiAgICAgIGlmIChsZWZ0RGlzdCA8PSB0aGlzLmxvYWRtb3Jlb2Zmc2V0ICYmIHRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSkge1xuICAgICAgICB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ2xvYWRtb3JlJylcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlZnREaXN0ID4gdGhpcy5sb2FkbW9yZW9mZnNldCAmJiAhdGhpcy5pc0F2YWlsYWJsZVRvRmlyZWxvYWRtb3JlKSB7XG4gICAgICAgIHRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSA9IHRydWVcbiAgICAgIH1cbiAgICB9LmJpbmQodGhpcykpXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgbG9hZG1vcmVvZmZzZXQgKHZhbCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKHZhbHVlIDwgMCB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gaW52YWxpZCBsb2FkbW9yZW9mZnNldDogJHt2YWx9YClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLmxvYWRtb3Jlb2Zmc2V0ID0gdmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gRHJvb3QgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgaWYgKGRhdGEucmVmICE9PSAnX3Jvb3QnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuKCdbaDUtcmVuZGVyXSBkcm9vdCBjYW4gb25seSBiZSB1c2VkIGFzIGEgZG93bmdyYWRlZCByb290LicpXG4gICAgfVxuICAgIHRoaXMubG9hZG1vcmVvZmZzZXQgPSBERUZBVUxUX0xPQURfTU9SRV9PRkZTRVRcbiAgICB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUgPSB0cnVlXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSwgbm9kZVR5cGUpXG4gIH1cbiAgRHJvb3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDb21wb25lbnQucHJvdG90eXBlKVxuICBleHRlbmQoRHJvb3QucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKERyb290LnByb3RvdHlwZSwgeyBhdHRyIH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnZHJvb3QnLCBEcm9vdClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL2ltYWdlLmNzcydcblxuY29uc3QgREVGQVVMVF9TSVpFID0gMjAwXG5jb25zdCBSRVNJWkVfTU9ERVMgPSBbJ3N0cmV0Y2gnLCAnY292ZXInLCAnY29udGFpbiddXG5jb25zdCBERUZBVUxUX1JFU0laRV9NT0RFID0gJ3N0cmV0Y2gnXG5cbmxldCBBdG9taWNcblxuLyoqXG4gKiByZXNpemU6ICdjb3ZlcicgfCAnY29udGFpbicgfCAnc3RyZXRjaCcsIGRlZmF1bHQgaXMgJ3N0cmV0Y2gnXG4gKiBzcmM6IHVybFxuICogcGxhY2Vob2xkZXIgLyBwbGFjZS1ob2xkZXI6IHVybFxuICovXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtaW1nJylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtZWxlbWVudCcpXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcblxuICBjbGVhckF0dHIgKCkge1xuICAgIHRoaXMuc3JjID0gJydcbiAgICB0aGlzLm5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJydcbiAgfVxufVxuXG5jb25zdCBhdHRyID0ge1xuICBzcmM6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAoIXRoaXMuc3JjKSB7XG4gICAgICB0aGlzLnNyYyA9IGxpYi5pbWcuZGVmYXVsdFNyY1xuICAgICAgdGhpcy5ub2RlLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJyArIHRoaXMuc3JjICsgJyknXG4gICAgfVxuICAgIHRoaXMuZW5hYmxlTGF6eWxvYWQodmFsKVxuICB9LFxuXG4gIHBsYWNlaG9sZGVyOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy5ub2RlLmRhdGFzZXQucGxhY2Vob2xkZXIgPSB2YWxcbiAgfSxcblxuICAvLyBhbGlhcyBmb3IgcGxhY2Vob2xkZXIgKHBsYWNlLWhvbGRlcilcbiAgcGxhY2VIb2xkZXI6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyLnBsYWNlaG9sZGVyLmNhbGwodGhpcywgdmFsKVxuICB9LFxuXG4gIHJlc2l6ZTogZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmIChSRVNJWkVfTU9ERVMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgdmFsID0gJ3N0cmV0Y2gnXG4gICAgfVxuICAgIHRoaXMubm9kZS5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IHZhbCA9PT0gJ3N0cmV0Y2gnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcxMDAlIDEwMCUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbFxuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICB3aWR0aDogZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlRmxvYXQodmFsKVxuICAgIGlmICh2YWwgPCAwIHx8IGlzTmFOKHZhbCkpIHtcbiAgICAgIHZhbCA9IERFRkFVTFRfU0laRVxuICAgIH1cbiAgICB0aGlzLm5vZGUuc3R5bGUud2lkdGggPSB2YWwgKyAncHgnXG4gIH0sXG5cbiAgaGVpZ2h0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKHZhbCA8IDAgfHwgaXNOYU4odmFsKSkge1xuICAgICAgdmFsID0gREVGQVVMVF9TSVpFXG4gICAgfVxuICAgIHRoaXMubm9kZS5zdHlsZS5oZWlnaHQgPSB2YWwgKyAncHgnXG4gIH1cbn1cblxuY29uc3QgZXZlbnQgPSB7XG4gIGxvYWQ6IHtcbiAgICBleHRyYTogZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBuYXR1cmFsV2lkdGgsIG5hdHVyYWxIZWlnaHQgfSA9IHRoaXMubm9kZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmF0dXJhbFdpZHRoLCBuYXR1cmFsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICBmdW5jdGlvbiBJbWFnZSAoZGF0YSkge1xuICAgIHRoaXMucmVzaXplID0gREVGQVVMVF9SRVNJWkVfTU9ERVxuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgSW1hZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlKVxuICBleHRlbmQoSW1hZ2UucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKEltYWdlLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChJbWFnZS5wcm90b3R5cGUsIHtcbiAgICBzdHlsZTogZXh0ZW5kKE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZS5zdHlsZSksIHN0eWxlKVxuICB9KVxuICBleHRlbmQoSW1hZ2UucHJvdG90eXBlLCB7IGV2ZW50IH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnaW1hZ2UnLCBJbWFnZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERFRkFVTFRfRk9OVF9TSVpFID0gMzJcbmNvbnN0IERFRkFVTFRfVEVYVF9PVkVSRkxPVyA9ICdlbGxpcHNpcydcblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgbm9kZS5zdHlsZS5mb250U2l6ZSA9IERFRkFVTFRfRk9OVF9TSVpFICsgJ3B4J1xuICAgIHRoaXMudGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcbiAgICAvLyBHaXZlIHRoZSBkZXZlbG9wZXJzIHRoZSBhYmlsaXR5IHRvIGNvbnRyb2wgc3BhY2VcbiAgICAvLyBhbmQgbGluZS1icmVha2Vycy5cbiAgICB0aGlzLnRleHROb2RlLnN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnXG4gICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJ1xuICAgIHRoaXMudGV4dE5vZGUuc3R5bGUuZGlzcGxheSA9ICctd2Via2l0LWJveCdcbiAgICB0aGlzLnRleHROb2RlLnN0eWxlLndlYmtpdEJveE9yaWVudCA9ICd2ZXJ0aWNhbCdcbiAgICB0aGlzLnN0eWxlLmxpbmVzLmNhbGwodGhpcywgKHRoaXMuZGF0YS5zdHlsZSB8fCB7fSkubGluZXMpXG4gICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLnRleHROb2RlKVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgY2xlYXJBdHRyICgpIHtcbiAgICB0aGlzLm5vZGUuZmlyc3RDaGlsZC50ZXh0Q29udGVudCA9ICcnXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgdmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGNvbnN0IHNwYW4gPSB0aGlzLm5vZGUuZmlyc3RDaGlsZFxuICAgIHNwYW4uaW5uZXJIVE1MID0gJydcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzcGFuLnRleHRDb250ZW50ID0gdmFsdWVcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXJzIGFyZSBzdXBwb3NlZCB0byBoYXZlIHRoZSBhYmlsaXR5IHRvIGJyZWFrIHRleHRcbiAgICAgKiBsaW5lcyBtYW51YWxseS4gVXNpbmcgYGAmbmJzcDtgYCB0byByZXBsYWNlIHRleHQgc3BhY2UgaXNcbiAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBgYC13ZWJraXQtbGluZS1jbGFtcGBgLiBUaGVyZWZvclxuICAgICAqIHdlIHVzZSBgYHdoaXRlLXNwYWNlOiBuby13cmFwYGAgaW5zdGVhZCAoaW5zdGVhZCBvZiB0aGVcbiAgICAgKiBjb2RlIGJlbGxvdykuXG5cbiAgICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgdGV4dC5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHIpXG4gICAgICAgICAgY29uc3Qgc3BhY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJylcbiAgICAgICAgICBzcGFjZS5pbm5lckhUTUwgPSAnJm5ic3A7J1xuICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoc3BhY2UpXG4gICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZy5yZW1vdmVDaGlsZChmcmFnLmZpcnN0Q2hpbGQpXG4gICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSlcbiAgICAgICAgc3Bhbi5hcHBlbmRDaGlsZChmcmFnKVxuICAgICAgfSlcbiAgICAgIHNwYW4ucmVtb3ZlQ2hpbGQoc3Bhbi5maXJzdENoaWxkKVxuICAgICAqL1xuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICBsaW5lczogZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlSW50KHZhbClcbiAgICBpZiAoaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh2YWwgPD0gMCkge1xuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS50ZXh0T3ZlcmZsb3cgPSAnJ1xuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJ1xuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS53ZWJraXRMaW5lQ2xhbXAgPSAnJ1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5kYXRhID8gdGhpcy5kYXRhLnN0eWxlIDogbnVsbFxuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gICAgICB0aGlzLnRleHROb2RlLnN0eWxlLnRleHRPdmVyZmxvdyA9IHN0eWxlXG4gICAgICAgID8gc3R5bGUudGV4dE92ZXJmbG93XG4gICAgICAgIDogREVGQVVMVF9URVhUX09WRVJGTE9XXG4gICAgICB0aGlzLnRleHROb2RlLnN0eWxlLndlYmtpdExpbmVDbGFtcCA9IHZhbFxuICAgIH1cbiAgfSxcblxuICB0ZXh0T3ZlcmZsb3c6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLnRleHROb2RlLnN0eWxlLnRleHRPdmVyZmxvdyA9IHZhbFxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyXG4gIC8vICAtIHZhbHVlOiB0ZXh0IGNvbnRlbnQuXG4gIC8vIHN0eWxlXG4gIC8vICAtIGxpbmVzOiBtYXhpbXVtIGxpbmVzIG9mIHRoZSB0ZXh0LlxuICBmdW5jdGlvbiBUZXh0IChkYXRhKSB7XG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBUZXh0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFRleHQucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKFRleHQucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKFRleHQucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd0ZXh0JywgVGV4dClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYjogdHJ1ZSAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiB0cmFuc2ZlciBRdWFkcmF0aWMgQmV6aWVyIEN1cnZlIHRvIEN1YmljIEJlemllciBDdXJ2ZVxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gYSBhYnNjaXNzYSBvZiBwMVxuICogQHBhcmFtICB7bnVtYmVyfSBiIG9yZGluYXRlIG9mIHAxXG4gKiBAcmV0dXJuIHtBcnJheX0gcGFyYW1ldGVyIG1hdHJpeCBmb3IgY3ViaWMgYmV6aWVyIGN1cnZlXG4gKiAgIGxpa2UgW1twMXgsIHAxeV0sIFtwMngsIHAyeV1dXG4gKi9cbmZ1bmN0aW9uIHF1YWRyYXRpYzJjdWJpY0JlemllciAoYSwgYikge1xuICByZXR1cm4gW1xuICAgIFtcbiAgICAgIChhIC8gMyArIChhICsgYikgLyAzIC0gYSkgLyAoYiAtIGEpLFxuICAgICAgKGEgKiBhIC8gMyArIGEgKiBiICogMiAvIDMgLSBhICogYSkgLyAoYiAqIGIgLSBhICogYSlcbiAgICBdLCBbXG4gICAgICAoYiAvIDMgKyAoYSArIGIpIC8gMyAtIGEpIC8gKGIgLSBhKSxcbiAgICAgIChiICogYiAvIDMgKyBhICogYiAqIDIgLyAzIC0gYSAqIGEpIC8gKGIgKiBiIC0gYSAqIGEpXG4gICAgXVxuICBdXG59XG5cbi8qKlxuICogZGVyaXZlIHBvc2l0aW9uIGRhdGEgZnJvbSBrbm93aW5nIG1vdGlvbiBwYXJhbWV0ZXJzXG4gKiBiYXNlIG9uIE5ld3RvbidzIHNlY29uZCBsYXc6IHMgPSB2dCArIGF0XjIvMlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgb2JqZWN0IG9mIHsgdiwgYSwgcywgdCB9XG4gKiAgIC0gdjogaW5pdGlhbCB2ZWxvY2l0eVxuICogICAtIGE6IGFjY2VsZXJhdGUgc3BlZWRcbiAqICAgLSB0OiB0aW1lXG4gKiAgIC0gczogc2hpZnRpbmdcbiAqL1xuZnVuY3Rpb24gTW90aW9uIChjb25maWcpIHtcbiAgdGhpcy52ID0gY29uZmlnLnYgfHwgMFxuICB0aGlzLmEgPSBjb25maWcuYSB8fCAwXG5cbiAgaWYgKHR5cGVvZiBjb25maWcudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLnQgPSBjb25maWcudFxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb25maWcucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLnMgPSBjb25maWcuc1xuICB9XG5cbiAgLy8gZGVyaXZlIHRpbWUgZnJvbSBzaGlmdGluZ1xuICBpZiAodHlwZW9mIHRoaXMudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMudCA9IC10aGlzLnYgLyB0aGlzLmFcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB0MSA9IChNYXRoLnNxcnQodGhpcy52ICogdGhpcy52ICsgMiAqIHRoaXMuYSAqIHRoaXMucykgLSB0aGlzLnYpXG4gICAgICAgIC8gdGhpcy5hXG4gICAgICBjb25zdCB0MiA9ICgtTWF0aC5zcXJ0KHRoaXMudiAqIHRoaXMudiArIDIgKiB0aGlzLmEgKiB0aGlzLnMpIC0gdGhpcy52KVxuICAgICAgICAvIHRoaXMuYVxuICAgICAgdGhpcy50ID0gTWF0aC5taW4odDEsIHQyKVxuICAgIH1cbiAgfVxuXG4gIC8vIGRlcml2ZSBzaGlmdGluZyBmcm9tIHRpbWVcbiAgaWYgKHR5cGVvZiB0aGlzLnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5zID0gdGhpcy5hICogdGhpcy50ICogdGhpcy50IC8gMiArIHRoaXMudiAqIHRoaXMudFxuICB9XG59XG5cbi8qKlxuICogZGVyaXZlIGN1YmljIGJlemllciBwYXJhbWV0ZXJzIGZyb20gbW90aW9uIHBhcmFtZXRlcnNcbiAqIEByZXR1cm4ge0FycmF5fSBwYXJhbWV0ZXIgbWF0cml4IGZvciBjdWJpYyBiZXppZXIgY3VydmVcbiAqICAgbGlrZSBbW3AxeCwgcDF5XSwgW3AyeCwgcDJ5XV1cbiAqL1xuTW90aW9uLnByb3RvdHlwZS5nZW5lcmF0ZUN1YmljQmV6aWVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcXVhZHJhdGljMmN1YmljQmV6aWVyKFxuICAgIHRoaXMudiAvIHRoaXMuYSwgdGhpcy50ICsgdGhpcy52IC8gdGhpcy5hXG4gIClcbn1cblxuIWxpYiAmJiAobGliID0ge30pXG5saWIubW90aW9uID0gTW90aW9uXG5cbm1vZHVsZS5leHBvcnRzID0gTW90aW9uXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0ICcuL21vdGlvbidcblxudmFyIGRvYyA9IHdpbmRvdy5kb2N1bWVudFxudmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnRcbnZhciBzY3JvbGxPYmpzID0ge31cbnZhciBwbHVnaW5zID0ge31cbnZhciBkcHIgPSB3aW5kb3cuZHByXG4gIHx8ICghIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kLylcbiAgICA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAvIHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aFxuICAgIDogMSlcbnZhciBpbmVydGlhQ29lZmZpY2llbnQgPSB7XG4gIG5vcm1hbDogWzIgKiBkcHIsIDAuMDAxNSAqIGRwcl0sXG4gIHNsb3c6IFsxLjUgKiBkcHIsIDAuMDAzICogZHByXSxcbiAgdmVyeXNsb3c6IFsxLjUgKiBkcHIsIDAuMDA1ICogZHByXVxufVxudmFyIHRpbWVGdW5jdGlvbiA9IHtcbiAgZWFzZTogWy4yNSwuMSwuMjUsMV0sXG4gIGxpbmVyOiBbMCwwLDEsMV0sXG4gICdlYXNlLWluJzogWy40MiwwLDEsMV0sXG4gICdlYXNlLW91dCc6IFswLDAsLjU4LDFdLFxuICAnZWFzZS1pbi1vdXQnOiBbLjQyLDAsLjU4LDFdXG59XG52YXIgRmlyZWZveCA9ICEhdWEubWF0Y2goL0ZpcmVmb3gvaSlcbnZhciBJRU1vYmlsZSA9ICEhdWEubWF0Y2goL0lFTW9iaWxlL2kpXG52YXIgY3NzUHJlZml4ID0gRmlyZWZveCA/ICctbW96LScgOiBJRU1vYmlsZSA/ICctbXMtJyA6ICctd2Via2l0LSdcbnZhciBzdHlsZVByZWZpeCA9IEZpcmVmb3ggPyAnTW96JyA6IElFTW9iaWxlID8gJ21zJyA6ICd3ZWJraXQnXG5cbmZ1bmN0aW9uIGRlYnVnTG9nKCkge1xuICBpZiAobGliLnNjcm9sbC5vdXRwdXREZWJ1Z0xvZykge1xuICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWwpIHtcbiAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICBpZiAoIXJlY3QpIHtcbiAgICByZWN0ID0ge31cbiAgICByZWN0LndpZHRoID0gZWwub2Zmc2V0V2lkdGhcbiAgICByZWN0LmhlaWdodCA9IGVsLm9mZnNldEhlaWdodFxuXG4gICAgcmVjdC5sZWZ0ID0gZWwub2Zmc2V0TGVmdFxuICAgIHJlY3QudG9wID0gZWwub2Zmc2V0VG9wXG4gICAgdmFyIHBhcmVudCA9IGVsLm9mZnNldFBhcmVudFxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIHJlY3QubGVmdCArPSBwYXJlbnQub2Zmc2V0TGVmdFxuICAgICAgcmVjdC50b3AgKz0gcGFyZW50Lm9mZnNldFRvcFxuICAgICAgcGFyZW50ID0gcGFyZW50Lm9mZnNldFBhcmVudFxuICAgIH1cblxuICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyByZWN0LndpZHRoXG4gICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0XG4gIH1cbiAgcmV0dXJuIHJlY3Rcbn1cblxuZnVuY3Rpb24gZ2V0TWluU2Nyb2xsT2Zmc2V0KHNjcm9sbE9iaikge1xuICByZXR1cm4gMCAtIHNjcm9sbE9iai5vcHRpb25zW3Njcm9sbE9iai5heGlzICsgJ1BhZGRpbmdUb3AnXVxufVxuXG5mdW5jdGlvbiBnZXRNYXhTY3JvbGxPZmZzZXQoc2Nyb2xsT2JqKSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHNjcm9sbE9iai5lbGVtZW50KVxuICB2YXIgcFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc2Nyb2xsT2JqLnZpZXdwb3J0KVxuICB2YXIgbWluID0gZ2V0TWluU2Nyb2xsT2Zmc2V0KHNjcm9sbE9iailcbiAgaWYgKHNjcm9sbE9iai5heGlzID09PSAneScpIHtcbiAgICB2YXIgbWF4ID0gMCAtIHJlY3QuaGVpZ2h0ICsgcFJlY3QuaGVpZ2h0XG4gIH0gZWxzZSB7XG4gICAgdmFyIG1heCA9IDAgLSByZWN0LndpZHRoICsgcFJlY3Qud2lkdGhcbiAgfVxuICByZXR1cm4gTWF0aC5taW4oXG4gICAgbWF4ICsgc2Nyb2xsT2JqLm9wdGlvbnNbc2Nyb2xsT2JqLmF4aXMgKyAnUGFkZGluZ0JvdHRvbSddLFxuICAgIG1pblxuICApXG59XG5cbmZ1bmN0aW9uIGdldEJvdW5kYXJ5T2Zmc2V0KHNjcm9sbE9iaiwgb2Zmc2V0KSB7XG4gIGlmIChvZmZzZXQgPiBzY3JvbGxPYmoubWluU2Nyb2xsT2Zmc2V0KSB7XG4gICAgcmV0dXJuIG9mZnNldCAtIHNjcm9sbE9iai5taW5TY3JvbGxPZmZzZXRcbiAgfVxuICBpZiAob2Zmc2V0IDwgc2Nyb2xsT2JqLm1heFNjcm9sbE9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgLSBzY3JvbGxPYmoubWF4U2Nyb2xsT2Zmc2V0XG4gIH1cbn1cblxuZnVuY3Rpb24gdG91Y2hCb3VuZGFyeShzY3JvbGxPYmosIG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID4gc2Nyb2xsT2JqLm1pblNjcm9sbE9mZnNldCkge1xuICAgIG9mZnNldCA9IHNjcm9sbE9iai5taW5TY3JvbGxPZmZzZXRcbiAgfSBlbHNlIGlmIChvZmZzZXQgPCBzY3JvbGxPYmoubWF4U2Nyb2xsT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gc2Nyb2xsT2JqLm1heFNjcm9sbE9mZnNldFxuICB9XG4gIHJldHVybiBvZmZzZXRcbn1cblxuZnVuY3Rpb24gZmlyZUV2ZW50KHNjcm9sbE9iaiwgZXZlbnROYW1lLCBleHRyYSkge1xuICBkZWJ1Z0xvZyhzY3JvbGxPYmouZWxlbWVudC5zY3JvbGxJZCwgZXZlbnROYW1lLCBleHRyYSlcbiAgdmFyIGV2ZW50ID0gZG9jLmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJylcbiAgZXZlbnQuaW5pdEV2ZW50KGV2ZW50TmFtZSwgZmFsc2UsIHRydWUpXG4gIGV2ZW50LnNjcm9sbE9iaiA9IHNjcm9sbE9ialxuICBpZiAoZXh0cmEpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXh0cmEpIHtcbiAgICAgIGV2ZW50W2tleV0gPSBleHRyYVtrZXldXG4gICAgfVxuICB9XG4gIHNjcm9sbE9iai5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gIHNjcm9sbE9iai52aWV3cG9ydC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2Zvcm1PZmZzZXQoc2Nyb2xsT2JqKSB7XG4gIHZhciBvZmZzZXQgPSB7eDogMCwgeTogMH1cbiAgdmFyIHRyYW5zZm9ybSA9IGdldENvbXB1dGVkU3R5bGUoc2Nyb2xsT2JqLmVsZW1lbnQpXG4gICAgW3N0eWxlUHJlZml4ICsgJ1RyYW5zZm9ybSddXG4gIHZhciBtYXRjaGVkXG4gIHZhciByZWcxID0gbmV3IFJlZ0V4cCgnXm1hdHJpeDNkJ1xuICAgICsgJ1xcXFwoKD86Wy1cXFxcZC5dKyxcXFxccyopezEyfShbLVxcXFxkLl0rKSwnXG4gICAgKyAnXFxcXHMqKFstXFxcXGQuXSspKD86LFxcXFxzKlstXFxcXGQuXSspezJ9XFxcXCknKVxuICB2YXIgcmVnMiA9IG5ldyBSZWdFeHAoJ15tYXRyaXgnXG4gICAgKyAnXFxcXCgoPzpbLVxcXFxkLl0rLFxcXFxzKil7NH0oWy1cXFxcZC5dKyksXFxcXHMqKFstXFxcXGQuXSspXFxcXCkkJylcbiAgaWYgKHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgaWYgKChtYXRjaGVkID0gdHJhbnNmb3JtLm1hdGNoKHJlZzEpIHx8XG4gICAgICAgIHRyYW5zZm9ybS5tYXRjaChyZWcyKSkpIHtcbiAgICAgIG9mZnNldC54ID0gcGFyc2VGbG9hdChtYXRjaGVkWzFdKSB8fCAwXG4gICAgICBvZmZzZXQueSA9IHBhcnNlRmxvYXQobWF0Y2hlZFsyXSkgfHwgMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxudmFyIENTU01hdHJpeCA9IElFTW9iaWxlID8gJ01TQ1NTTWF0cml4JyA6ICdXZWJLaXRDU1NNYXRyaXgnXG52YXIgaGFzM2QgPSAhIUZpcmVmb3hcbiAgfHwgQ1NTTWF0cml4IGluIHdpbmRvd1xuICAmJiAnbTExJyBpbiBuZXcgd2luZG93W0NTU01hdHJpeF0oKVxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRlKHgsIHkpIHtcbiAgeCA9IHBhcnNlRmxvYXQoeClcbiAgeSA9IHBhcnNlRmxvYXQoeSlcblxuICBpZiAoeCAhPSAwKSB7XG4gICAgeCArPSAncHgnXG4gIH1cblxuICBpZiAoeSAhPSAwKSB7XG4gICAgeSArPSAncHgnXG4gIH1cblxuICBpZiAoaGFzM2QpIHtcbiAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJywgJyArIHkgKyAnLCAwKSdcbiAgfVxuICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgeCArICcsICcgKyB5ICsgJyknXG59XG5cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb25TdHlsZShzY3JvbGxPYmosIGR1cmF0aW9uLCB0aW1pbmdGdW5jdGlvbikge1xuICBpZiAoZHVyYXRpb24gPT09ICcnICYmIHRpbWluZ0Z1bmN0aW9uID09PSAnJykge1xuICAgIHNjcm9sbE9iai5lbGVtZW50LnN0eWxlW3N0eWxlUHJlZml4ICsgJ1RyYW5zaXRpb24nXSA9ICcnXG4gIH0gZWxzZSB7XG4gICAgc2Nyb2xsT2JqLmVsZW1lbnQuc3R5bGVbc3R5bGVQcmVmaXggKyAnVHJhbnNpdGlvbiddXG4gICAgICA9IGNzc1ByZWZpeCArICd0cmFuc2Zvcm0gJyArIGR1cmF0aW9uICsgJyAnICsgdGltaW5nRnVuY3Rpb24gKyAnIDBzJ1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFRyYW5zZm9ybVN0eWxlKHNjcm9sbE9iaiwgb2Zmc2V0KSB7XG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdvYmplY3QnKSB7XG4gICAgeCA9IG9mZnNldC54XG4gICAgeSA9IG9mZnNldC55XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNjcm9sbE9iai5heGlzID09PSAneScpIHtcbiAgICAgIHkgPSBvZmZzZXRcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IG9mZnNldFxuICAgIH1cbiAgfVxuICBzY3JvbGxPYmouZWxlbWVudC5zdHlsZVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXSA9IGdldFRyYW5zbGF0ZSh4LCB5KVxufVxuXG52YXIgcGFubmluZyA9IGZhbHNlXG5kb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgaWYgKHBhbm5pbmcpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSwgZmFsc2UpXG5cbmZ1bmN0aW9uIFNjcm9sbChlbGVtZW50LCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gdGhpc1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIG9wdGlvbnMubm9Cb3VuY2UgPSAhIW9wdGlvbnMubm9Cb3VuY2VcbiAgb3B0aW9ucy5wYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nIHx8IHt9XG5cbiAgaWYgKG9wdGlvbnMuaXNQcmV2ZW50ID09IG51bGwpIHtcbiAgICBvcHRpb25zLmlzUHJldmVudCA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmlzUHJldmVudCA9ICEhb3B0aW9ucy5pc1ByZXZlbnRcbiAgfVxuXG4gIGlmIChvcHRpb25zLmlzRml4U2Nyb2xsZW5kQ2xpY2sgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMuaXNGaXhTY3JvbGxlbmRDbGljayA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmlzRml4U2Nyb2xsZW5kQ2xpY2sgPSAhIW9wdGlvbnMuaXNGaXhTY3JvbGxlbmRDbGlja1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucGFkZGluZykge1xuICAgIG9wdGlvbnMueVBhZGRpbmdUb3AgPSAtb3B0aW9ucy5wYWRkaW5nLnRvcCB8fCAwXG4gICAgb3B0aW9ucy55UGFkZGluZ0JvdHRvbSA9IC1vcHRpb25zLnBhZGRpbmcuYm90dG9tIHx8IDBcbiAgICBvcHRpb25zLnhQYWRkaW5nVG9wID0gLW9wdGlvbnMucGFkZGluZy5sZWZ0IHx8IDBcbiAgICBvcHRpb25zLnhQYWRkaW5nQm90dG9tID0gLW9wdGlvbnMucGFkZGluZy5yaWdodCB8fCAwXG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucy55UGFkZGluZ1RvcCA9IDBcbiAgICBvcHRpb25zLnlQYWRkaW5nQm90dG9tID0gMFxuICAgIG9wdGlvbnMueFBhZGRpbmdUb3AgPSAwXG4gICAgb3B0aW9ucy54UGFkZGluZ0JvdHRvbSA9IDBcbiAgfVxuXG4gIG9wdGlvbnMuZGlyZWN0aW9uID0gb3B0aW9ucy5kaXJlY3Rpb24gfHwgJ3knXG4gIG9wdGlvbnMuaW5lcnRpYSA9IG9wdGlvbnMuaW5lcnRpYSB8fCAnbm9ybWFsJ1xuXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgdGhhdC5heGlzID0gb3B0aW9ucy5kaXJlY3Rpb25cbiAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxuICB0aGlzLnZpZXdwb3J0ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gIHRoaXMucGx1Z2lucyA9IHt9XG5cbiAgdGhpcy5lbGVtZW50LnNjcm9sbElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgc2Nyb2xsT2Jqc1t0aGF0LmVsZW1lbnQuc2Nyb2xsSWQgKyAnJ10gPSB0aGF0XG4gIH0sIDEpXG5cbiAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdG91Y2hzdGFydEhhbmRsZXIsIGZhbHNlKVxuICB0aGlzLnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyLCBmYWxzZSlcbiAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRvdWNoZW5kSGFuZGxlciwgZmFsc2UpXG4gIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigncGFuc3RhcnQnLCBwYW5zdGFydEhhbmRsZXIsIGZhbHNlKVxuICB0aGlzLnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhbm1vdmUnLCBwYW5IYW5kbGVyLCBmYWxzZSlcbiAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCdwYW5lbmQnLCBwYW5lbmRIYW5kbGVyLCBmYWxzZSlcblxuICBpZiAob3B0aW9ucy5pc1ByZXZlbnQpIHtcbiAgICB0aGlzLnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgcGFubmluZyA9IHRydWVcbiAgICB9LCBmYWxzZSlcbiAgICB0aGF0LnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHBhbm5pbmcgPSBmYWxzZVxuICAgIH0sIGZhbHNlKVxuICB9XG5cbiAgLy8gaWYgKG9wdGlvbnMuaXNQcmV2ZW50KSB7XG4gIC8vICAgdmFyIGQgPSB0aGlzLmF4aXMgPT09ICd5Jz8ndmVydGljYWwnOidob3Jpem9udGFsJ1xuICAvLyAgIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihkICsgJ3BhbnN0YXJ0JywgZnVuY3Rpb24gKGUpIHtcbiAgLy8gICAgIHBhbm5pbmcgPSB0cnVlXG4gIC8vICAgfSwgZmFsc2UpXG4gIC8vICAgdGhhdC52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCdwYW5lbmQnLCBmdW5jdGlvbiAoZSkge1xuICAvLyAgICAgcGFubmluZyA9IGZhbHNlXG4gIC8vICAgfSwgZmFsc2UpXG4gIC8vIH1cblxuICBpZiAob3B0aW9ucy5pc0ZpeFNjcm9sbGVuZENsaWNrKSB7XG4gICAgdmFyIHByZXZlbnRTY3JvbGxlbmRDbGlja1xuICAgIHZhciBmaXhTY3JvbGxlbmRDbGlja1RpbWVvdXRJZFxuXG4gICAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGxpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwcmV2ZW50U2Nyb2xsZW5kQ2xpY2sgPSB0cnVlXG4gICAgICBmaXhTY3JvbGxlbmRDbGlja1RpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQoZml4U2Nyb2xsZW5kQ2xpY2tUaW1lb3V0SWQpXG4gICAgICBmaXhTY3JvbGxlbmRDbGlja1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcHJldmVudFNjcm9sbGVuZENsaWNrID0gZmFsc2VcbiAgICAgIH0sIDQwMClcbiAgICB9LCBmYWxzZSlcblxuICAgIGZ1bmN0aW9uIHByZXZlbnRTY3JvbGxlbmRDbGlja0hhbmRsZXIoZSkge1xuICAgICAgaWYgKHByZXZlbnRTY3JvbGxlbmRDbGljayB8fCBpc1Njcm9sbGluZykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmlyZU5pY2VUYXBFdmVudEhhbmRsZXIoZSkge1xuICAgICAgaWYgKCFwcmV2ZW50U2Nyb2xsZW5kQ2xpY2sgJiYgIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBuaWNlVGFwRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpXG4gICAgICAgICAgbmljZVRhcEV2ZW50LmluaXRFdmVudCgnbmljZWNsaWNrJywgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgICBlLnRhcmdldC5kaXNwYXRjaEV2ZW50KG5pY2VUYXBFdmVudClcbiAgICAgICAgfSwgMzAwKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwcmV2ZW50U2Nyb2xsZW5kQ2xpY2tIYW5kbGVyKVxuICAgIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigndGFwJywgZmlyZU5pY2VUYXBFdmVudEhhbmRsZXIpXG4gIH1cblxuICBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihoLCB0KSB7XG4gICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IG51bGxcbiAgICBjbGVhclRpbWVvdXQodHJhbnNpdGlvbkVuZFRpbWVvdXRJZClcblxuICAgIHRyYW5zaXRpb25FbmRUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0cmFuc2l0aW9uRW5kSGFuZGxlcikge1xuICAgICAgICB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IG51bGxcbiAgICAgICAgbGliLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWUoaClcbiAgICAgIH1cbiAgICB9LCAodCB8fCA0MDApKVxuXG4gICAgdHJhbnNpdGlvbkVuZEhhbmRsZXIgPSBoXG4gIH1cblxuICBpZiAob3B0aW9ucy51c2VGcmFtZUFuaW1hdGlvbikge1xuICAgIHZhciBzY3JvbGxBbmltYXRpb25cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYW5pbWF0aW9uJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxBbmltYXRpb25cbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHZhciB0cmFuc2l0aW9uRW5kSGFuZGxlclxuICAgIHZhciB0cmFuc2l0aW9uRW5kVGltZW91dElkID0gMFxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBGaXJlZm94XG4gICAgICAgICAgPyAndHJhbnNpdGlvbmVuZCdcbiAgICAgICAgICA6IChzdHlsZVByZWZpeCArICdUcmFuc2l0aW9uRW5kJyksIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodHJhbnNpdGlvbkVuZEhhbmRsZXIpIHtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSB0cmFuc2l0aW9uRW5kSGFuZGxlclxuXG4gICAgICAgIHRyYW5zaXRpb25FbmRIYW5kbGVyID0gbnVsbFxuICAgICAgICBjbGVhclRpbWVvdXQodHJhbnNpdGlvbkVuZFRpbWVvdXRJZClcblxuICAgICAgICBsaWIuYW5pbWF0aW9uLnJlcXVlc3RGcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaGFuZGxlcihlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sIGZhbHNlKVxuICB9XG5cbiAgdmFyIHBhbkZpeFJhdGlvXG4gIHZhciBpc1Njcm9sbGluZ1xuICB2YXIgaXNGbGlja1Njcm9sbGluZ1xuICB2YXIgY2FuY2VsU2Nyb2xsRW5kXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpc1Njcm9sbGluZycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIWlzU2Nyb2xsaW5nXG4gICAgfVxuICB9KVxuXG4gIGZ1bmN0aW9uIGlzRW5hYmxlZChlKSB7XG4gICAgaWYgKCF0aGF0LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZS5pc1ZlcnRpY2FsICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhhdC5heGlzID09PSAneScgJiYgZS5pc1ZlcnRpY2FsXG4gICAgICAgICAgfHwgdGhhdC5heGlzID09PSAneCcgJiYgIWUuaXNWZXJ0aWNhbCkge1xuICAgICAgICAvLyBnZXN0dXJlIGluIHNhbWUgZGlyZWN0aW9uLCBzdG9wIGJ1YmJsaW5nIHVwXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdlc3R1cmUgaW4gZGlmZmVyZW50IGRpcmVjdGlvbiwgYnViYmxpbmcgdXBcbiAgICAgICAgLy8gdG8gdGhlIHRvcCwgd2l0aG91dCBhbnkgb3RoZXIgcHJvY2Vzc1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZSkge1xuICAgIGlmICghaXNFbmFibGVkKGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNTY3JvbGxpbmcpIHtcbiAgICAgIHNjcm9sbEVuZCgpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgIHNjcm9sbEFuaW1hdGlvbiAmJiBzY3JvbGxBbmltYXRpb24uc3RvcCgpXG4gICAgICBzY3JvbGxBbmltYXRpb24gPSBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1PZmZzZXQodGhhdClcbiAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIHRyYW5zZm9ybSlcbiAgICAgIHNldFRyYW5zaXRpb25TdHlsZSh0aGF0LCAnJywgJycpXG4gICAgICB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IG51bGxcbiAgICAgIGNsZWFyVGltZW91dCh0cmFuc2l0aW9uRW5kVGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kSGFuZGxlcihlKSB7XG4gICAgaWYgKCFpc0VuYWJsZWQoZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBzMCA9IGdldFRyYW5zZm9ybU9mZnNldCh0aGF0KVt0aGF0LmF4aXNdXG4gICAgdmFyIGJvdW5kYXJ5T2Zmc2V0ID0gZ2V0Qm91bmRhcnlPZmZzZXQodGhhdCwgczApXG5cbiAgICBpZiAoYm91bmRhcnlPZmZzZXQpIHtcbiAgICAgIC8vIGRyYWdnaW5nIG91dCBvZiBib3VuZHJheSwgYm91bmNlIGlzIG5lZWRlZFxuICAgICAgdmFyIHMxID0gdG91Y2hCb3VuZGFyeSh0aGF0LCBzMClcblxuICAgICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgLy8gZnJhbWVcbiAgICAgICAgdmFyIF9zID0gczEgLSBzMFxuICAgICAgICBzY3JvbGxBbmltYXRpb24gPSBuZXcgbGliLmFuaW1hdGlvbihcbiAgICAgICAgICAgIDQwMCxcbiAgICAgICAgICAgIGxpYi5jdWJpY2Jlemllci5lYXNlLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gKHMwICsgX3MgKiBpMikudG9GaXhlZCgyKVxuICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gICAgICAgIH0pXG4gICAgICAgIHNjcm9sbEFuaW1hdGlvbi5vbmVuZChzY3JvbGxFbmQpXG4gICAgICAgIHNjcm9sbEFuaW1hdGlvbi5wbGF5KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNzc1xuICAgICAgICB2YXIgb2Zmc2V0ID0gIHMxLnRvRml4ZWQoMClcbiAgICAgICAgc2V0VHJhbnNpdGlvbkVuZEhhbmRsZXIoc2Nyb2xsRW5kLCA0MDApXG4gICAgICAgIHNldFRyYW5zaXRpb25TdHlsZSh0aGF0LCAnMC40cycsICdlYXNlJylcbiAgICAgICAgc2V0VHJhbnNmb3JtU3R5bGUodGhhdCwgb2Zmc2V0KVxuXG4gICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGZ1bmN0aW9uIGRvU2Nyb2xsKCkge1xuICAgICAgICAgIGlmIChpc1Njcm9sbGluZyAmJiB0aGF0LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGZpcmVFdmVudCh0aGF0LCAnc2Nyb2xsaW5nJylcbiAgICAgICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGRvU2Nyb2xsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGJvdW5kYXJ5T2Zmc2V0ID4gMCkge1xuICAgICAgICBmaXJlRXZlbnQodGhhdCwgdGhhdC5heGlzID09PSAneScgPyAncHVsbGRvd25lbmQnIDogJ3B1bGxyaWdodGVuZCcpXG4gICAgICB9IGVsc2UgaWYgKGJvdW5kYXJ5T2Zmc2V0IDwgMCkge1xuICAgICAgICBmaXJlRXZlbnQodGhhdCwgdGhhdC5heGlzID09PSAneScgPyAncHVsbHVwZW5kJyA6ICdwdWxsbGVmdGVuZCcpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1Njcm9sbGluZykge1xuICAgICAgLy8gd2l0aG91dCBleGNlZWRpbmcgdGhlIGJvdW5kYXJ5LCBqdXN0IGVuZCBpdFxuICAgICAgc2Nyb2xsRW5kKClcbiAgICB9XG4gIH1cblxuICB2YXIgbGFzdERpc3BsYWNlbWVudFxuICBmdW5jdGlvbiBwYW5zdGFydEhhbmRsZXIoZSkge1xuICAgIGlmICghaXNFbmFibGVkKGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGF0LnRyYW5zZm9ybU9mZnNldCA9IGdldFRyYW5zZm9ybU9mZnNldCh0aGF0KVxuICAgIHRoYXQubWluU2Nyb2xsT2Zmc2V0ID0gZ2V0TWluU2Nyb2xsT2Zmc2V0KHRoYXQpXG4gICAgdGhhdC5tYXhTY3JvbGxPZmZzZXQgPSBnZXRNYXhTY3JvbGxPZmZzZXQodGhhdClcbiAgICBwYW5GaXhSYXRpbyA9IDIuNVxuICAgIGNhbmNlbFNjcm9sbEVuZCA9IHRydWVcbiAgICBpc1Njcm9sbGluZyA9IHRydWVcbiAgICBpc0ZsaWNrU2Nyb2xsaW5nID0gZmFsc2VcbiAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbHN0YXJ0JylcblxuICAgIGxhc3REaXNwbGFjZW1lbnQgPSBlWydkaXNwbGFjZW1lbnQnICsgdGhhdC5heGlzLnRvVXBwZXJDYXNlKCldXG4gIH1cblxuXG4gIGZ1bmN0aW9uIHBhbkhhbmRsZXIoZSkge1xuICAgIGlmICghaXNFbmFibGVkKGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBmaW5nZXIgbW92ZSBsZXNzIHRoYW4gNSBweC4ganVzdCBpZ25vcmUgdGhhdC5cbiAgICB2YXIgZGlzcGxhY2VtZW50ID0gZVsnZGlzcGxhY2VtZW50JyArIHRoYXQuYXhpcy50b1VwcGVyQ2FzZSgpXVxuICAgIGlmIChNYXRoLmFicyhkaXNwbGFjZW1lbnQgLSBsYXN0RGlzcGxhY2VtZW50KSA8IDUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsYXN0RGlzcGxhY2VtZW50ID0gZGlzcGxhY2VtZW50XG5cbiAgICB2YXIgb2Zmc2V0ID0gdGhhdC50cmFuc2Zvcm1PZmZzZXRbdGhhdC5heGlzXSArIGRpc3BsYWNlbWVudFxuICAgIGlmIChvZmZzZXQgPiB0aGF0Lm1pblNjcm9sbE9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gdGhhdC5taW5TY3JvbGxPZmZzZXRcbiAgICAgICAgKyAob2Zmc2V0IC0gdGhhdC5taW5TY3JvbGxPZmZzZXQpIC8gcGFuRml4UmF0aW9cbiAgICAgIHBhbkZpeFJhdGlvICo9IDEuMDAzXG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPCB0aGF0Lm1heFNjcm9sbE9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gdGhhdC5tYXhTY3JvbGxPZmZzZXRcbiAgICAgICAgLSAodGhhdC5tYXhTY3JvbGxPZmZzZXQgLSBvZmZzZXQpIC8gcGFuRml4UmF0aW9cbiAgICAgIHBhbkZpeFJhdGlvICo9IDEuMDAzXG4gICAgfVxuICAgIGlmIChwYW5GaXhSYXRpbyA+IDQpIHtcbiAgICAgIHBhbkZpeFJhdGlvID0gNFxuICAgIH1cblxuICAgIC8vIHRlbGwgd2hldGhlciBvciBub3QgcmVhY2ggdGhlIGZyaW5nZVxuICAgIHZhciBib3VuZGFyeU9mZnNldCA9IGdldEJvdW5kYXJ5T2Zmc2V0KHRoYXQsIG9mZnNldClcbiAgICBpZiAoYm91bmRhcnlPZmZzZXQpIHtcbiAgICAgIGZpcmVFdmVudChcbiAgICAgICAgICB0aGF0LFxuICAgICAgICAgIGJvdW5kYXJ5T2Zmc2V0ID4gMFxuICAgICAgICAgID8gKHRoYXQuYXhpcyA9PT0gJ3knID8gJ3B1bGxkb3duJyA6ICdwdWxscmlnaHQnKVxuICAgICAgICAgIDogKHRoYXQuYXhpcyA9PT0gJ3knID8gJ3B1bGx1cCcgOiAncHVsbGxlZnQnKSwge1xuICAgICAgICBib3VuZGFyeU9mZnNldDogTWF0aC5hYnMoYm91bmRhcnlPZmZzZXQpXG4gICAgICB9KVxuICAgICAgaWYgKHRoYXQub3B0aW9ucy5ub0JvdW5jZSkge1xuICAgICAgICBvZmZzZXQgPSB0b3VjaEJvdW5kYXJ5KHRoYXQsIG9mZnNldClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQudG9GaXhlZCgyKSlcbiAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gIH1cblxuICBmdW5jdGlvbiBwYW5lbmRIYW5kbGVyKGUpIHtcbiAgICBpZiAoIWlzRW5hYmxlZChlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGUuaXNTd2lwZSkge1xuICAgICAgZmxpY2tIYW5kbGVyKGUpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmxpY2tIYW5kbGVyKGUpIHtcbiAgICBjYW5jZWxTY3JvbGxFbmQgPSB0cnVlXG5cbiAgICB2YXIgdjAsIGEwLCB0MCwgczAsIHMsIG1vdGlvbjBcbiAgICB2YXIgdjEsIGExLCB0MSwgczEsIG1vdGlvbjEsc2lnblxuICAgIHZhciB2MiwgYTIsIHQyLCBzMiwgbW90aW9uMiwgZnRcblxuICAgIHMwID0gZ2V0VHJhbnNmb3JtT2Zmc2V0KHRoYXQpW3RoYXQuYXhpc11cbiAgICB2YXIgYm91bmRhcnlPZmZzZXQwID0gZ2V0Qm91bmRhcnlPZmZzZXQodGhhdCwgczApXG4gICAgaWYgKCFib3VuZGFyeU9mZnNldDApIHtcbiAgICAgIC8vIHdoZW4gZmluZ2VycyBsZWZ0IHRoZSByYW5nZSBvZiBzY3JlZW4sIGxldCB0b3VjaCBlbmQgaGFuZGxlclxuICAgICAgLy8gdG8gZGVhbCB3aXRoIGl0LlxuICAgICAgLy8gd2hlbiBmaW5nZXJzIGxlZnQgdGhlIHNjcmVlbiwgYnV0IHN0aWxsIGluIHRoZSByYW5nZSBvZlxuICAgICAgLy8gc2NyZWVuLCBjYWxjdWxhdGUgdGhlIGludGVydGlhLlxuICAgICAgdjAgPSBlWyd2ZWxvY2l0eScgKyB0aGF0LmF4aXMudG9VcHBlckNhc2UoKV1cblxuICAgICAgdmFyIG1heFYgPSAyXG4gICAgICB2YXIgZnJpY3Rpb24gPSAwLjAwMTVcbiAgICAgIGlmIChvcHRpb25zLmluZXJ0aWEgJiYgaW5lcnRpYUNvZWZmaWNpZW50W29wdGlvbnMuaW5lcnRpYV0pIHtcbiAgICAgICAgbWF4ViA9IGluZXJ0aWFDb2VmZmljaWVudFtvcHRpb25zLmluZXJ0aWFdWzBdXG4gICAgICAgIGZyaWN0aW9uID0gaW5lcnRpYUNvZWZmaWNpZW50W29wdGlvbnMuaW5lcnRpYV1bMV1cbiAgICAgIH1cblxuICAgICAgaWYgKHYwID4gbWF4Vikge1xuICAgICAgICB2MCA9IG1heFZcbiAgICAgIH1cbiAgICAgIGlmICh2MCA8IC1tYXhWKSB7XG4gICAgICAgIHYwID0gLW1heFZcbiAgICAgIH1cbiAgICAgIGEwID0gZnJpY3Rpb24gKiAodjAgLyBNYXRoLmFicyh2MCkpXG4gICAgICBtb3Rpb24wID0gbmV3IGxpYi5tb3Rpb24oe1xuICAgICAgICB2OiB2MCxcbiAgICAgICAgYTogLWEwXG4gICAgICB9KVxuICAgICAgdDAgPSBtb3Rpb24wLnRcbiAgICAgIHMgPSBzMCArIG1vdGlvbjAuc1xuXG4gICAgICB2YXIgYm91bmRhcnlPZmZzZXQxID0gZ2V0Qm91bmRhcnlPZmZzZXQodGhhdCwgcylcbiAgICAgIGlmIChib3VuZGFyeU9mZnNldDEpIHtcbiAgICAgICAgZGVidWdMb2coJ2luZXJ0aWFsIGNhbGN1bGF0aW9uIGhhcyBleGNlZWRlZCB0aGUgYm91bmRhcnknLFxuICAgICAgICAgIGJvdW5kYXJ5T2Zmc2V0MSlcblxuICAgICAgICB2MSA9IHYwXG4gICAgICAgIGExID0gYTBcbiAgICAgICAgaWYgKGJvdW5kYXJ5T2Zmc2V0MSA+IDApIHtcbiAgICAgICAgICBzMSA9IHRoYXQubWluU2Nyb2xsT2Zmc2V0XG4gICAgICAgICAgc2lnbiA9IDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHRoYXQubWF4U2Nyb2xsT2Zmc2V0XG4gICAgICAgICAgc2lnbiA9IC0xXG4gICAgICAgIH1cbiAgICAgICAgbW90aW9uMSA9IG5ldyBsaWIubW90aW9uKHtcbiAgICAgICAgICB2OiBzaWduICogdjEsXG4gICAgICAgICAgYTogLXNpZ24gKiBhMSxcbiAgICAgICAgICBzOiBNYXRoLmFicyhzMSAtIHMwKVxuICAgICAgICB9KVxuICAgICAgICB0MSA9IG1vdGlvbjEudFxuICAgICAgICB2YXIgdGltZUZ1bmN0aW9uMSA9IG1vdGlvbjEuZ2VuZXJhdGVDdWJpY0JlemllcigpXG5cbiAgICAgICAgdjIgPSB2MSAtIGExICogdDFcbiAgICAgICAgYTIgPSAwLjAzICogKHYyIC8gTWF0aC5hYnModjIpKVxuICAgICAgICBtb3Rpb24yID0gbmV3IGxpYi5tb3Rpb24oe1xuICAgICAgICAgIHY6IHYyLFxuICAgICAgICAgIGE6IC1hMlxuICAgICAgICB9KVxuICAgICAgICB0MiA9IG1vdGlvbjIudFxuICAgICAgICBzMiA9IHMxICsgbW90aW9uMi5zXG4gICAgICAgIHZhciB0aW1lRnVuY3Rpb24yID0gbW90aW9uMi5nZW5lcmF0ZUN1YmljQmV6aWVyKClcblxuICAgICAgICBpZiAob3B0aW9ucy5ub0JvdW5jZSkge1xuICAgICAgICAgIGRlYnVnTG9nKCdubyBib3VuY2UgZWZmZWN0JylcblxuICAgICAgICAgIGlmIChzMCAhPT0gczEpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgIC8vIGZyYW1lXG4gICAgICAgICAgICAgIHZhciBfcyA9IHMxIC0gczBcbiAgICAgICAgICAgICAgdmFyIGJlemllciA9IGxpYi5jdWJpY2JlemllcihcbiAgICAgICAgICAgICAgICB0aW1lRnVuY3Rpb24xWzBdWzBdLFxuICAgICAgICAgICAgICAgIHRpbWVGdW5jdGlvbjFbMF1bMV0sXG4gICAgICAgICAgICAgICAgdGltZUZ1bmN0aW9uMVsxXVswXSxcbiAgICAgICAgICAgICAgICB0aW1lRnVuY3Rpb24xWzFdWzFdXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uID0gbmV3IGxpYi5hbmltYXRpb24oXG4gICAgICAgICAgICAgICAgICB0MS50b0ZpeGVkKDApLFxuICAgICAgICAgICAgICAgICAgYmV6aWVyLFxuICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gKHMwICsgX3MgKiBpMilcbiAgICAgICAgICAgICAgICBnZXRUcmFuc2Zvcm1PZmZzZXQodGhhdCwgb2Zmc2V0LnRvRml4ZWQoMikpXG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KHRoYXQsICdzY3JvbGxpbmcnLCB7XG4gICAgICAgICAgICAgICAgICBhZnRlckZsaWNrOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ub25lbmQoc2Nyb2xsRW5kKVxuXG4gICAgICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbi5wbGF5KClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNzc1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gczEudG9GaXhlZCgwKVxuICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihcbiAgICAgICAgICAgICAgICBzY3JvbGxFbmQsXG4gICAgICAgICAgICAgICAgKHQxIC8gMTAwMCkudG9GaXhlZCgyKSAqIDEwMDBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uU3R5bGUoXG4gICAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgICAodDEgLyAxMDAwKS50b0ZpeGVkKDIpICsgJ3MnLFxuICAgICAgICAgICAgICAgICdjdWJpYy1iZXppZXIoJyArIHRpbWVGdW5jdGlvbjEgKyAnKSdcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbEVuZCgpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHMwICE9PSBzMikge1xuICAgICAgICAgIGRlYnVnTG9nKFxuICAgICAgICAgICAgJ3Njcm9sbCBmb3IgaW5lcnRpYScsXG4gICAgICAgICAgICAncz0nICsgczIudG9GaXhlZCgwKSxcbiAgICAgICAgICAgICd0PScgKyAoKHQxICsgdDIpIC8gMTAwMCkudG9GaXhlZCgyKVxuICAgICAgICAgIClcblxuICAgICAgICAgIGlmIChvcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgX3MgPSBzMiAtIHMwXG4gICAgICAgICAgICB2YXIgYmV6aWVyID0gbGliLmN1YmljYmV6aWVyLmVhc2VPdXRcbiAgICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG5ldyBsaWIuYW5pbWF0aW9uKFxuICAgICAgICAgICAgICAgICh0MSArIHQyKS50b0ZpeGVkKDApLFxuICAgICAgICAgICAgICAgIGJlemllcixcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHMwICsgX3MgKiBpMlxuICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQudG9GaXhlZCgyKSlcbiAgICAgICAgICAgICAgZmlyZUV2ZW50KHRoYXQsICdzY3JvbGxpbmcnLHtcbiAgICAgICAgICAgICAgICBhZnRlckZsaWNrOiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ub25lbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoIXRoYXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIF9zID0gczEgLSBzMlxuICAgICAgICAgICAgICB2YXIgYmV6aWVyID0gbGliLmN1YmljYmV6aWVyLmVhc2VcbiAgICAgICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uID0gbmV3IGxpYi5hbmltYXRpb24oXG4gICAgICAgICAgICAgICAgICA0MDAsXG4gICAgICAgICAgICAgICAgICBiZXppZXIsXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGkxLCBpMikge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzMiArIF9zICogaTJcbiAgICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQudG9GaXhlZCgyKSlcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycse1xuICAgICAgICAgICAgICAgICAgYWZ0ZXJGbGljazogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uLm9uZW5kKHNjcm9sbEVuZClcblxuICAgICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ucGxheSgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ucGxheSgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzMi50b0ZpeGVkKDApXG4gICAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICBpZiAoIXRoYXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZGVidWdMb2coJ2luZXJ0aWFsIGJvdW5jZScsXG4gICAgICAgICAgICAgICAgJ3M9JyArIHMxLnRvRml4ZWQoMCksXG4gICAgICAgICAgICAgICAgJ3Q9NDAwJ1xuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgaWYgKHMyICE9PSBzMSkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzMS50b0ZpeGVkKDApXG4gICAgICAgICAgICAgICAgc2V0VHJhbnNpdGlvblN0eWxlKHRoYXQsICcwLjRzJywgJ2Vhc2UnKVxuICAgICAgICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihzY3JvbGxFbmQsIDQwMClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY3JvbGxFbmQoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoKHQxICsgdDIpIC8gMTAwMCkudG9GaXhlZCgyKSAqIDEwMDApXG5cbiAgICAgICAgICAgIHNldFRyYW5zaXRpb25TdHlsZShcbiAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgKCh0MSArIHQyKSAvIDEwMDApLnRvRml4ZWQoMikgKyAncycsXG4gICAgICAgICAgICAgICdlYXNlLW91dCdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2Nyb2xsRW5kKClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWdMb2coJ2luZXJ0aWFsIGNhbGN1bGF0aW9uIGhhc25cXCd0IGV4Y2VlZGVkIHRoZSBib3VuZGFyeScpXG4gICAgICAgIHZhciB0aW1lRnVuY3Rpb24gPSBtb3Rpb24wLmdlbmVyYXRlQ3ViaWNCZXppZXIoKVxuXG4gICAgICAgIGlmIChvcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgLy8gZnJhbWVcbiAgICAgICAgICB2YXIgX3MgPSBzIC0gczBcbiAgICAgICAgICB2YXIgYmV6aWVyID0gbGliLmN1YmljYmV6aWVyKFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzBdWzBdLFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzBdWzFdLFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzFdWzBdLFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzFdWzFdXG4gICAgICAgICAgKVxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG5ldyBsaWIuYW5pbWF0aW9uKFxuICAgICAgICAgICAgICB0MC50b0ZpeGVkKDApLFxuICAgICAgICAgICAgICBiZXppZXIsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoczAgKyBfcyAqIGkyKS50b0ZpeGVkKDIpXG4gICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG4gICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycse1xuICAgICAgICAgICAgICBhZnRlckZsaWNrOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBzY3JvbGxBbmltYXRpb24ub25lbmQoc2Nyb2xsRW5kKVxuXG4gICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uLnBsYXkoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNzc1xuICAgICAgICAgIHZhciBvZmZzZXQgPSBzLnRvRml4ZWQoMClcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihzY3JvbGxFbmQsICh0MCAvIDEwMDApLnRvRml4ZWQoMikgKiAxMDAwKVxuICAgICAgICAgIHNldFRyYW5zaXRpb25TdHlsZShcbiAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAodDAgLyAxMDAwKS50b0ZpeGVkKDIpICsgJ3MnLFxuICAgICAgICAgICAgJ2N1YmljLWJlemllcignICsgdGltZUZ1bmN0aW9uICsgJyknXG4gICAgICAgICAgKVxuICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIGlzRmxpY2tTY3JvbGxpbmcgPSB0cnVlXG4gICAgICBpZiAoIW9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgbGliLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWUoZnVuY3Rpb24gZG9TY3JvbGwoKSB7XG4gICAgICAgICAgaWYgKGlzU2Nyb2xsaW5nICYmIGlzRmxpY2tTY3JvbGxpbmcgJiYgdGhhdC5lbmFibGVkKSB7XG4gICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycsIHtcbiAgICAgICAgICAgICAgYWZ0ZXJGbGljazogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGRvU2Nyb2xsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY3JvbGxFbmQoKSB7XG4gICAgaWYgKCF0aGF0LmVuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNhbmNlbFNjcm9sbEVuZCA9IGZhbHNlXG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghY2FuY2VsU2Nyb2xsRW5kICYmIGlzU2Nyb2xsaW5nKSB7XG4gICAgICAgIGlzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgaXNGbGlja1Njcm9sbGluZyA9IGZhbHNlXG5cbiAgICAgICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxBbmltYXRpb24gJiYgc2Nyb2xsQW5pbWF0aW9uLnN0b3AoKVxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uU3R5bGUodGhhdCwgJycsICcnKVxuICAgICAgICB9XG4gICAgICAgIGZpcmVFdmVudCh0aGF0LCAnc2Nyb2xsZW5kJylcbiAgICAgIH1cbiAgICB9LCA1MClcbiAgfVxuXG4gIHZhciBwcm90byA9IHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVuYWJsZSgpXG4gICAgICB0aGlzLnJlZnJlc2goKVxuICAgICAgdGhpcy5zY3JvbGxUbygwKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgc2Nyb2xsQW5pbWF0aW9uICYmIHNjcm9sbEFuaW1hdGlvbi5zdG9wKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlbC5zdHlsZVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICAgICAgICAgICAgPSBnZXRDb21wdXRlZFN0eWxlKGVsKVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBnZXRTY3JvbGxXaWR0aDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLmVsZW1lbnQpLndpZHRoXG4gICAgfSxcblxuICAgIGdldFNjcm9sbEhlaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLmVsZW1lbnQpLmhlaWdodFxuICAgIH0sXG5cbiAgICBnZXRTY3JvbGxMZWZ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gLWdldFRyYW5zZm9ybU9mZnNldCh0aGlzKS54IC0gdGhpcy5vcHRpb25zLnhQYWRkaW5nVG9wXG4gICAgfSxcblxuICAgIGdldFNjcm9sbFRvcDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC1nZXRUcmFuc2Zvcm1PZmZzZXQodGhpcykueSAtIHRoaXMub3B0aW9ucy55UGFkZGluZ1RvcFxuICAgIH0sXG5cbiAgICBnZXRNYXhTY3JvbGxMZWZ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gLXRoYXQubWF4U2Nyb2xsT2Zmc2V0IC0gdGhpcy5vcHRpb25zLnhQYWRkaW5nVG9wXG4gICAgfSxcblxuICAgIGdldE1heFNjcm9sbFRvcDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC10aGF0Lm1heFNjcm9sbE9mZnNldCAtIHRoaXMub3B0aW9ucy55UGFkZGluZ1RvcFxuICAgIH0sXG5cbiAgICBnZXRCb3VuZGFyeU9mZnNldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKFxuICAgICAgICBnZXRCb3VuZGFyeU9mZnNldCh0aGlzLCBnZXRUcmFuc2Zvcm1PZmZzZXQodGhpcylbdGhpcy5heGlzXSkgfHwgMFxuICAgICAgKVxuICAgIH0sXG5cbiAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRcbiAgICAgIHZhciBpc1ZlcnRpY2FsID0gKHRoaXMuYXhpcyA9PT0gJ3knKVxuICAgICAgdmFyIHR5cGUgPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnXG4gICAgICB2YXIgc2l6ZSwgcmVjdCwgZXh0cmFTaXplXG5cbiAgICAgIGZ1bmN0aW9uIGdldEV4dHJhU2l6ZShlbCwgaXNWZXJ0aWNhbCkge1xuICAgICAgICB2YXIgZXh0cmFUeXBlID0gaXNWZXJ0aWNhbCA/IFsndG9wJywgJ2JvdHRvbSddIDogWydsZWZ0JywgJ3JpZ2h0J11cbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoXG4gICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShlbC5maXJzdEVsZW1lbnRDaGlsZClbJ21hcmdpbi0nICsgZXh0cmFUeXBlWzBdXVxuICAgICAgICApICsgcGFyc2VGbG9hdChcbiAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsLmxhc3RFbGVtZW50Q2hpbGQpWydtYXJnaW4tJyArIGV4dHJhVHlwZVsxXV1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zW3R5cGVdICE9IG51bGwpIHtcbiAgICAgICAgLy8gdXNlIG9wdGlvbnNcbiAgICAgICAgc2l6ZSA9IHRoaXMub3B0aW9uc1t0eXBlXVxuICAgICAgfSBlbHNlIGlmIChlbC5jaGlsZEVsZW1lbnRDb3VudCA8PSAwKSB7XG4gICAgICAgIGVsLnN0eWxlW3R5cGVdID0gJ2F1dG8nXG4gICAgICAgIHNpemUgPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKCEhdGhpcy5vcHRpb25zLnVzZUVsZW1lbnRSZWN0KSB7XG4gICAgICAgIGVsLnN0eWxlW3R5cGVdID0gJ2F1dG8nXG4gICAgICAgIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWwpXG4gICAgICAgIHNpemUgPSByZWN0W3R5cGVdXG4gICAgICAgIHNpemUgKz0gZ2V0RXh0cmFTaXplKGVsLCBpc1ZlcnRpY2FsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJhbmdlLCByZWN0XG4gICAgICAgIHZhciBmaXJzdEVsID0gZWwuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgdmFyIGxhc3RFbCA9IGVsLmxhc3RFbGVtZW50Q2hpbGRcblxuICAgICAgICBpZiAoZG9jdW1lbnQuY3JlYXRlUmFuZ2UgJiYgIXRoaXMub3B0aW9ucy5pZ25vcmVPdmVyZmxvdykge1xuICAgICAgICAgIC8vIHVzZSByYW5nZVxuICAgICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbClcbiAgICAgICAgICByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHJhbmdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlY3QpIHtcbiAgICAgICAgICBzaXplID0gcmVjdFt0eXBlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVzZSBjaGlsZCBvZmZzZXRzXG4gICAgICAgICAgd2hpbGUgKGZpcnN0RWwpIHtcbiAgICAgICAgICAgIGlmIChnZXRCb3VuZGluZ0NsaWVudFJlY3QoZmlyc3RFbClbdHlwZV0gPT09IDBcbiAgICAgICAgICAgICAgICAmJiBmaXJzdEVsLm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgICAgICAgICBmaXJzdEVsID0gZmlyc3RFbC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgd2hpbGUgKGxhc3RFbCAmJiBsYXN0RWwgIT09IGZpcnN0RWwpIHtcbiAgICAgICAgICAgIGlmIChnZXRCb3VuZGluZ0NsaWVudFJlY3QobGFzdEVsKVt0eXBlXSA9PT0gMFxuICAgICAgICAgICAgICAgICYmIGxhc3RFbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgIGxhc3RFbCA9IGxhc3RFbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNpemUgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QobGFzdEVsKVtcbiAgICAgICAgICAgICAgaXNWZXJ0aWNhbCA/ICdib3R0b20nIDogJ3JpZ2h0J11cbiAgICAgICAgICAgIC0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGZpcnN0RWwpW1xuICAgICAgICAgICAgICBpc1ZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCddXG4gICAgICAgIH1cblxuICAgICAgICBzaXplICs9IGdldEV4dHJhU2l6ZShlbCwgaXNWZXJ0aWNhbClcblxuICAgICAgfVxuXG4gICAgICBlbC5zdHlsZVt0eXBlXSA9IHNpemUgPyBzaXplICsgJ3B4JyA6ICdhdXRvJ1xuXG4gICAgICB0aGlzLnRyYW5zZm9ybU9mZnNldCA9IGdldFRyYW5zZm9ybU9mZnNldCh0aGlzKVxuICAgICAgdGhpcy5taW5TY3JvbGxPZmZzZXQgPSBnZXRNaW5TY3JvbGxPZmZzZXQodGhpcylcbiAgICAgIHRoaXMubWF4U2Nyb2xsT2Zmc2V0ID0gZ2V0TWF4U2Nyb2xsT2Zmc2V0KHRoaXMpXG5cbiAgICAgIHRoaXMuc2Nyb2xsVG8oXG4gICAgICAgIC10aGlzLnRyYW5zZm9ybU9mZnNldFt0aGlzLmF4aXNdXG4gICAgICAgIC0gdGhpcy5vcHRpb25zW3RoaXMuYXhpcyArICdQYWRkaW5nVG9wJ11cbiAgICAgIClcbiAgICAgIGZpcmVFdmVudCh0aGlzLCAnY29udGVudHJlZnJlc2gnKVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvZmZzZXQ6IGZ1bmN0aW9uIChjaGlsZEVsKSB7XG4gICAgICB2YXIgZWxSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMuZWxlbWVudClcbiAgICAgIHZhciBjaGlsZFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRFbClcbiAgICAgIGlmICh0aGlzLmF4aXMgPT09ICd5Jykge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSBlbFJlY3QudG9wIC0gdGhpcy5vcHRpb25zLnlQYWRkaW5nVG9wLFxuICAgICAgICAgIGxlZnQ6IGNoaWxkUmVjdC5sZWZ0IC0gZWxSZWN0LmxlZnQsXG4gICAgICAgICAgcmlnaHQ6IGVsUmVjdC5yaWdodCAtIGNoaWxkUmVjdC5yaWdodCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5ib3R0b20gPSBvZmZzZXRSZWN0LnRvcCArIG9mZnNldFJlY3QuaGVpZ2h0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSBlbFJlY3QudG9wLFxuICAgICAgICAgIGJvdHRvbTogZWxSZWN0LmJvdHRvbSAtIGNoaWxkUmVjdC5ib3R0b20sXG4gICAgICAgICAgbGVmdDogY2hpbGRSZWN0LmxlZnQgLSBlbFJlY3QubGVmdCAtIHRoaXMub3B0aW9ucy54UGFkZGluZ1RvcCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5yaWdodCA9IG9mZnNldFJlY3QubGVmdCArIG9mZnNldFJlY3Qud2lkdGhcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZmZzZXRSZWN0XG4gICAgfSxcblxuICAgIGdldFJlY3Q6IGZ1bmN0aW9uIChjaGlsZEVsKSB7XG4gICAgICB2YXIgdmlld1JlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy52aWV3cG9ydClcbiAgICAgIHZhciBjaGlsZFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRFbClcbiAgICAgIGlmICh0aGlzLmF4aXMgPT09ICd5Jykge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSB2aWV3UmVjdC50b3AsXG4gICAgICAgICAgbGVmdDogY2hpbGRSZWN0LmxlZnQgLSB2aWV3UmVjdC5sZWZ0LFxuICAgICAgICAgIHJpZ2h0OiB2aWV3UmVjdC5yaWdodCAtIGNoaWxkUmVjdC5yaWdodCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5ib3R0b20gPSBvZmZzZXRSZWN0LnRvcCArIG9mZnNldFJlY3QuaGVpZ2h0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSB2aWV3UmVjdC50b3AsXG4gICAgICAgICAgYm90dG9tOiB2aWV3UmVjdC5ib3R0b20gLSBjaGlsZFJlY3QuYm90dG9tLFxuICAgICAgICAgIGxlZnQ6IGNoaWxkUmVjdC5sZWZ0IC0gdmlld1JlY3QubGVmdCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5yaWdodCA9IG9mZnNldFJlY3QubGVmdCArIG9mZnNldFJlY3Qud2lkdGhcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZmZzZXRSZWN0XG4gICAgfSxcblxuICAgIGlzSW5WaWV3OiBmdW5jdGlvbiAoY2hpbGRFbCkge1xuICAgICAgdmFyIHZpZXdSZWN0ID0gdGhpcy5nZXRSZWN0KHRoaXMudmlld3BvcnQpXG4gICAgICB2YXIgY2hpbGRSZWN0ID0gdGhpcy5nZXRSZWN0KGNoaWxkRWwpXG4gICAgICBpZiAodGhpcy5heGlzID09PSAneScpIHtcbiAgICAgICAgcmV0dXJuIHZpZXdSZWN0LnRvcCA8IGNoaWxkUmVjdC5ib3R0b21cbiAgICAgICAgICAmJiB2aWV3UmVjdC5ib3R0b20gPiBjaGlsZFJlY3QudG9wXG4gICAgICB9XG4gICAgICByZXR1cm4gdmlld1JlY3QubGVmdCA8IGNoaWxkUmVjdC5yaWdodFxuICAgICAgICAmJiB2aWV3UmVjdC5yaWdodCA+IGNoaWxkUmVjdC5sZWZ0XG4gICAgfSxcblxuICAgIHNjcm9sbFRvOiBmdW5jdGlvbiAob2Zmc2V0LCBpc1Ntb290aCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudFxuXG4gICAgICBvZmZzZXQgPSAtb2Zmc2V0IC0gdGhpcy5vcHRpb25zW3RoaXMuYXhpcyArICdQYWRkaW5nVG9wJ11cbiAgICAgIG9mZnNldCA9IHRvdWNoQm91bmRhcnkodGhpcywgb2Zmc2V0KVxuXG4gICAgICBpc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIGlmIChpc1Ntb290aCA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgdmFyIHMwID0gZ2V0VHJhbnNmb3JtT2Zmc2V0KHRoYXQpW3RoaXMuYXhpc11cbiAgICAgICAgICB2YXIgX3MgPSBvZmZzZXQgLSBzMFxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG5ldyBsaWIuYW5pbWF0aW9uKFxuICAgICAgICAgICAgICA0MDAsXG4gICAgICAgICAgICAgIGxpYi5jdWJpY2Jlemllci5lYXNlSW5PdXQsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoczAgKyBfcyAqIGkyKS50b0ZpeGVkKDIpXG4gICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG4gICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbi5vbmVuZChzY3JvbGxFbmQpXG5cbiAgICAgICAgICBzY3JvbGxBbmltYXRpb24ucGxheSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkVuZEhhbmRsZXIoc2Nyb2xsRW5kLCA0MDApXG4gICAgICAgICAgc2V0VHJhbnNpdGlvblN0eWxlKHRoYXQsICcwLjRzJywgJ2Vhc2UtaW4tb3V0JylcbiAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG5cbiAgICAgICAgICBmdW5jdGlvbiBfY2FuY2VsU2Nyb2xsKCkge1xuICAgICAgICAgICAgaWYgKGlzU2Nyb2xsaW5nICYmIHRoYXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gICAgICAgICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKF9jYW5jZWxTY3JvbGwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGliLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWUoX2NhbmNlbFNjcm9sbClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uU3R5bGUodGhhdCwgJycsICcnKVxuICAgICAgICB9XG4gICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgc2Nyb2xsRW5kKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgc2Nyb2xsVG9FbGVtZW50OiBmdW5jdGlvbiAoY2hpbGRFbCwgaXNTbW9vdGgsIHRvcE9mZnNldCkge1xuICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0KGNoaWxkRWwpXG4gICAgICBvZmZzZXQgPSBvZmZzZXRbdGhpcy5heGlzID09PSAneSc/J3RvcCc6J2xlZnQnXVxuICAgICAgdG9wT2Zmc2V0ICYmIChvZmZzZXQgKz0gdG9wT2Zmc2V0KVxuICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG8ob2Zmc2V0LCBpc1Ntb290aClcbiAgICB9LFxuXG4gICAgZ2V0Vmlld1dpZHRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMudmlld3BvcnQpLndpZHRoXG4gICAgfSxcblxuICAgIGdldFZpZXdIZWlnaHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy52aWV3cG9ydCkuaGVpZ2h0XG4gICAgfSxcblxuICAgIGFkZFB1bGxkb3duSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3B1bGxkb3duZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5kaXNhYmxlKClcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoYXQsIGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGF0LnNjcm9sbFRvKDAsIHRydWUpXG4gICAgICAgICAgdGhhdC5yZWZyZXNoKClcbiAgICAgICAgICB0aGF0LmVuYWJsZSgpXG4gICAgICAgIH0pXG4gICAgICB9LCBmYWxzZSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgYWRkUHVsbHVwSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuXG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncHVsbHVwZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5kaXNhYmxlKClcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoYXQsIGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGF0LnNjcm9sbFRvKHRoYXQuZ2V0U2Nyb2xsSGVpZ2h0KCksIHRydWUpXG4gICAgICAgICAgdGhhdC5yZWZyZXNoKClcbiAgICAgICAgICB0aGF0LmVuYWJsZSgpXG4gICAgICAgIH0pXG4gICAgICB9LCBmYWxzZSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgYWRkU2Nyb2xsc3RhcnRIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBoYW5kbGVyLmNhbGwodGhhdCwgZSlcbiAgICAgIH0sIGZhbHNlKVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBhZGRTY3JvbGxpbmdIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsaW5nJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoYXQsIGUpXG4gICAgICB9LCBmYWxzZSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgYWRkU2Nyb2xsZW5kSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbGVuZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGF0LCBlKVxuICAgICAgfSwgZmFsc2UpXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIGFkZENvbnRlbnRyZW5mcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZW50cmVmcmVzaCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGF0LCBlKVxuICAgICAgfSwgZmFsc2UpXG4gICAgfSxcblxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGF0LCBlKVxuICAgICAgfSwgISF1c2VDYXB0dXJlKVxuICAgIH0sXG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBoYW5kbGVyLmNhbGwodGhhdCwgZSlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGVuYWJsZVBsdWdpbjogZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBwbHVnaW4gPSBwbHVnaW5zW25hbWVdXG4gICAgICBpZiAocGx1Z2luICYmICF0aGlzLnBsdWdpbnNbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zW25hbWVdID0gdHJ1ZVxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgICAgICBwbHVnaW4uY2FsbCh0aGlzLCBuYW1lLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBrIGluIHByb3RvKSB7XG4gICAgdGhpc1trXSA9IHByb3RvW2tdXG4gIH1cbiAgLy8gZGVsZXRlIHByb3RvXG59XG5cbmxpYi5zY3JvbGwgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgIShhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICBvcHRpb25zID0gYXJndW1lbnRzWzBdXG4gICAgaWYgKG9wdGlvbnMuc2Nyb2xsRWxlbWVudCkge1xuICAgICAgZWwgPSBvcHRpb25zLnNjcm9sbEVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2Nyb2xsV3JhcCkge1xuICAgICAgZWwgPSBvcHRpb25zLnNjcm9sbFdyYXAuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBzY3JvbGwgZWxlbWVudCcpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFlbC5wYXJlbnROb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBkb20gdHJlZScpXG4gIH1cbiAgaWYgKG9wdGlvbnNcbiAgICAgICYmIG9wdGlvbnMuZGlyZWN0aW9uXG4gICAgICAmJiBbJ3gnLCAneSddLmluZGV4T2Yob3B0aW9ucy5kaXJlY3Rpb24pIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignd3JvbmcgZGlyZWN0aW9uJylcbiAgfVxuXG4gIHZhciBzY3JvbGxcbiAgaWYgKG9wdGlvbnMuZG93bmdyYWRlID09PSB0cnVlXG4gICAgICAmJiBsaWIuc2Nyb2xsLmRvd25ncmFkZSkge1xuICAgIHNjcm9sbCA9IGxpYi5zY3JvbGwuZG93bmdyYWRlKGVsLCBvcHRpb25zKVxuICB9IGVsc2Uge1xuICAgIGlmIChlbC5zY3JvbGxJZCkge1xuICAgICAgc2Nyb2xsID0gc2Nyb2xsT2Jqc1tlbC5zY3JvbGxJZF1cbiAgICB9IGVsc2Uge1xuICAgICAgc2Nyb2xsID0gbmV3IFNjcm9sbChlbCwgb3B0aW9ucylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjcm9sbFxufVxuXG5saWIuc2Nyb2xsLnBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lLCBjb25zdHJ1Y3Rvcikge1xuICBpZiAoY29uc3RydWN0b3IpIHtcbiAgICBuYW1lID0gbmFtZS5zcGxpdCgnLCcpXG4gICAgbmFtZS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICBwbHVnaW5zW25dID0gY29uc3RydWN0b3JcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwbHVnaW5zW25hbWVdXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL3Njcm9sbGFibGUuY3NzJ1xuaW1wb3J0ICcuL3Njcm9sbCdcblxuLy8gbGliLnNjcm9sbCBldmVudHM6XG4vLyAgLSBzY3JvbGxzdGFydFxuLy8gIC0gc2Nyb2xsaW5nXG4vLyAgLSBwdWxsZG93bmVuZFxuLy8gIC0gcHVsbHVwZW5kXG4vLyAgLSBwdWxsbGVmdGVuZFxuLy8gIC0gcHVsbHJpZ2h0ZW5kXG4vLyAgLSBwdWxsZG93blxuLy8gIC0gcHVsbHVwXG4vLyAgLSBwdWxsbGVmdFxuLy8gIC0gcHVsbHJpZ2h0XG4vLyAgLSBjb250ZW50cmVmcmVzaFxuXG5jb25zdCBkaXJlY3Rpb25NYXAgPSB7XG4gIGg6IFsncm93JywgJ2hvcml6b250YWwnLCAnaCcsICd4J10sXG4gIHY6IFsnY29sdW1uJywgJ3ZlcnRpY2FsJywgJ3YnLCAneSddXG59XG5cbmNvbnN0IERFRkFVTFRfRElSRUNUSU9OID0gJ2NvbHVtbidcbmNvbnN0IERFRkFVTFRfTE9BRF9NT1JFX09GRlNFVCA9IDBcblxuZnVuY3Rpb24gcmVmcmVzaFdoZW5Eb21SZW5kZXJlbmQgKGNvbXApIHtcbiAgaWYgKCFjb21wLnJlbmRlcmVuZEhhbmRsZXIpIHtcbiAgICBjb21wLnJlbmRlcmVuZEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjb21wLnNjcm9sbGVyLnJlZnJlc2goKVxuICAgIH1cbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVuZGVyZW5kJywgY29tcC5yZW5kZXJlbmRIYW5kbGVyKVxufVxuXG5mdW5jdGlvbiByZW1vdmVFdmVudHMgKGNvbXApIHtcbiAgaWYgKGNvbXAucmVuZGVyZW5kSGFuZGxlcikge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBjb21wLnJlbmRlcmVuZEhhbmRsZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG8gKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcblxuICBmdW5jdGlvbiBjcmVhdGUgKG5vZGVUeXBlKSB7XG4gICAgY29uc3QgU2Nyb2xsID0gbGliLnNjcm9sbFxuICAgIGNvbnN0IG5vZGUgPSBDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZS5jYWxsKHRoaXMsIG5vZGVUeXBlKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsYWJsZS13cmFwJylcbiAgICB0aGlzLnNjcm9sbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgdGhpcy5zY3JvbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Njcm9sbGFibGUtZWxlbWVudCcpXG4gICAgdGhpcy5zY3JvbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpci0nICsgdGhpcy5kaXJlY3Rpb24pXG5cbiAgICB0aGlzLnNjcm9sbEVsZW1lbnQuc3R5bGUud2Via2l0Qm94T3JpZW50ID0gZGlyZWN0aW9uTWFwW3RoaXMuZGlyZWN0aW9uXVsxXVxuICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5zdHlsZS53ZWJraXRGbGV4RGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW3RoaXMuZGlyZWN0aW9uXVswXVxuICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW3RoaXMuZGlyZWN0aW9uXVswXVxuXG4gICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbEVsZW1lbnQpXG4gICAgdGhpcy5zY3JvbGxlciA9IG5ldyBTY3JvbGwoe1xuICAgICAgLy8gaWYgdGhlIGRpcmVjdGlvbiBpcyB4LCB0aGVuIHRoZSBib3VuZGluZyByZWN0IG9mIHRoZSBzY3JvbGwgZWxlbWVudFxuICAgICAgLy8gc2hvdWxkIGJlIGdvdCBieSB0aGUgJ1JhbmdlJyBBUEkgb3RoZXIgdGhhbiB0aGUgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCdcbiAgICAgIC8vIEFQSSwgYmVjYXVzZSB0aGUgd2lkdGggb3V0c2lkZSB0aGUgdmlld3BvcnQgd29uJ3QgYmUgY291bnQgaW4gYnlcbiAgICAgIC8vICdnZXRCb3VuZGluZ0NsaWVudFJlY3QnLlxuICAgICAgLy8gT3RoZXJ3aXNlIHNob3VsZCB1c2UgdGhlIGVsZW1lbnQgcmVjdCBpbiBjYXNlIHRoZXJlIGlzIGEgY2hpbGQgc2Nyb2xsZXJcbiAgICAgIC8vIG9yIGxpc3QgaW4gdGhpcyBzY3JvbGxlci4gSWYgdXNpbmcgJ1JhbmdlJywgdGhlIHdob2xlIHNjcm9sbCBlbGVtZW50XG4gICAgICAvLyBpbmNsdWRpbmcgdGhlIGhpZGluZyBwYXJ0IHdpbGwgYmUgY291bnQgaW4gdGhlIHJlY3QuXG4gICAgICB1c2VFbGVtZW50UmVjdDogdGhpcy5kaXJlY3Rpb24gPT09ICd2JyxcbiAgICAgIHNjcm9sbEVsZW1lbnQ6IHRoaXMuc2Nyb2xsRWxlbWVudCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24gPT09ICdoJyA/ICd4JyA6ICd5J1xuICAgIH0pXG4gICAgdGhpcy5zY3JvbGxlci5pbml0KClcbiAgICB0aGlzLm9mZnNldCA9IDBcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGRyZW4gKCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgY29uc3QgcGFyZW50UmVmID0gdGhpcy5kYXRhLnJlZlxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICBsZXQgaXNGbGV4ID0gZmFsc2VcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2hpbGRyZW5baV0uaW5zdGFuY2VJZCA9IHRoaXMuZGF0YS5pbnN0YW5jZUlkXG4gICAgICAgIGNvbnN0IGNoaWxkID0gY29tcG9uZW50TWFuYWdlci5jcmVhdGVFbGVtZW50KGNoaWxkcmVuW2ldKVxuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjaGlsZC5ub2RlKVxuICAgICAgICBjaGlsZC5wYXJlbnRSZWYgPSBwYXJlbnRSZWZcbiAgICAgICAgaWYgKCFpc0ZsZXhcbiAgICAgICAgICAgICYmIGNoaWxkLmRhdGEuc3R5bGVcbiAgICAgICAgICAgICYmIGNoaWxkLmRhdGEuc3R5bGUuaGFzT3duUHJvcGVydHkoJ2ZsZXgnKVxuICAgICAgICAgICkge1xuICAgICAgICAgIGlzRmxleCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zY3JvbGxFbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KVxuICAgIH1cbiAgICAvLyB3YWl0IGZvciBmcmFnbWVudCB0byBhcHBlbmRlZCBvbiBzY3JvbGxFbGVtZW50IG9uIFVJIHRocmVhZC5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXIucmVmcmVzaCgpXG4gICAgfS5iaW5kKHRoaXMpLCAwKVxuICB9XG5cbiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGQgKGRhdGEpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGNvbnN0IGNoaWxkID0gY29tcG9uZW50TWFuYWdlci5jcmVhdGVFbGVtZW50KGRhdGEpXG4gICAgdGhpcy5zY3JvbGxFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG5cbiAgICAvLyB3YWl0IGZvciBVSSB0aHJlYWQgdG8gdXBkYXRlLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zY3JvbGxlci5yZWZyZXNoKClcbiAgICB9LmJpbmQodGhpcyksIDApXG5cbiAgICAvLyB1cGRhdGUgdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRhdGEuY2hpbGRyZW4gPSBbZGF0YV1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkXG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKGNoaWxkLCBiZWZvcmUpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGxldCBpID0gMFxuICAgIGxldCBpc0FwcGVuZCA9IGZhbHNlXG5cbiAgICAvLyB1cGRhdGUgdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8ICFiZWZvcmUpIHtcbiAgICAgIGlzQXBwZW5kID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gYmVmb3JlLmRhdGEucmVmKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IGwpIHtcbiAgICAgICAgaXNBcHBlbmQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQXBwZW5kKSB7XG4gICAgICB0aGlzLnNjcm9sbEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQuZGF0YSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCByZWZyZXNoTG9hZGluZ1BsYWNlaG9sZGVyID0gYmVmb3JlLnJlZnJlc2hQbGFjZWhvbGRlclxuICAgICAgICB8fCBiZWZvcmUubG9hZGluZ1BsYWNlaG9sZGVyXG4gICAgICBpZiAocmVmcmVzaExvYWRpbmdQbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLm5vZGUsIHJlZnJlc2hMb2FkaW5nUGxhY2Vob2xkZXIpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChiZWZvcmUuZml4ZWRQbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLm5vZGUsIGJlZm9yZS5maXhlZFBsYWNlaG9sZGVyKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYmVmb3JlLnN0aWNreVBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLm5vZGUpXG4gICAgICB9XG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMCwgY2hpbGQuZGF0YSlcbiAgICB9XG5cbiAgICAvLyB3YWl0IGZvciBVSSB0aHJlYWQgdG8gdXBkYXRlLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zY3JvbGxlci5yZWZyZXNoKClcbiAgICB9LmJpbmQodGhpcyksIDApXG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVDaGlsZCAoY2hpbGQpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIC8vIHJlbW92ZSBmcm9tIHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGxldCBpID0gMFxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gY2hpbGQuZGF0YS5yZWYpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGwpIHtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudE1hcCByZWN1cnNpdmVseVxuICAgIGNvbXBvbmVudE1hbmFnZXIucmVtb3ZlQ29tcG9uZW50KGNoaWxkLmRhdGEucmVmKVxuICAgIGNvbnN0IHJlZnJlc2hMb2FkaW5nUGxhY2Vob2xkZXIgPSBjaGlsZC5yZWZyZXNoUGxhY2Vob2xkZXJcbiAgICAgIHx8IGNoaWxkLmxvYWRpbmdQbGFjZWhvbGRlclxuICAgIGNoaWxkLnVuc2V0UG9zaXRpb24oKVxuICAgIGlmIChyZWZyZXNoTG9hZGluZ1BsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnNjcm9sbEVsZW1lbnQucmVtb3ZlQ2hpbGQocmVmcmVzaExvYWRpbmdQbGFjZWhvbGRlcilcbiAgICB9XG4gICAgY2hpbGQubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkLm5vZGUpXG5cbiAgICAvLyB3YWl0IGZvciBVSSB0aHJlYWQgdG8gdXBkYXRlLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zY3JvbGxlci5yZWZyZXNoKClcbiAgICB9LmJpbmQodGhpcyksIDApXG4gIH1cblxuICBmdW5jdGlvbiBiaW5kRXZlbnRzIChldnRzKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5iaW5kRXZlbnRzLmNhbGwodGhpcywgZXZ0cylcbiAgICAvLyB0byBlbmFibGUgbGF6eWxvYWQgZm9yIEltYWdlc1xuICAgIHRoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsaW5nJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnN0IHNvID0gZS5zY3JvbGxPYmpcbiAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHNvLmdldFNjcm9sbFRvcCgpXG4gICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gc28uZ2V0U2Nyb2xsTGVmdCgpXG4gICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmRpcmVjdGlvbiA9PT0gJ3YnID8gc2Nyb2xsVG9wIDogc2Nyb2xsTGVmdFxuICAgICAgY29uc3QgZGlmZiA9IG9mZnNldCAtIHRoaXMub2Zmc2V0XG4gICAgICBsZXQgZGlyXG4gICAgICBpZiAoZGlmZiA+PSAwKSB7XG4gICAgICAgIGRpciA9IHRoaXMuZGlyZWN0aW9uID09PSAndicgPyAndXAnIDogJ2xlZnQnXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZGlyID0gdGhpcy5kaXJlY3Rpb24gPT09ICd2JyA/ICdkb3duJyA6ICdyaWdodCdcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc2Nyb2xsJywge1xuICAgICAgICBvcmlnaW5hbFR5cGU6ICdzY3JvbGxpbmcnLFxuICAgICAgICBzY3JvbGxUb3A6IHNvLmdldFNjcm9sbFRvcCgpLFxuICAgICAgICBzY3JvbGxMZWZ0OiBzby5nZXRTY3JvbGxMZWZ0KCksXG4gICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICBkaXJlY3Rpb246IGRpclxuICAgICAgfSwge1xuICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICB9KVxuICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXRcblxuICAgICAgLy8gZmlyZSBsb2FkbW9yZSBldmVudC5cbiAgICAgIGNvbnN0IGxlZnREaXN0ID0gTWF0aC5hYnMoc28ubWF4U2Nyb2xsT2Zmc2V0KSAtIHRoaXMub2Zmc2V0XG4gICAgICBpZiAobGVmdERpc3QgPD0gdGhpcy5sb2FkbW9yZW9mZnNldCAmJiB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUpIHtcbiAgICAgICAgdGhpcy5pc0F2YWlsYWJsZVRvRmlyZWxvYWRtb3JlID0gZmFsc2VcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdsb2FkbW9yZScpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZWZ0RGlzdCA+IHRoaXMubG9hZG1vcmVvZmZzZXQgJiYgIXRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSkge1xuICAgICAgICB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUgPSB0cnVlXG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpKVxuICB9XG5cbiAgZnVuY3Rpb24gb25BcHBlbmQgKCkge1xuICAgIHJlZnJlc2hXaGVuRG9tUmVuZGVyZW5kKHRoaXMpXG4gIH1cblxuICBmdW5jdGlvbiBvblJlbW92ZSAoKSB7XG4gICAgcmVtb3ZlRXZlbnRzKHRoaXMpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZSxcbiAgICBjcmVhdGVDaGlsZHJlbixcbiAgICBhcHBlbmRDaGlsZCxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgcmVtb3ZlQ2hpbGQsXG4gICAgYmluZEV2ZW50cyxcbiAgICBvbkFwcGVuZCxcbiAgICBvblJlbW92ZVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGxvYWRtb3Jlb2Zmc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKHZhbCA8IDAgfHwgaXNOYU4odmFsKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbaDUtcmVuZGVyXSBpbnZhbGlkYScpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5sb2FkbW9yZW9mZnNldCA9IHZhbFxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gIC0gbG9hZG1vcmVvZmZzZXQ6IHVwZGF0YWJsZVxuICAvLyAgLSBzY3JvbGwtZGlyZWNpdG9uOiBub25lfHZlcnRpY2FsfGhvcml6b250YWwgKGRlZmF1bHQgaXMgdmVydGljYWwpXG4gIC8vICAtIHNob3ctc2Nyb2xsYmFyOiB0cnVlfGZhbHNlIChkZWZhdWx0IGlzIHRydWUpXG4gIGZ1bmN0aW9uIFNjcm9sbGFibGUgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgdGhpcy5sb2FkbW9yZW9mZnNldCA9IERFRkFVTFRfTE9BRF9NT1JFX09GRlNFVFxuICAgIHRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSA9IHRydWVcbiAgICBjb25zdCBhdHRycyA9IGRhdGEuYXR0ciB8fCB7fVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGF0dHJzLnNjcm9sbERpcmVjdGlvblxuICAgICAgfHwgYXR0cnMuZGlyZWN0aW9uXG4gICAgICB8fCBERUZBVUxUX0RJUkVDVElPTlxuICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwLmguaW5kZXhPZihkaXJlY3Rpb24pID09PSAtMVxuICAgICAgPyAndidcbiAgICAgIDogJ2gnXG4gICAgdGhpcy5zaG93U2Nyb2xsYmFyID0gYXR0cnMuc2hvd1Njcm9sbGJhciB8fCB0cnVlXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSwgbm9kZVR5cGUpXG4gIH1cbiAgU2Nyb2xsYWJsZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChTY3JvbGxhYmxlLnByb3RvdHlwZSwgZ2V0UHJvdG8oV2VleCkpXG4gIGV4dGVuZChTY3JvbGxhYmxlLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIHJldHVybiBTY3JvbGxhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgc2Nyb2xsYWJsZU1vZHVsZSBmcm9tICcuLi9zY3JvbGxhYmxlJ1xuXG5jb25zdCBhdmFpbGFibGVDaGlsZHJlblR5cGVzID0gWydjZWxsJywgJ2xvYWRpbmcnLCAncmVmcmVzaCddXG5cbmZ1bmN0aW9uIGdldFByb3RvIChTY3JvbGxhYmxlKSB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlICgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBTY3JvbGxhYmxlLnByb3RvdHlwZS5jcmVhdGUuY2FsbCh0aGlzKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdsaXN0LXdyYXAnKVxuICAgICAgdGhpcy5zY3JvbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QtZWxlbWVudCcpXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH0sXG5cbiAgICBjcmVhdGVDaGlsZHJlbiAoKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlbiB8fCBbXVxuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBjb25zdCB0eXBlID0gZGF0YS50eXBlXG4gICAgICAgIGlmIChhdmFpbGFibGVDaGlsZHJlblR5cGVzLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKCdbaDUtcmVuZGVyXSBpbnZhbGlkIGNoaWxkIHR5cGUgXCInXG4gICAgICAgICAgLy8gICArIHR5cGUgKyAnXCIgZm9yIGxpc3QuJylcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1toNS1yZW5kZXJdIGludmFsaWQgY2hpbGQgdHlwZSBcIidcbiAgICAgICAgICAgICsgdHlwZSArICdcIiBmb3IgbGlzdC4nKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIFNjcm9sbGFibGUucHJvdG90eXBlLmNyZWF0ZUNoaWxkcmVuLmNhbGwodGhpcylcbiAgICB9LFxuXG4gICAgYXBwZW5kQ2hpbGQgKGRhdGEpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBkYXRhLnR5cGVcbiAgICAgIGlmIChhdmFpbGFibGVDaGlsZHJlblR5cGVzLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgICAgIC8vIHRocm93IG5ldyBFcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBjaGlsZCB0eXBlIFwiJ1xuICAgICAgICAvLyAgICsgdHlwZSArICdcIiBmb3IgbGlzdC4nKVxuICAgICAgICBjb25zb2xlLndhcm4oJ1toNS1yZW5kZXJdIGludmFsaWQgY2hpbGQgdHlwZSBcIidcbiAgICAgICAgICArIHR5cGUgKyAnXCIgZm9yIGxpc3QuJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY3JvbGxhYmxlLnByb3RvdHlwZS5hcHBlbmRDaGlsZC5jYWxsKHRoaXMsIGRhdGEpXG4gICAgfSxcblxuICAgIGluc2VydEJlZm9yZSAoY2hpbGQsIGJlZm9yZSkge1xuICAgICAgY29uc3QgdHlwZSA9IGNoaWxkLmRhdGEudHlwZVxuICAgICAgaWYgKGF2YWlsYWJsZUNoaWxkcmVuVHlwZXMuaW5kZXhPZih0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKCdbaDUtcmVuZGVyXSBpbnZhbGlkIGNoaWxkIHR5cGUgXCInXG4gICAgICAgIC8vICAgKyB0eXBlICsgJ1wiIGZvciBsaXN0LicpXG4gICAgICAgIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gaW52YWxpZCBjaGlsZCB0eXBlIFwiJ1xuICAgICAgICAgICsgdHlwZSArICdcIiBmb3IgbGlzdC4nKVxuICAgICAgfVxuICAgICAgcmV0dXJuIFNjcm9sbGFibGUucHJvdG90eXBlLmluc2VydEJlZm9yZS5jYWxsKHRoaXMsIGNoaWxkLCBiZWZvcmUpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgU2Nyb2xsYWJsZSA9IHNjcm9sbGFibGVNb2R1bGUuaW5pdChXZWV4KVxuICBmdW5jdGlvbiBMaXN0IChkYXRhLCBub2RlVHlwZSkge1xuICAgIFNjcm9sbGFibGUuY2FsbCh0aGlzLCBkYXRhLCBub2RlVHlwZSlcbiAgfVxuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIExpc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTY3JvbGxhYmxlLnByb3RvdHlwZSlcbiAgZXh0ZW5kKExpc3QucHJvdG90eXBlLCBnZXRQcm90byhTY3JvbGxhYmxlKSlcblxuICByZXR1cm4gTGlzdFxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IGxpc3RNb2R1bGUgZnJvbSAnLi9saXN0J1xuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IExpc3QgPSBsaXN0TW9kdWxlLmluaXQoV2VleClcblxuICBmdW5jdGlvbiBWbGlzdCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBkYXRhLmF0dHIuZGlyZWN0aW9uID0gJ3YnXG4gICAgTGlzdC5jYWxsKHRoaXMsIGRhdGEsIG5vZGVUeXBlKVxuICB9XG4gIFZsaXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGlzdC5wcm90b3R5cGUpXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnbGlzdCcsIFZsaXN0KVxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd2bGlzdCcsIFZsaXN0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IGxpc3RNb2R1bGUgZnJvbSAnLi9saXN0J1xuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IExpc3QgPSBsaXN0TW9kdWxlLmluaXQoV2VleClcblxuICBmdW5jdGlvbiBIbGlzdCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBkYXRhLmF0dHIuZGlyZWN0aW9uID0gJ2gnXG4gICAgTGlzdC5jYWxsKHRoaXMsIGRhdGEsIG5vZGVUeXBlKVxuICB9XG5cbiAgSGxpc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMaXN0LnByb3RvdHlwZSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdobGlzdCcsIEhsaXN0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFZsaXN0IGZyb20gJy4vdmxpc3QnXG5pbXBvcnQgSGxpc3QgZnJvbSAnLi9obGlzdCdcblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBXZWV4Lmluc3RhbGwoVmxpc3QpXG4gIFdlZXguaW5zdGFsbChIbGlzdClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBzY3JvbGxhYmxlTW9kdWxlIGZyb20gJy4uL3Njcm9sbGFibGUnXG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgU2Nyb2xsYWJsZSA9IHNjcm9sbGFibGVNb2R1bGUuaW5pdChXZWV4KVxuICBmdW5jdGlvbiBTY3JvbGxlciAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBTY3JvbGxhYmxlLmNhbGwodGhpcywgZGF0YSwgbm9kZVR5cGUpXG4gIH1cbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICBTY3JvbGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNjcm9sbGFibGUucHJvdG90eXBlKVxuICBleHRlbmQoU2Nyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgY3JlYXRlICgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBTY3JvbGxhYmxlLnByb3RvdHlwZS5jcmVhdGUuY2FsbCh0aGlzKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdzY3JvbGxlci13cmFwJylcbiAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzY3JvbGxlci1lbGVtZW50JylcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuICB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3Njcm9sbGVyJywgU2Nyb2xsZXIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgJy4vcmVmcmVzaC5jc3MnXG5cbmNvbnN0IHBhcmVudHMgPSBbJ3Njcm9sbGVyJywgJ2xpc3QnLCAndmxpc3QnXVxuXG4vLyBPbmx5IGlmIHB1bGxkb3duIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlIGNhbiB0aGlzXG4vLyBjb21wb25lbnQgdHJpZ2dlciB0aGUgJ3JlZnJlc2gnIGV2ZW50LCBvdGhlcndpc2UganVzdCByZWNvdmVyXG4vLyB0byB0aGUgc3RhcnQgcG9pbnQuXG5jb25zdCBERUZBVUxUX0NMQU1QID0gMTMwXG5jb25zdCBERUZBVUxUX0FMSUdOX0lURU1TID0gJ2NlbnRlcidcbmNvbnN0IERFRkFVTFRfSlVTVElGWV9DT05URU5UID0gJ2NlbnRlcidcblxuZnVuY3Rpb24gYWRqdXN0SGVpZ2h0IChyZWZyZXNoLCB2YWwpIHtcbiAgcmVmcmVzaC5ub2RlLnN0eWxlLmhlaWdodCA9IHZhbCArICdweCdcbn1cblxuLy8gZnVuY3Rpb24gYWRKdXN0UG9zaXRpb24gKHJlZnJlc2gsIHZhbCkge1xuLy8gICByZWZyZXNoLm5vZGUuc3R5bGUudG9wID0gLXZhbCArICdweCdcbi8vIH1cblxuZnVuY3Rpb24gaGFuZGxlUmVmcmVzaCAocmVmcmVzaCwgZSkge1xuICByZWZyZXNoLm5vZGUuc3R5bGUuaGVpZ2h0ID0gcmVmcmVzaC5jbGFtcCArICdweCdcbiAgcmVmcmVzaC5kaXNwYXRjaEV2ZW50KCdyZWZyZXNoJylcbiAgcmVmcmVzaC5pc1JlZnJlc2hpbmcgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIHNob3cgKHJlZnJlc2gpIHtcbiAgcmVmcmVzaC5kaXNwbGF5ID0gdHJ1ZVxuICByZWZyZXNoLm5vZGUuc3R5bGUuZGlzcGxheSA9ICctd2Via2l0LWJveCdcbiAgcmVmcmVzaC5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnLXdlYmtpdC1mbGV4J1xuICByZWZyZXNoLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xufVxuXG5mdW5jdGlvbiBoaWRlIChyZWZyZXNoKSB7XG4gIHJlZnJlc2guZGlzcGxheSA9IGZhbHNlXG4gIHJlZnJlc2gubm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gIHJlZnJlc2guaXNSZWZyZXNoaW5nID0gZmFsc2Vcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LXJlZnJlc2gnKVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgb25BcHBlbmQgKCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KClcbiAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgIGlmIChwYXJlbnRzLmluZGV4T2YocGFyZW50LmRhdGEudHlwZSkgPT09IC0xKSB7XG4gICAgICAvLyBub3QgaW4gYSBzY3JvbGxlciBvciBhIGxpc3RcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hQbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGhpcy5yZWZyZXNoUGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCgnd2VleC1yZWZyZXNoLXBsYWNlaG9sZGVyJylcbiAgICB0aGlzLnJlZnJlc2hQbGFjZWhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgdGhpcy5yZWZyZXNoUGxhY2Vob2xkZXIuc3R5bGUud2lkdGggPSAnMHB4J1xuICAgIHRoaXMucmVmcmVzaFBsYWNlaG9sZGVyLnN0eWxlLmhlaWdodCA9ICcwcHgnXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHBhcmVudC5zY3JvbGxFbGVtZW50IHx8IHBhcmVudC5saXN0RWxlbWVudFxuICAgIHNjcm9sbEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMucmVmcmVzaFBsYWNlaG9sZGVyLCB0aGlzLm5vZGUpXG4gICAgcGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKVxuICAgIHBhcmVudC5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCdwdWxsZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoc2VsZi5pc1JlZnJlc2hpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBhZGp1c3RIZWlnaHQoc2VsZiwgTWF0aC5hYnMoZS5zY3JvbGxPYmouZ2V0U2Nyb2xsVG9wKCkpKVxuICAgICAgaWYgKCFzZWxmLmRpc3BsYXkpIHtcbiAgICAgICAgc2hvdyhzZWxmKVxuICAgICAgfVxuICAgIH0pXG4gICAgcGFyZW50LnNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3B1bGxkb3duZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChzZWxmLmlzUmVmcmVzaGluZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvcCA9IE1hdGguYWJzKGUuc2Nyb2xsT2JqLmdldFNjcm9sbFRvcCgpKVxuICAgICAgaWYgKHRvcCA+IHNlbGYuY2xhbXApIHtcbiAgICAgICAgaGFuZGxlUmVmcmVzaChzZWxmLCBlKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGhpZGUoc2VsZilcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGRpc3BsYXk6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAodmFsID09PSAnc2hvdycpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzaG93KHRoaXMpXG4gICAgICB9LmJpbmQodGhpcyksIDApXG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbCA9PT0gJ2hpZGUnKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaGlkZSh0aGlzKVxuICAgICAgfS5iaW5kKHRoaXMpLCAwKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIGF0dHIgXFwnZGlzcGxheVxcJyBvZiA8cmVmcmVzaD5cXCc6IHZhbHVlICdcbiAgICAgICAgKyB2YWxcbiAgICAgICAgKyAnIGlzIGludmFsaWQuIFNob3VsZCBiZSBcXCdzaG93XFwnIG9yIFxcJ2hpZGVcXCcnKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBzdHlsZSA9IHtcbiAgaGVpZ2h0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKGlzTmFOKHZhbCkgfHwgdmFsIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gPHJlZnJlc2g+XFwncyBoZWlnaHQgKCcgKyB2YWwgKyAnKSBpcyBpbnZhbGlkLicpXG4gICAgfVxuICAgIHRoaXMuY2xhbXAgPSB2YWxcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gUmVmcmVzaCAoZGF0YSkge1xuICAgIHRoaXMuaXNSZWZyZXNoaW5nID0gZmFsc2VcbiAgICB0aGlzLmNsYW1wID0gZGF0YS5zdHlsZS5oZWlnaHQgfHwgREVGQVVMVF9DTEFNUFxuICAgICFkYXRhLnN0eWxlLmFsaWduSXRlbXMgJiYgKGRhdGEuc3R5bGUuYWxpZ25JdGVtcyA9IERFRkFVTFRfQUxJR05fSVRFTVMpXG4gICAgIWRhdGEuc3R5bGUuanVzdGlmeUNvbnRlbnRcbiAgICAgICYmIChkYXRhLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gREVGQVVMVF9KVVNUSUZZX0NPTlRFTlQpXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBSZWZyZXNoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tcG9uZW50LnByb3RvdHlwZSlcbiAgZXh0ZW5kKFJlZnJlc2gucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKFJlZnJlc2gucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKFJlZnJlc2gucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdyZWZyZXNoJywgUmVmcmVzaClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL2xvYWRpbmcuY3NzJ1xuXG5jb25zdCBwYXJlbnRzID0gWydzY3JvbGxlcicsICdsaXN0JywgJ3ZsaXN0J11cblxuY29uc3QgREVGQVVMVF9DTEFNUCA9IDEzMFxuY29uc3QgREVGQVVMVF9BTElHTl9JVEVNUyA9ICdjZW50ZXInXG5jb25zdCBERUZBVUxUX0pVU1RJRllfQ09OVEVOVCA9ICdjZW50ZXInXG5cbmZ1bmN0aW9uIGFkanVzdEhlaWdodCAobG9hZGluZywgdmFsKSB7XG4gIGxvYWRpbmcubm9kZS5zdHlsZS5oZWlnaHQgPSB2YWwgKyAncHgnXG59XG5cbmZ1bmN0aW9uIGhhbmRsZUxvYWRpbmcgKGxvYWRpbmcsIGUpIHtcbiAgbG9hZGluZy5ub2RlLnN0eWxlLmhlaWdodCA9IGxvYWRpbmcuY2xhbXAgKyAncHgnXG4gIGxvYWRpbmcuZGlzcGF0Y2hFdmVudCgnbG9hZGluZycpXG4gIGxvYWRpbmcuaXNMb2FkaW5nID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzaG93IChsb2FkaW5nKSB7XG4gIGxvYWRpbmcuZGlzcGxheSA9IHRydWVcbiAgbG9hZGluZy5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnLXdlYmtpdC1ib3gnXG4gIGxvYWRpbmcubm9kZS5zdHlsZS5kaXNwbGF5ID0gJy13ZWJraXQtZmxleCdcbiAgbG9hZGluZy5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcbn1cblxuZnVuY3Rpb24gaGlkZSAobG9hZGluZykge1xuICBsb2FkaW5nLmRpc3BsYXkgPSBmYWxzZVxuICBsb2FkaW5nLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICBsb2FkaW5nLmlzTG9hZGluZyA9IGZhbHNlXG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1sb2FkaW5nJylcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIG9uQXBwZW5kICgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpXG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBjb25zdCBzY3JvbGxXcmFwSGVpZ2h0ID0gcGFyZW50Lm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgaWYgKHBhcmVudHMuaW5kZXhPZihwYXJlbnQuZGF0YS50eXBlKSA9PT0gLTEpIHtcbiAgICAgIC8vIG5vdCBpbiBhIHNjcm9sbGVyIG9yIGEgbGlzdFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMubG9hZGluZ1BsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLmxvYWRpbmdQbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCd3ZWV4LWxvYWRpbmctcGxhY2Vob2xkZXInKVxuICAgIHRoaXMubG9hZGluZ1BsYWNlaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICB0aGlzLmxvYWRpbmdQbGFjZWhvbGRlci5zdHlsZS53aWR0aCA9ICcwcHgnXG4gICAgdGhpcy5sb2FkaW5nUGxhY2Vob2xkZXIuc3R5bGUuaGVpZ2h0ID0gJzBweCdcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gcGFyZW50LnNjcm9sbEVsZW1lbnQgfHwgcGFyZW50Lmxpc3RFbGVtZW50XG4gICAgc2Nyb2xsRWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5sb2FkaW5nUGxhY2Vob2xkZXIsIHRoaXMubm9kZSlcbiAgICBwYXJlbnQubm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpXG4gICAgcGFyZW50LnNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3B1bGx1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoc2VsZi5pc0xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBvYmogPSBlLnNjcm9sbE9ialxuICAgICAgYWRqdXN0SGVpZ2h0KHNlbGYsIE1hdGguYWJzKFxuICAgICAgICBvYmouZ2V0U2Nyb2xsSGVpZ2h0KCkgLSBvYmouZ2V0U2Nyb2xsVG9wKCkgLSBzY3JvbGxXcmFwSGVpZ2h0KSlcbiAgICAgIGlmICghc2VsZi5kaXNwbGF5KSB7XG4gICAgICAgIHNob3coc2VsZilcbiAgICAgIH1cbiAgICB9KVxuICAgIHBhcmVudC5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCdwdWxsdXBlbmQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHNlbGYuaXNMb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaGFuZGxlTG9hZGluZyhzZWxmLCBlKVxuICAgIH0pXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgZGlzcGxheTogZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICh2YWwgPT09ICdzaG93Jykge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3codGhpcylcbiAgICAgIH0uYmluZCh0aGlzKSwgMClcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsID09PSAnaGlkZScpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBoaWRlKHRoaXMpXG4gICAgICB9LmJpbmQodGhpcyksIDApXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gYXR0ciBcXCdkaXNwbGF5XFwnIG9mIDxyZWZyZXNoPlxcJzogdmFsdWUgJ1xuICAgICAgICArIHZhbFxuICAgICAgICArICcgaXMgaW52YWxpZC4gU2hvdWxkIGJlIFxcJ3Nob3dcXCcgb3IgXFwnaGlkZVxcJycpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICBoZWlnaHQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbCkgfHwgdmFsIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gPGxvYWRpbmc+XFwncyBoZWlnaHQgKCcgKyB2YWwgKyAnKSBpcyBpbnZhbGlkLicpXG4gICAgfVxuICAgIHRoaXMuY2xhbXAgPSB2YWxcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gTG9hZGluZyAoZGF0YSkge1xuICAgIHRoaXMuY2xhbXAgPSAoZGF0YS5zdHlsZS5oZWlnaHQgfHwgREVGQVVMVF9DTEFNUClcbiAgICAhZGF0YS5zdHlsZS5hbGlnbkl0ZW1zICYmIChkYXRhLnN0eWxlLmFsaWduSXRlbXMgPSBERUZBVUxUX0FMSUdOX0lURU1TKVxuICAgICFkYXRhLnN0eWxlLmp1c3RpZnlDb250ZW50XG4gICAgICAmJiAoZGF0YS5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IERFRkFVTFRfSlVTVElGWV9DT05URU5UKVxuICAgIENvbXBvbmVudC5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgTG9hZGluZy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChMb2FkaW5nLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChMb2FkaW5nLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChMb2FkaW5nLnByb3RvdHlwZSwge1xuICAgIHN0eWxlOiBleHRlbmQoT2JqZWN0LmNyZWF0ZShDb21wb25lbnQucHJvdG90eXBlLnN0eWxlKSwgc3R5bGUpXG4gIH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnbG9hZGluZycsIExvYWRpbmcpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgbGlzdCBmcm9tICcuL2xpc3QnXG5pbXBvcnQgc2Nyb2xsZXIgZnJvbSAnLi9zY3JvbGxlcidcbmltcG9ydCByZWZyZXNoIGZyb20gJy4vcmVmcmVzaCdcbmltcG9ydCBsb2FkaW5nIGZyb20gJy4vbG9hZGluZydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXguaW5zdGFsbChsaXN0KVxuICAgIFdlZXguaW5zdGFsbChzY3JvbGxlcilcbiAgICBXZWV4Lmluc3RhbGwocmVmcmVzaClcbiAgICBXZWV4Lmluc3RhbGwobG9hZGluZylcbiAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuIiwiKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSAmJiAod2luZG93ID0ge2N0cmw6IHt9LCBsaWI6IHt9fSk7IXdpbmRvdy5jdHJsICYmICh3aW5kb3cuY3RybCA9IHt9KTshd2luZG93LmxpYiAmJiAod2luZG93LmxpYiA9IHt9KTshZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYixjLGQpe2Z1bmN0aW9uIGUoYSl7cmV0dXJuKDMqayphKzIqbCkqYSttfWZ1bmN0aW9uIGYoYSl7cmV0dXJuKChrKmErbCkqYSttKSphfWZ1bmN0aW9uIGcoYSl7cmV0dXJuKChuKmErbykqYStwKSphfWZ1bmN0aW9uIGgoYSl7Zm9yKHZhciBiLGMsZD1hLGc9MDs4Pmc7ZysrKXtpZihjPWYoZCktYSxNYXRoLmFicyhjKTxqKXJldHVybiBkO2lmKGI9ZShkKSxNYXRoLmFicyhiKTxqKWJyZWFrO2QtPWMvYn12YXIgaD0xLGk9MDtmb3IoZD1hO2g+aTspe2lmKGM9ZihkKS1hLE1hdGguYWJzKGMpPGopcmV0dXJuIGQ7Yz4wP2g9ZDppPWQsZD0oaCtpKS8yfXJldHVybiBkfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGcoaChhKSl9dmFyIGo9MWUtNixrPTMqYS0zKmMrMSxsPTMqYy02KmEsbT0zKmEsbj0zKmItMypkKzEsbz0zKmQtNipiLHA9MypiO3JldHVybiBpfWIuY3ViaWNiZXppZXI9YyxiLmN1YmljYmV6aWVyLmxpbmVhcj1jKDAsMCwxLDEpLGIuY3ViaWNiZXppZXIuZWFzZT1jKC4yNSwuMSwuMjUsMSksYi5jdWJpY2Jlemllci5lYXNlSW49YyguNDIsMCwxLDEpLGIuY3ViaWNiZXppZXIuZWFzZU91dD1jKDAsMCwuNTgsMSksYi5jdWJpY2Jlemllci5lYXNlSW5PdXQ9YyguNDIsMCwuNTgsMSl9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpOzttb2R1bGUuZXhwb3J0cyA9IHdpbmRvdy5saWJbJ2N1YmljYmV6aWVyJ107IiwiKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSAmJiAod2luZG93ID0ge2N0cmw6IHt9LCBsaWI6IHt9fSk7IXdpbmRvdy5jdHJsICYmICh3aW5kb3cuY3RybCA9IHt9KTshd2luZG93LmxpYiAmJiAod2luZG93LmxpYiA9IHt9KTshZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBzZXRUaW1lb3V0KGEsbCl9ZnVuY3Rpb24gZChhKXtjbGVhclRpbWVvdXQoYSl9ZnVuY3Rpb24gZSgpe3ZhciBhPXt9LGI9bmV3IG0oZnVuY3Rpb24oYixjKXthLnJlc29sdmU9YixhLnJlamVjdD1jfSk7cmV0dXJuIGEucHJvbWlzZT1iLGF9ZnVuY3Rpb24gZihhLGIpe3JldHVybltcInRoZW5cIixcImNhdGNoXCJdLmZvckVhY2goZnVuY3Rpb24oYyl7YltjXT1mdW5jdGlvbigpe3JldHVybiBhW2NdLmFwcGx5KGEsYXJndW1lbnRzKX19KSxifWZ1bmN0aW9uIGcoYil7dmFyIGMsZCxoPSExO3RoaXMucmVxdWVzdD1mdW5jdGlvbigpe2g9ITE7dmFyIGc9YXJndW1lbnRzO3JldHVybiBjPWUoKSxmKGMucHJvbWlzZSx0aGlzKSxkPW4oZnVuY3Rpb24oKXtofHxjJiZjLnJlc29sdmUoYi5hcHBseShhLGcpKX0pLHRoaXN9LHRoaXMuY2FuY2VsPWZ1bmN0aW9uKCl7cmV0dXJuIGQmJihoPSEwLG8oZCksYyYmYy5yZWplY3QoXCJDQU5DRUxcIikpLHRoaXN9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGcoYil9fWZ1bmN0aW9uIGgoYSxiKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBiJiYoYj17MDpifSk7Zm9yKHZhciBjPWEvbCxkPTEvYyxlPVtdLGY9T2JqZWN0LmtleXMoYikubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUludChhKX0pLGg9MDtjPmg7aCsrKXt2YXIgaT1mWzBdLGo9ZCpoO2lmKG51bGwhPWkmJjEwMCpqPj1pKXt2YXIgaz1iW1wiXCIraV07ayBpbnN0YW5jZW9mIGd8fChrPW5ldyBnKGspKSxlLnB1c2goayksZi5zaGlmdCgpfWVsc2UgZS5sZW5ndGgmJmUucHVzaChlW2UubGVuZ3RoLTFdLmNsb25lKCkpfXJldHVybiBlfWZ1bmN0aW9uIGkoYSl7dmFyIGM7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGF8fGEgaW5zdGFuY2VvZiBBcnJheT9iLmN1YmljYmV6aWVyP1wic3RyaW5nXCI9PXR5cGVvZiBhP2IuY3ViaWNiZXppZXJbYV0mJihjPWIuY3ViaWNiZXppZXJbYV0pOmEgaW5zdGFuY2VvZiBBcnJheSYmND09PWEubGVuZ3RoJiYoYz1iLmN1YmljYmV6aWVyLmFwcGx5KGIuY3ViaWNiZXppZXIsYSkpOmNvbnNvbGUuZXJyb3IoXCJyZXF1aXJlIGxpYi5jdWJpY2JlemllclwiKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiYoYz1hKSxjfWZ1bmN0aW9uIGooYSxiLGMpe3ZhciBkLGc9aChhLGMpLGo9MS8oYS9sKSxrPTAsbT1pKGIpO2lmKCFtKXRocm93IG5ldyBFcnJvcihcInVuZXhjZXB0IHRpbWluZyBmdW5jdGlvblwiKTt2YXIgbj0hMTt0aGlzLnBsYXk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIGM9aiooaysxKS50b0ZpeGVkKDEwKSxlPWdba107ZS5yZXF1ZXN0KGMudG9GaXhlZCgxMCksYihjKS50b0ZpeGVkKDEwKSkudGhlbihmdW5jdGlvbigpe24mJihrPT09Zy5sZW5ndGgtMT8obj0hMSxkJiZkLnJlc29sdmUoXCJGSU5JU0hcIiksZD1udWxsKTooaysrLGEoKSkpfSxmdW5jdGlvbigpe30pfWlmKCFuKXJldHVybiBuPSEwLGR8fChkPWUoKSxmKGQucHJvbWlzZSx0aGlzKSksYSgpLHRoaXN9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3JldHVybiBuPyhuPSExLGdba10mJmdba10uY2FuY2VsKCksdGhpcyk6dm9pZCAwfX12YXIgaz02MCxsPTFlMy9rLG09YS5Qcm9taXNlfHxiLnByb21pc2UmJmIucHJvbWlzZS5FUzZQcm9taXNlLG49d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxjLG89d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fGQ7KG49PT1jfHxvPT09ZCkmJihuPWMsbz1kKSxiLmFuaW1hdGlvbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBqKGEsYixjKX0sYi5hbmltYXRpb24uZnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBnKGEpfSxiLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGcoYSk7cmV0dXJuIGIucmVxdWVzdCgpfX0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSk7O21vZHVsZS5leHBvcnRzID0gd2luZG93LmxpYlsnYW5pbWF0aW9uJ107IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgX2ZhbGxiYWNrID0gZmFsc2VcblxudmFyIHJhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuaWYgKCFyYWYpIHtcbiAgX2ZhbGxiYWNrID0gdHJ1ZVxuICByYWYgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChjYWxsYmFjaywgMTYpXG4gIH1cbn1cbnZhciBjYWYgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWVcbiAgfHwgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lXG5pZiAoIWNhZiAmJiBfZmFsbGJhY2spIHtcbiAgY2FmID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChpZClcbiAgfVxufSBlbHNlIGlmICghY2FmKSB7XG4gIGNhZiA9IGZ1bmN0aW9uKCkge31cbn1cblxudmFyIE1BWCA9IChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCBNYXRoLnBvdygyLCA1MykgLSAxKSAtIDFcblxudmFyIF9pZE1hcCA9IHt9XG52YXIgX2dsb2JhbElkID0gMFxuXG5mdW5jdGlvbiBfZ2V0R2xvYmFsSWQoKSB7XG4gIF9nbG9iYWxJZCA9IChfZ2xvYmFsSWQgKyAxKSAlIE1BWFxuICBpZiAoX2lkTWFwW19nbG9iYWxJZF0pIHtcbiAgICByZXR1cm4gX2dldEdsb2JhbElkKClcbiAgfVxuICByZXR1cm4gX2dsb2JhbElkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRUaW1lb3V0IChjYiwgbXMpIHtcbiAgdmFyIGlkID0gX2dldEdsb2JhbElkKClcbiAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKVxuICBfaWRNYXBbaWRdID0gcmFmKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgaWYgKCFfaWRNYXBbaWRdICYmIF9pZE1hcFtpZF0gIT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgaW5kID0gRGF0ZS5ub3coKSAtIHN0YXJ0XG4gICAgaWYgKGluZCA8IG1zKSB7XG4gICAgICBfaWRNYXBbaWRdID0gcmFmKGxvb3ApXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBfaWRNYXBbaWRdXG4gICAgICBjYigpXG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyVGltZW91dCAoaWQpIHtcbiAgdmFyIHRpZCA9IF9pZE1hcFtpZF1cbiAgdGlkICYmIGNhZih0aWQpXG4gIGRlbGV0ZSBfaWRNYXBbaWRdXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuJ3VzZSBzdHJpY3QnXG5cbi8vIHJlcXVpcmUoJy4vZ2VzdHVyZScpXG5pbXBvcnQgJ2N1YmljYmV6aWVyJ1xuaW1wb3J0ICdhbmltYXRpb25qcydcbmltcG9ydCAnLi9jYXJyb3VzZWwuY3NzJ1xuXG52YXIgZG9jID0gd2luZG93LmRvY3VtZW50XG52YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudFxudmFyIEZpcmVmb3ggPSAhIXVhLm1hdGNoKC9GaXJlZm94L2kpXG52YXIgSUVNb2JpbGUgPSAhIXVhLm1hdGNoKC9JRU1vYmlsZS9pKVxudmFyIGNzc1ByZWZpeCA9IEZpcmVmb3ggPyAnLW1vei0nIDogSUVNb2JpbGUgPyAnLW1zLScgOiAnLXdlYmtpdC0nXG52YXIgc3R5bGVQcmVmaXggPSBGaXJlZm94ID8gJ01veicgOiBJRU1vYmlsZSA/ICdtcycgOiAnd2Via2l0J1xuXG5pbXBvcnQgKiBhcyB0aW1lciBmcm9tICcuL3RpbWVyJ1xudmFyIHNldFRpbWVvdXQgPSB0aW1lci5zZXRUaW1lb3V0XG52YXIgY2xlYXJUaW1lb3V0ID0gdGltZXIuY2xlYXJUaW1lb3V0XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybU9mZnNldChlbGVtZW50KSB7XG4gIHZhciBvZmZzZXQgPSB7IHg6IDAsIHk6IDAgfVxuICB2YXIgdHJhbnNmb3JtID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICB2YXIgcmVnTWF0cml4M2QgPSBuZXcgUmVnRXhwKCdebWF0cml4M2RcXFxcKCg/OlstXFxcXGQuXSssXFxcXHMqKXsxMn0oWy1cXFxcZC5dKyksJ1xuICAgICsgJ1xcXFxzKihbLVxcXFxkLl0rKSg/OixcXFxccypbLVxcXFxkLl0rKXsyfVxcXFwpJylcbiAgdmFyIHJlZ01hdHJpeCA9IC9ebWF0cml4XFwoKD86Wy1cXGQuXSssXFxzKil7NH0oWy1cXGQuXSspLFxccyooWy1cXGQuXSspXFwpJC9cbiAgdmFyIG1hdGNoZWRcblxuICBpZiAodHJhbnNmb3JtICE9PSAnbm9uZScpIHtcbiAgICBpZiAoKG1hdGNoZWQgPSB0cmFuc2Zvcm0ubWF0Y2gocmVnTWF0cml4M2QpXG4gICAgICB8fCB0cmFuc2Zvcm0ubWF0Y2gocmVnTWF0cml4KSkpIHtcbiAgICAgIG9mZnNldC54ID0gcGFyc2VGbG9hdChtYXRjaGVkWzFdKSB8fCAwXG4gICAgICBvZmZzZXQueSA9IHBhcnNlRmxvYXQobWF0Y2hlZFsyXSkgfHwgMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxudmFyIENTU01hdHJpeCA9IElFTW9iaWxlID8gJ01TQ1NTTWF0cml4JyA6ICdXZWJLaXRDU1NNYXRyaXgnXG52YXIgaGFzM2QgPSAhIUZpcmVmb3ggfHwgQ1NTTWF0cml4IGluIHdpbmRvdyAmJiAnbTExJyBpbiBuZXcgd2luZG93W0NTU01hdHJpeF0oKVxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRlKHgsIHkpIHtcbiAgeCA9IHBhcnNlRmxvYXQoeClcbiAgeSA9IHBhcnNlRmxvYXQoeSlcblxuICBpZiAoeCAhPSAwKSB7XG4gICAgeCArPSAncHgnXG4gIH1cblxuICBpZiAoeSAhPSAwKSB7XG4gICAgeSArPSAncHgnXG4gIH1cblxuICBpZiAoaGFzM2QpIHtcbiAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJywgJyArIHkgKyAnLCAwKSdcbiAgfVxuXG4gIHJldHVybiAndHJhbnNsYXRlKCcgKyB4ICsgJywgJyArIHkgKyAnKSdcbn1cblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5mdW5jdGlvbiBBcnJheUZyb20oYSkge1xuICByZXR1cm4gc2xpY2UuY2FsbChhKVxufVxuXG52YXIgaW5jSWQgPSAwXG5mdW5jdGlvbiBDYXJyb3VzZWwoZWxlbWVudCwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IHRoaXNcbiAgdmFyIHZpZXdzID0gW11cbiAgdmFyIHBhZ2VzID0ge31cbiAgdmFyIGlkID0gRGF0ZS5ub3coKSArICctJyArICgrK2luY0lkKVxuICB2YXIgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmICEoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgb3B0aW9ucyA9IGFyZ3VtZW50c1swXVxuICAgIGVsZW1lbnQgPSBudWxsXG4gIH1cblxuICBpZiAoIWVsZW1lbnQpIHtcbiAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKVxuICAgIHJvb3QuYXBwZW5kQ2hpbGQoZWxlbWVudClcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWN0cmwtbmFtZScsICdjYXJyb3VzZWwnKVxuICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1jdHJsLWlkJywgaWQpXG5cbiAgZnVuY3Rpb24gZmlyZUV2ZW50KG5hbWUsIGV4dHJhKSB7XG4gICAgdmFyIGV2ID0gZG9jLmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJylcbiAgICBldi5pbml0RXZlbnQobmFtZSwgZmFsc2UsIGZhbHNlKVxuICAgIGlmIChleHRyYSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIGV4dHJhKSB7XG4gICAgICAgIGV2W2tleV0gPSBleHRyYVtrZXldXG4gICAgICB9XG4gICAgfVxuICAgIHJvb3QuZGlzcGF0Y2hFdmVudChldilcbiAgfVxuXG4gIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnXG4gIGVsZW1lbnQuc3R5bGVbc3R5bGVQcmVmaXggKyAnVHJhbnNmb3JtJ10gPSBnZXRUcmFuc2xhdGUoMCwgMClcblxuICB2YXIgdHJhbnNmb3JtT2Zmc2V0ID0gMFxuICB2YXIgaXRlbXMgPSB7fVxuICB2YXIgaXRlbUxlbmd0aCA9IDBcbiAgdmFyIGl0ZW1TdGVwID0gb3B0aW9ucy5zdGVwIHx8IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgdmFyIGl0ZW1JbmRleCA9IDBcblxuICBpdGVtcy5hZGQgPSBmdW5jdGlvbiAoaHRtbCkge1xuICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJylcbiAgICBsaS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgbGkuc3R5bGUuZmxvYXQgPSAnbGVmdCdcbiAgICBsaS5pbmRleCA9IGl0ZW1MZW5ndGhcbiAgICBpZiAodHlwZW9mIGh0bWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsaS5pbm5lckhUTUwgPSBodG1sXG4gICAgfSBlbHNlIGlmIChodG1sIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIGxpLmFwcGVuZENoaWxkKGh0bWwpXG4gICAgfVxuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaXRlbXMsIGl0ZW1MZW5ndGggKyAnJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBsaVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpdGVtTGVuZ3RoKytcbiAgICByZXR1cm4gbGlcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUluZGV4KGluZGV4KSB7XG4gICAgd2hpbGUgKGluZGV4IDwgMCkge1xuICAgICAgaW5kZXggKz0gaXRlbUxlbmd0aFxuICAgIH1cblxuICAgIHdoaWxlIChpbmRleCA+PSBpdGVtTGVuZ3RoKSB7XG4gICAgICBpbmRleCAtPSBpdGVtTGVuZ3RoXG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4XG4gIH1cblxuICBpdGVtcy5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICByZXR1cm4gaXRlbXNbbm9ybWFsaXplSW5kZXgoaW5kZXgpXVxuICB9XG5cbiAgaXRlbXMuZ2V0Q2xvbmVkID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gbm9ybWFsaXplSW5kZXgoaW5kZXgpXG4gICAgdmFyIGl0ZW0gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbG9uZWQ9XCJjbG9uZWQtJyArIGluZGV4ICsgJ1wiXScpXG4gICAgdmFyIG9yaWdpbmFsSXRlbSA9IGl0ZW1zW2luZGV4XVxuXG4gICAgLy8gSWYgdGhlcmUgYSBfbGlzdGVuZXJzIGF0dHJpYnV0ZSBvbiB0aGUgZG9tIGVsZW1lbnRcbiAgICAvLyB0aGVuIGNsb25lIHRoZSBfbGlzdGVuZXJzIGFzIHdlbGwgZm9yIHRoZSBldmVudHMnIGJpbmRpbmdcbiAgICBmdW5jdGlvbiBjbG9uZUV2ZW50cyhvcmlnaW4sIGNsb25lLCBkZWVwKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gb3JpZ2luLl9saXN0ZW5lcnNcbiAgICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgY2xvbmUuX2xpc3RlbmVycyA9IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKHZhciB0eXBlIGluIGxpc3RlbmVycykge1xuICAgICAgICAgIGNsb25lLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW3R5cGVdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGVlcCAmJiBvcmlnaW4uY2hpbGRyZW4gJiYgb3JpZ2luLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9yaWdpbi5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjbG9uZUV2ZW50cyhvcmlnaW4uY2hpbGRyZW5baV0sIGNsb25lLmNoaWxkcmVuW2ldLCBkZWVwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICBpdGVtID0gb3JpZ2luYWxJdGVtLmNsb25lTm9kZSh0cnVlKVxuICAgICAgY2xvbmVFdmVudHMob3JpZ2luYWxJdGVtLCBpdGVtLCB0cnVlKVxuXG4gICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGl0ZW0pXG4gICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnY2xvbmVkJywgJ2Nsb25lZC0nICsgaW5kZXgpXG4gICAgICBpdGVtLmluZGV4ID0gaW5kZXhcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbVxuICB9XG5cbiAgZnVuY3Rpb24gYWN0aXZhdGUoaW5kZXgpIHtcbiAgICBpZiAoaXRlbUxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGN1ckl0ZW0gPSBpdGVtcy5nZXQoaW5kZXgpXG4gICAgdmFyIHByZXZJdGVtXG4gICAgdmFyIG5leHRJdGVtXG5cbiAgICBpZiAoaXRlbUxlbmd0aCA+IDEpIHtcbiAgICAgIHByZXZJdGVtID0gaXRlbXMuZ2V0KGluZGV4IC0gMSlcblxuICAgICAgaWYgKGl0ZW1MZW5ndGggPT09IDIpIHtcbiAgICAgICAgbmV4dEl0ZW0gPSBpdGVtcy5nZXRDbG9uZWQoaW5kZXggKyAxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEl0ZW0gPSBpdGVtcy5nZXQoaW5kZXggKyAxKVxuICAgICAgfVxuXG4gICAgICBjdXJJdGVtLnN0eWxlLmxlZnQgPSAtdHJhbnNmb3JtT2Zmc2V0ICsgJ3B4J1xuICAgICAgcHJldkl0ZW0uc3R5bGUubGVmdCA9ICgtdHJhbnNmb3JtT2Zmc2V0IC0gaXRlbVN0ZXApICsgJ3B4J1xuICAgICAgbmV4dEl0ZW0uc3R5bGUubGVmdCA9ICgtdHJhbnNmb3JtT2Zmc2V0ICsgaXRlbVN0ZXApICsgJ3B4J1xuICAgIH1cblxuICAgIGl0ZW1JbmRleCA9IGN1ckl0ZW0uaW5kZXhcblxuICAgIGZpcmVFdmVudCgnY2hhbmdlJywge1xuICAgICAgcHJldkl0ZW06IHByZXZJdGVtLFxuICAgICAgY3VySXRlbTogY3VySXRlbSxcbiAgICAgIG5leHRJdGVtOiBuZXh0SXRlbVxuICAgIH0pXG4gIH1cblxuICBpdGVtcy5zbGlkZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpdGVtTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXRlbUxlbmd0aCA9PT0gMSkge1xuICAgICAgaW5kZXggPSAwXG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0T2Zmc2V0ID0gZ2V0VHJhbnNmb3JtT2Zmc2V0KGVsZW1lbnQpLnhcbiAgICB2YXIgZW5kT2Zmc2V0ID0gdHJhbnNmb3JtT2Zmc2V0ICsgaXRlbVN0ZXAgKiAoLWluZGV4KVxuICAgIHZhciBpbnRlck9mZnNldCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0XG5cbiAgICBpZiAoaW50ZXJPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBhbmltID0gbmV3IGxpYi5hbmltYXRpb24oXG4gICAgICA0MDAsXG4gICAgICBsaWIuY3ViaWNiZXppZXIuZWFzZSxcbiAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICAgICAgICAgID0gZ2V0VHJhbnNsYXRlKHN0YXJ0T2Zmc2V0ICsgaW50ZXJPZmZzZXQgKiBpMiwgMClcbiAgICAgIH0pLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJhbnNmb3JtT2Zmc2V0ID0gZW5kT2Zmc2V0XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVQcmVmaXggKyAnVHJhbnNmb3JtJ10gPSBnZXRUcmFuc2xhdGUoZW5kT2Zmc2V0LCAwKVxuICAgICAgICBpbmRleCAmJiBhY3RpdmF0ZShpdGVtSW5kZXggKyBpbmRleClcbiAgICAgIH0pXG4gIH1cblxuICBpdGVtcy5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIGl0ZW1zLnNsaWRlKDEpXG4gIH1cblxuICBpdGVtcy5wcmV2ID0gZnVuY3Rpb24gKCkge1xuICAgIGl0ZW1zLnNsaWRlKC0xKVxuICB9XG5cbiAgQXJyYXlGcm9tKGVsZW1lbnQuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgZWwuc3R5bGUudG9wID0gJzAnXG4gICAgZWwuc3R5bGUubGVmdCA9IGl0ZW1MZW5ndGggKiBpdGVtU3RlcCArICdweCdcbiAgICBlbC5zdHlsZS5mbG9hdCA9ICdsZWZ0J1xuICAgIGVsLmluZGV4ID0gaXRlbUxlbmd0aFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdGVtcywgaXRlbUxlbmd0aCArICcnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGVsXG4gICAgICB9XG4gICAgfSlcblxuICAgIGl0ZW1MZW5ndGgrK1xuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXRlbXMnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0ZW1zLCAnbGVuZ3RoJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGl0ZW1MZW5ndGhcbiAgICB9XG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0ZW1zLCAnaW5kZXgnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXRlbUluZGV4XG4gICAgfVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdGVtcywgJ3N0ZXAnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXRlbVN0ZXBcbiAgICB9LFxuXG4gICAgc2V0OiBmdW5jdGlvbiAodikge1xuICAgICAgaXRlbVN0ZXAgPSB2XG4gICAgfVxuICB9KVxuXG4gIHZhciBzdGFydGluZyA9IGZhbHNlXG4gIHZhciBwbGF5aW5nID0gZmFsc2VcbiAgdmFyIGlzU2xpZGluZyA9IGZhbHNlXG4gIHRoaXMucGxheSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0YXJ0aW5nKSB7XG4gICAgICBzdGFydGluZyA9IHRydWVcbiAgICAgIHJldHVybiBhY3RpdmF0ZSgwKVxuICAgIH1cblxuICAgIGlmICghIXBsYXlpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBsYXlpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICBpc1NsaWRpbmcgPSB0cnVlXG4gICAgICBpdGVtcy5uZXh0KClcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpc1NsaWRpbmcgPSBmYWxzZVxuICAgICAgfSwgNTAwKVxuICAgICAgcGxheWluZyA9IHNldFRpbWVvdXQocGxheSwgNDAwICsgcGxheUludGVydmFsKVxuICAgIH0sIDQwMCArIHBsYXlJbnRlcnZhbClcbiAgfVxuXG4gIHRoaXMuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjbGVhclRpbWVvdXQocGxheWluZylcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsYXlpbmcgPSBmYWxzZVxuICAgIH0sIDUwMClcbiAgfVxuXG4gIHZhciBhdXRvcGxheSA9IGZhbHNlXG4gIHZhciByZWFkeVRvUGxheSA9IGZhbHNlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXV0b3BsYXknLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXV0b3BsYXlcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgIGF1dG9wbGF5ID0gISF2XG4gICAgICBpZiAocmVhZHlUb1BsYXkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlYWR5VG9QbGF5KVxuICAgICAgICByZWFkeVRvUGxheSA9IGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgICAgcmVhZHlUb1BsYXkgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGF0LnBsYXkoKVxuICAgICAgICB9LCAyMDAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5zdG9wKClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHRoaXMuYXV0b3BsYXkgPSAhIW9wdGlvbnMuYXV0b3BsYXlcblxuICB2YXIgcGxheUludGVydmFsID0gMTUwMFxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BsYXlJbnRlcnZhbCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwbGF5SW50ZXJ2YWxcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKG4pIHtcbiAgICAgIHBsYXlJbnRlcnZhbCA9IG5cbiAgICB9XG4gIH0pXG4gIHRoaXMucGxheUludGVydmFsID0gISFvcHRpb25zLnBsYXlJbnRlcnZhbCB8fCAxNTAwXG5cbiAgaWYgKG9wdGlvbnMudXNlR2VzdHVyZSkge1xuICAgIHZhciBwYW5uaW5nID0gZmFsc2VcbiAgICB2YXIgZGlzcGxhY2VtZW50XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYW5zdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiAhKHBhbm5pbmcgJiYgaXNTbGlkaW5nKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgICAgIGlmIChhdXRvcGxheSkge1xuICAgICAgICAgIHRoYXQuc3RvcCgpXG4gICAgICAgIH1cblxuICAgICAgICBkaXNwbGFjZW1lbnQgPSAwXG4gICAgICAgIHBhbm5pbmcgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFubW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiBwYW5uaW5nKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIGRpc3BsYWNlbWVudCA9IGUuZGlzcGxhY2VtZW50WFxuICAgICAgICBlbGVtZW50LnN0eWxlW3N0eWxlUHJlZml4ICsgJ1RyYW5zZm9ybSddXG4gICAgICAgICAgPSBnZXRUcmFuc2xhdGUodHJhbnNmb3JtT2Zmc2V0ICsgZGlzcGxhY2VtZW50LCAwKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhbmVuZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiBwYW5uaW5nKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIHBhbm5pbmcgPSBmYWxzZVxuICAgICAgICBpZiAoZS5pc1N3aXBlKSB7XG4gICAgICAgICAgaWYgKGRpc3BsYWNlbWVudCA8IDApIHtcbiAgICAgICAgICAgIGl0ZW1zLm5leHQoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtcy5wcmV2KClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3BsYWNlbWVudCkgPCBpdGVtU3RlcCAvIDIpIHtcbiAgICAgICAgICAgIGl0ZW1zLnNsaWRlKDApXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zLnNsaWRlKGRpc3BsYWNlbWVudCA8IDA/MTotMSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoYXQucGxheSgpXG4gICAgICAgICAgfSwgMjAwMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGZhbHNlKVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzd2lwZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIHRoaXMucm9vdC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIsIGZhbHNlKVxuICB9XG5cbiAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICB0aGlzLnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCBmYWxzZSlcbiAgfVxuXG4gIHRoaXMucm9vdCA9IHJvb3RcbiAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxufVxuXG4hbGliICYmIChsaWIgPSB7fSlcbmxpYi5jYXJyb3VzZWwgPSBDYXJyb3VzZWxcblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgbGliICovXG5cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgJy4vY2Fycm91c2VsJ1xuaW1wb3J0ICcuL3NsaWRlci5jc3MnXG5cbmNvbnN0IERFRkFVTFRfSU5URVJWQUwgPSAzMDAwXG5cbmxldCBleHRlbmQsIENvbXBvbmVudFxuXG5mdW5jdGlvbiBpZGxlV2hlblBhZ2VEaXNhcHBlYXIgKHNsaWRlcikge1xuICBmdW5jdGlvbiBoYW5kbGVQYWdlU2hvdyAoKSB7XG4gICAgc2xpZGVyLmlzUGFnZVNob3cgPSB0cnVlXG4gICAgc2xpZGVyLmF1dG9QbGF5ICYmICFzbGlkZXIuaXNEb21SZW5kZXJpbmcgJiYgc2xpZGVyLnBsYXkoKVxuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZVBhZ2VIaWRlICgpIHtcbiAgICBzbGlkZXIuaXNQYWdlU2hvdyA9IGZhbHNlXG4gICAgc2xpZGVyLnN0b3AoKVxuICB9XG4gIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdwYWdlc2hvdycsIGhhbmRsZVBhZ2VTaG93KVxuICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCBoYW5kbGVQYWdlSGlkZSlcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcbiAgICAgIGhhbmRsZVBhZ2VTaG93KClcbiAgICB9XG4gICAgZWxzZSBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAnaGlkZGVuJykge1xuICAgICAgaGFuZGxlUGFnZUhpZGUoKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gaWRsZVdoZW5Eb21SZW5kZXJpbmcgKHNsaWRlcikge1xuICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigncmVuZGVyZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHNsaWRlci5pc0RvbVJlbmRlcmluZyA9IGZhbHNlXG4gICAgc2xpZGVyLmF1dG9QbGF5ICYmIHNsaWRlci5pc1BhZ2VTaG93ICYmIHNsaWRlci5wbGF5KClcbiAgfSlcbiAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbmRlcmJlZ2luJywgZnVuY3Rpb24gKCkge1xuICAgIHNsaWRlci5pc0RvbVJlbmRlcmluZyA9IHRydWVcbiAgICBzbGlkZXIuc3RvcCgpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUluZGljYXRvcnMgKHNsaWRlcikge1xuICBzbGlkZXIuaW5kaWNhdG9yICYmIHNsaWRlci5pbmRpY2F0b3Iuc2V0SW5kZXgoc2xpZGVyLmN1cnJlbnRJbmRleClcbn1cblxuZnVuY3Rpb24gZ2V0U2xpZGVyQ2hhbmdlSGFuZGxlciAoc2xpZGVyKSB7XG4gIGlmICghc2xpZGVyLl9zbGlkZXJDaGFuZ2VIYW5kbGVyKSB7XG4gICAgc2xpZGVyLl9zbGlkZXJDaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jYXJyb3VzZWwuaXRlbXMuaW5kZXhcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaW5kZXhcbiAgICAgIHVwZGF0ZUluZGljYXRvcnModGhpcylcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnY2hhbmdlJywgeyBpbmRleDogaW5kZXggfSlcbiAgICB9LmJpbmQoc2xpZGVyKVxuICB9XG4gIHJldHVybiBzbGlkZXIuX3NsaWRlckNoYW5nZUhhbmRsZXJcbn1cblxuZnVuY3Rpb24gZG9SZW5kZXIgKHNsaWRlcikge1xuICBzbGlkZXIuY3JlYXRlQ2hpbGRyZW4oKVxuICBzbGlkZXIub25BcHBlbmQoKVxufVxuXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3NsaWRlcicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSdcbiAgICBub2RlLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGNyZWF0ZUNoaWxkcmVuICgpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcblxuICAgIC8vIHJlY3JlYXRlIHNsaWRlciBjb250YWluZXIuXG4gICAgaWYgKHRoaXMuc2xpZGVyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLm5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zbGlkZXJDb250YWluZXIpXG4gICAgfVxuICAgIGlmICh0aGlzLmluZGljYXRvcikge1xuICAgICAgdGhpcy5pbmRpY2F0b3Iubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuaW5kaWNhdG9yLm5vZGUpXG4gICAgfVxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXVxuXG4gICAgY29uc3Qgc2xpZGVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKVxuICAgIHNsaWRlckNvbnRhaW5lci5zdHlsZS5saXN0U3R5bGUgPSAnbm9uZSdcbiAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoc2xpZGVyQ29udGFpbmVyKVxuICAgIHRoaXMuc2xpZGVyQ29udGFpbmVyID0gc2xpZGVyQ29udGFpbmVyXG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgbGV0IGluZGljYXRvckRhdGEsIHdpZHRoLCBoZWlnaHRcbiAgICBsZXQgY2hpbGRXaWR0aCA9IDBcbiAgICBsZXQgY2hpbGRIZWlnaHQgPSAwXG5cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZFxuICAgICAgICBjaGlsZHJlbltpXS5pbnN0YW5jZUlkID0gdGhpcy5kYXRhLmluc3RhbmNlSWRcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnR5cGUgPT09ICdpbmRpY2F0b3InKSB7XG4gICAgICAgICAgaW5kaWNhdG9yRGF0YSA9IGV4dGVuZChjaGlsZHJlbltpXSwge1xuICAgICAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgICAgYW1vdW50OiBjaGlsZHJlbi5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICBpbmRleDogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY2hpbGQgPSBjb21wb25lbnRNYW5hZ2VyLmNyZWF0ZUVsZW1lbnQoY2hpbGRyZW5baV0sICdsaScpXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG4gICAgICAgICAgd2lkdGggPSBjaGlsZC5kYXRhLnN0eWxlLndpZHRoIHx8IDBcbiAgICAgICAgICBoZWlnaHQgPSBjaGlsZC5kYXRhLnN0eWxlLmhlaWdodCB8fCAwXG4gICAgICAgICAgd2lkdGggPiBjaGlsZFdpZHRoICYmIChjaGlsZFdpZHRoID0gd2lkdGgpXG4gICAgICAgICAgaGVpZ2h0ID4gY2hpbGRIZWlnaHQgJiYgKGNoaWxkSGVpZ2h0ID0gaGVpZ2h0KVxuICAgICAgICAgIGNoaWxkLnBhcmVudFJlZiA9IHRoaXMuZGF0YS5yZWZcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gYXBwZW5kIGluZGljYXRvclxuICAgICAgaWYgKGluZGljYXRvckRhdGEpIHtcbiAgICAgICAgaW5kaWNhdG9yRGF0YS5leHRyYS53aWR0aCA9IHRoaXMuZGF0YS5zdHlsZS53aWR0aCB8fCBjaGlsZFdpZHRoXG4gICAgICAgIGluZGljYXRvckRhdGEuZXh0cmEuaGVpZ2h0ID0gdGhpcy5kYXRhLnN0eWxlLmhlaWdodCB8fCBjaGlsZEhlaWdodFxuICAgICAgICB0aGlzLmluZGljYXRvciA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChpbmRpY2F0b3JEYXRhKVxuICAgICAgICB0aGlzLmluZGljYXRvci5wYXJlbnRSZWYgPSB0aGlzLmRhdGEucmVmXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLnNsaWRlciA9IHRoaXNcbiAgICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuaW5kaWNhdG9yLm5vZGUpXG4gICAgICB9XG5cbiAgICAgIHNsaWRlckNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLmRhdGEuc3R5bGUuaGVpZ2h0ICsgJ3B4J1xuICAgICAgc2xpZGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KVxuICAgIH1cbiAgfSxcblxuICBhcHBlbmRDaGlsZCAoZGF0YSkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuIHx8ICh0aGlzLmRhdGEuY2hpbGRyZW4gPSBbXSlcbiAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gICAgZG9SZW5kZXIodGhpcylcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgfVxuICB9LFxuXG4gIGluc2VydEJlZm9yZSAoY2hpbGQsIGJlZm9yZSkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgbGV0IGNoaWxkSW5kZXggPSAtMVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoY2hpbGRyZW5baV0ucmVmID09PSBiZWZvcmUuZGF0YS5yZWYpIHtcbiAgICAgICAgY2hpbGRJbmRleCA9IGlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgY2hpbGRyZW4uc3BsaWNlKGNoaWxkSW5kZXgsIDAsIGNoaWxkLmRhdGEpXG4gICAgZG9SZW5kZXIodGhpcylcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUNoaWxkIChjaGlsZCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjaGlsZC5kYXRhLnJlZiA9PT0gY2hpbGRyZW5baV0ucmVmKSB7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkb1JlbmRlcih0aGlzKVxuICB9LFxuXG4gIG9uQXBwZW5kICgpIHtcbiAgICBpZiAodGhpcy5jYXJyb3VzZWwpIHtcbiAgICAgIHRoaXMuY2Fycm91c2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGdldFNsaWRlckNoYW5nZUhhbmRsZXIodGhpcykpXG4gICAgICB0aGlzLmNhcnJvdXNlbC5zdG9wKClcbiAgICAgIHRoaXMuY2Fycm91c2VsID0gbnVsbFxuICAgIH1cbiAgICBjb25zdCBDYXJyb3VzZWwgPSBsaWIuY2Fycm91c2VsXG4gICAgdGhpcy5jYXJyb3VzZWwgPSBuZXcgQ2Fycm91c2VsKHRoaXMuc2xpZGVyQ29udGFpbmVyLCB7XG4gICAgICBhdXRvcGxheTogdGhpcy5hdXRvUGxheSxcbiAgICAgIHVzZUdlc3R1cmU6IHRydWVcbiAgICB9KVxuXG4gICAgdGhpcy5jYXJyb3VzZWwucGxheUludGVydmFsID0gdGhpcy5pbnRlcnZhbFxuICAgIHRoaXMuY2Fycm91c2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGdldFNsaWRlckNoYW5nZUhhbmRsZXIodGhpcykpXG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSAwXG5cbiAgICAvLyBwcmVsb2FkIGFsbCBpbWFnZXMgZm9yIHNsaWRlclxuICAgIC8vIGJlY2F1c2U6XG4gICAgLy8gMS4gbGliLWltZyBkb2Vzbid0IGxpc3RlbiB0byBldmVudCB0cmFuc2l0aW9uZW5kXG4gICAgLy8gMi4gZXZlbiBpZiB3ZSBmaXJlIGxhenkgbG9hZCBpbiBzbGlkZXIncyBjaGFuZ2UgZXZlbnQgaGFuZGxlcixcbiAgICAvLyAgICB0aGUgbmV4dCBpbWFnZSBzdGlsbCB3b24ndCBiZSBwcmVsb2FkZWQgdXRpbGwgdGhlIG1vbWVudCBpdFxuICAgIC8vICAgIHNsaWRlcyBpbnRvIHRoZSB2aWV3LCB3aGljaCBpcyB0b28gbGF0ZS5cbiAgICBpZiAodGhpcy5wcmVsb2FkSW1nc1RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wcmVsb2FkSW1nc1RpbWVyKVxuICAgIH1cbiAgICAvLyBUaGUgdGltZSBqdXN0IGJlZm9yZSB0aGUgc2Vjb25kIHNsaWRlIGFwcGVhciBhbmQgZW5vdWdoXG4gICAgLy8gZm9yIGFsbCBjaGlsZCBlbGVtZW50cyB0byBhcHBlbmQgaXMgb2suXG4gICAgY29uc3QgcHJlbG9hZFRpbWUgPSAwLjhcbiAgICB0aGlzLnByZWxvYWRJbWdzVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGltZ3MgPSB0aGlzLmNhcnJvdXNlbC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53ZWV4LWltZycpXG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGltZyA9IGltZ3NbaV1cbiAgICAgICAgY29uc3QgaUxhenlTcmMgPSBpbWcuZ2V0QXR0cmlidXRlKCdpLWxhenktc3JjJylcbiAgICAgICAgY29uc3QgaW1nU3JjID0gaW1nLmdldEF0dHJpYnV0ZSgnaW1nLXNyYycpXG4gICAgICAgIGlmIChpTGF6eVNyYykge1xuICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCcgKyBpTGF6eVNyYyArICcpJ1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGltZ1NyYykge1xuICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCcgKyBpbWdTcmMgKyAnKSdcbiAgICAgICAgfVxuICAgICAgICBpbWcucmVtb3ZlQXR0cmlidXRlKCdpLWxhenktc3JjJylcbiAgICAgICAgaW1nLnJlbW92ZUF0dHJpYnV0ZSgnaW1nLXNyYycpXG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpLCBwcmVsb2FkVGltZSAqIDEwMDApXG5cbiAgICAvLyBhdm9pZCBwYWdlIHNjcm9sbCB3aGVuIHBhbm5pbmdcbiAgICBsZXQgcGFubmluZyA9IGZhbHNlXG4gICAgdGhpcy5jYXJyb3VzZWwuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYW5zdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCkge1xuICAgICAgICBwYW5uaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5jYXJyb3VzZWwuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYW5lbmQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlLmlzVmVydGljYWwpIHtcbiAgICAgICAgcGFubmluZyA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocGFubmluZykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pXG5cbiAgICBDb21wb25lbnQucHJvdG90eXBlLm9uQXBwZW5kLmNhbGwodGhpcylcbiAgfSxcblxuICBwbGF5ICgpIHtcbiAgICB0aGlzLmNhcnJvdXNlbC5wbGF5KClcbiAgfSxcblxuICBzdG9wICgpIHtcbiAgICB0aGlzLmNhcnJvdXNlbC5zdG9wKClcbiAgfSxcblxuICBzbGlkZVRvIChpbmRleCkge1xuICAgIGNvbnN0IG9mZnNldCA9IGluZGV4IC0gdGhpcy5jdXJyZW50SW5kZXhcbiAgICB0aGlzLmNhcnJvdXNlbC5pdGVtcy5zbGlkZShvZmZzZXQpXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgaW50ZXJ2YWw6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLmludGVydmFsID0gcGFyc2VJbnQodmFsKSB8fCBERUZBVUxUX0lOVEVSVkFMXG4gICAgaWYgKHRoaXMuY2Fycm91c2VsKSB7XG4gICAgICB0aGlzLmNhcnJvdXNlbC5wbGF5SW50ZXJ2YWwgPSB0aGlzLmludGVydmFsXG4gICAgfVxuICB9LFxuXG4gIGluZGV4OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgY29uc3QgX3RoaXMgPSB0aGlzXG4gICAgZnVuY3Rpb24gZG9TbGlkZSAoaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gcGFyc2VJbnQoaW5kZXgpXG4gICAgICBpZiAoaW5kZXggPCAwIHx8IGlzTmFOKGluZGV4KSkge1xuICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBpbmRleCAnLCBpbmRleClcbiAgICAgIH1cbiAgICAgIF90aGlzLnNsaWRlVG8oaW5kZXgpXG4gICAgICBpZiAoX3RoaXMuX3VwZGF0ZUluZGV4KSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBfdGhpcy5fdXBkYXRlSW5kZXgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRG9tUmVuZGVyaW5nKSB7XG4gICAgICBjb25zdCBwcmUgPSAhIXRoaXMuX3VwZGF0ZUluZGV4XG4gICAgICB0aGlzLl91cGRhdGVJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuYXV0b1BsYXkgJiYgX3RoaXMuaXNQYWdlU2hvdyAmJiBfdGhpcy5wbGF5KClcbiAgICAgICAgZG9TbGlkZSh2YWwpXG4gICAgICB9XG4gICAgICAhcHJlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCB0aGlzLl91cGRhdGVJbmRleClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkb1NsaWRlKHZhbClcbiAgICB9XG4gIH0sXG5cbiAgcGxheXN0YXR1czogZnVuY3Rpb24gKHZhbCkge1xuICAgIHRoaXMucGxheXN0YXR1cyA9IHZhbCAmJiB2YWwgIT09ICdmYWxzZSdcbiAgICB0aGlzLmF1dG9QbGF5ID0gdGhpcy5wbGF5c3RhdHVzXG4gICAgaWYgKHRoaXMuY2Fycm91c2VsKSB7XG4gICAgICBpZiAodGhpcy5wbGF5c3RhdHVzKSB7XG4gICAgICAgIHRoaXMucGxheSgpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9wKClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gc3VwcG9ydCBwbGF5c3RhdHVzJyBhbGlhcyBhdXRvLXBsYXkgZm9yIGNvbXBhdGliaWxpdHlcbiAgYXV0b1BsYXk6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLmF0dHIucGxheXN0YXR1cy5jYWxsKHRoaXMsIHZhbClcbiAgfVxufVxuXG5jb25zdCBldmVudCA9IHtcbiAgY2hhbmdlOiB7XG4gICAgdXBkYXRvcjogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBpbmRleDogdGhpcy5jdXJyZW50SW5kZXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gU2xpZGVyIChkYXRhKSB7XG4gICAgdGhpcy5hdXRvUGxheSA9IGZhbHNlICAvLyBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgIHRoaXMuaW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMXG4gICAgdGhpcy5kaXJlY3Rpb24gPSAncm93JyAvLyAnY29sdW1uJyBpcyBub3QgdGVtcG9yYXJpbHkgc3VwcG9ydGVkLlxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXVxuICAgIHRoaXMuaXNQYWdlU2hvdyA9IHRydWVcbiAgICB0aGlzLmlzRG9tUmVuZGVyaW5nID0gdHJ1ZVxuXG4gICAgLy8gYmluZCBldmVudCAncGFnZXNob3cnLCAncGFnZWhpZGUnIGFuZCAndmlzaWJpbGl0eWNoYW5nZScgb24gd2luZG93LlxuICAgIGlkbGVXaGVuUGFnZURpc2FwcGVhcih0aGlzKVxuICAgIC8vIGJpbmQgZXZlbnQgJ3JlbmRlckJlZ2luJyBhbmQgJ3JlbmRlckVuZCcgb24gd2luZG93LlxuICAgIGlkbGVXaGVuRG9tUmVuZGVyaW5nKHRoaXMpXG5cbiAgICBDb21wb25lbnQuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFNsaWRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChTbGlkZXIucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKFNsaWRlci5wcm90b3R5cGUsIHsgYXR0ciB9KVxuICBleHRlbmQoU2xpZGVyLnByb3RvdHlwZSwgeyBldmVudCB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3NsaWRlcicsIFNsaWRlcilcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi9pbmRpY2F0b3IuY3NzJ1xuXG5jb25zdCBERUZBVUxUX0lURU1fQ09MT1IgPSAnIzk5OSdcbmNvbnN0IERFRkFVTFRfSVRFTV9TRUxFQ1RFRF9DT0xPUiA9ICcjMDAwMGZmJ1xuY29uc3QgREVGQVVMVF9JVEVNX1NJWkUgPSAyMFxuY29uc3QgREVGQVVMVF9NQVJHSU5fU0laRSA9IDEwXG5cbmZ1bmN0aW9uIHJlc2V0Q29sb3IgKGluZGljYXRvcikge1xuICBjb25zdCBsZW4gPSBpbmRpY2F0b3IuaXRlbXMubGVuZ3RoXG4gIGlmICh0eXBlb2YgaW5kaWNhdG9yLmluZGV4ICE9PSAndW5kZWZpbmVkJyAmJiBsZW4gPiBpbmRpY2F0b3IuaW5kZXgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gaW5kaWNhdG9yLml0ZW1zW2ldXG4gICAgICBpZiAoaW5kaWNhdG9yLmluZGV4ID09PSBpKSB7XG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcbiAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpbmRpY2F0b3IuaXRlbVNlbGVjdGVkQ29sb3JcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGluZGljYXRvci5pdGVtQ29sb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ2xpY2sgKGluZGljYXRvciwgaWR4LCBlKSB7XG4gIGluZGljYXRvci5zbGlkZXIuc2xpZGVUbyhpZHgpXG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1pbmRpY2F0b3JzJylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtZWxlbWVudCcpXG4gICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICB0aGlzLm5vZGUgPSBub2RlXG4gICAgdGhpcy5zdHlsZS5pdGVtU2l6ZS5jYWxsKHRoaXMsIDApXG4gICAgdGhpcy51cGRhdGVTdHlsZSh7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgaXRlbVNpemU6IDBcbiAgICB9KVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgY3JlYXRlQ2hpbGRyZW4gKCkge1xuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYW1vdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICBpbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnd2VleC1pbmRpY2F0b3InKVxuICAgICAgaW5kaWNhdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94J1xuICAgICAgaW5kaWNhdG9yLnN0eWxlLm1hcmdpbiA9ICcwICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgREVGQVVMVF9NQVJHSU5fU0laRVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAncHgnXG4gICAgICBpbmRpY2F0b3Iuc3R5bGUud2lkdGggPSB0aGlzLml0ZW1TaXplICsgJ3B4J1xuICAgICAgaW5kaWNhdG9yLnN0eWxlLmhlaWdodCA9IHRoaXMuaXRlbVNpemUgKyAncHgnXG4gICAgICBpbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdpbmRleCcsIGkpXG4gICAgICBpZiAodGhpcy5pbmRleCA9PT0gaSkge1xuICAgICAgICBpbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcbiAgICAgICAgaW5kaWNhdG9yLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaXRlbVNlbGVjdGVkQ29sb3JcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpbmRpY2F0b3Iuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5pdGVtQ29sb3JcbiAgICAgIH1cbiAgICAgIGluZGljYXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrLmJpbmQobnVsbCwgdGhpcywgaSkpXG4gICAgICB0aGlzLml0ZW1zW2ldID0gaW5kaWNhdG9yXG4gICAgICByb290LmFwcGVuZENoaWxkKGluZGljYXRvcilcbiAgICB9XG4gICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKHJvb3QpXG4gIH0sXG5cbiAgc2V0SW5kZXggKGlkeCkge1xuICAgIGlmIChpZHggPj0gdGhpcy5hbW91bnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBwcmV2ID0gdGhpcy5pdGVtc1t0aGlzLmluZGV4XVxuICAgIGNvbnN0IGN1ciA9IHRoaXMuaXRlbXNbaWR4XVxuICAgIHByZXYuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJylcbiAgICBwcmV2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaXRlbUNvbG9yXG4gICAgY3VyLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpXG4gICAgY3VyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaXRlbVNlbGVjdGVkQ29sb3JcbiAgICB0aGlzLmluZGV4ID0gaWR4XG4gIH1cbn1cblxuY29uc3Qgc3R5bGUgPSB7XG4gIGl0ZW1Db2xvciAodmFsKSB7XG4gICAgdGhpcy5pdGVtQ29sb3IgPSB2YWwgfHwgREVGQVVMVF9JVEVNX0NPTE9SXG4gICAgcmVzZXRDb2xvcih0aGlzKVxuICB9LFxuXG4gIGl0ZW1TZWxlY3RlZENvbG9yICh2YWwpIHtcbiAgICB0aGlzLml0ZW1TZWxlY3RlZENvbG9yID0gdmFsIHx8IERFRkFVTFRfSVRFTV9TRUxFQ1RFRF9DT0xPUlxuICAgIHJlc2V0Q29sb3IodGhpcylcbiAgfSxcblxuICBpdGVtU2l6ZSAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VJbnQodmFsKSB8fCBERUZBVUxUX0lURU1fU0laRVxuICAgIHRoaXMuaXRlbVNpemUgPSB2YWxcbiAgICB0aGlzLm5vZGUuc3R5bGUuaGVpZ2h0ID0gdmFsICsgJ3B4J1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5pdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uc3R5bGUud2lkdGggPSB2YWwgKyAncHgnXG4gICAgICB0aGlzLml0ZW1zW2ldLnN0eWxlLmhlaWdodCA9IHZhbCArICdweCdcbiAgICB9XG4gIH0sXG5cbiAgd2lkdGggKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlSW50KHZhbCkgfHwgcGFyc2VJbnQodGhpcy5zbGlkZXJXaWR0aClcbiAgICB0aGlzLnZpcnR1YWxXcmFwcGVyV2lkdGggPSB2YWxcbiAgfSxcblxuICBoZWlnaHQgKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlSW50KHZhbCkgfHwgcGFyc2VJbnQodGhpcy5zbGlkZXJIZWlnaHQpXG4gICAgdGhpcy52aXJ0dWFsV3JhcHBlckhlaWdodCA9IHZhbFxuICB9LFxuXG4gIHRvcCAodmFsKSB7XG4gICAgdmFsID0gdGhpcy52aXJ0dWFsV3JhcHBlckhlaWdodCAvIDIgLSB0aGlzLml0ZW1TaXplIC8gMiArIHZhbFxuICAgIHRoaXMubm9kZS5zdHlsZS5ib3R0b20gPSAnJ1xuICAgIHRoaXMubm9kZS5zdHlsZS50b3AgPSB2YWwgKyAncHgnXG4gIH0sXG5cbiAgYm90dG9tICh2YWwpIHtcbiAgICB2YWwgPSB0aGlzLnZpcnR1YWxXcmFwcGVySGVpZ2h0IC8gMiAtIHRoaXMuaXRlbVNpemUgLyAyICsgdmFsXG4gICAgdGhpcy5ub2RlLnN0eWxlLnRvcCA9ICcnXG4gICAgdGhpcy5ub2RlLnN0eWxlLmJvdHRvbSA9IHZhbCArICdweCdcbiAgfSxcblxuICBsZWZ0ICh2YWwpIHtcbiAgICB2YWwgPSB0aGlzLnZpcnR1YWxXcmFwcGVyV2lkdGggLyAyXG4gICAgICAgICAgLSAodGhpcy5pdGVtU2l6ZSArIDIgKiBERUZBVUxUX01BUkdJTl9TSVpFKSAqIHRoaXMuYW1vdW50IC8gMiArIHZhbFxuICAgIHRoaXMubm9kZS5zdHlsZS5yaWdodCA9ICcnXG4gICAgdGhpcy5ub2RlLnN0eWxlLmxlZnQgPSB2YWwgKyAncHgnXG4gIH0sXG5cbiAgcmlnaHQgKHZhbCkge1xuICAgIHZhbCA9IHRoaXMudmlydHVhbFdyYXBwZXJXaWR0aCAvIDJcbiAgICAgICAgICAtICh0aGlzLml0ZW1TaXplICsgMiAqIERFRkFVTFRfTUFSR0lOX1NJWkUpICogdGhpcy5hbW91bnQgLyAyICsgdmFsXG4gICAgdGhpcy5ub2RlLnN0eWxlLmxlZnQgPSAnJ1xuICAgIHRoaXMubm9kZS5zdHlsZS5yaWdodCA9IHZhbCArICdweCdcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgLy8gU3R5bGUgc3VwcG9ydGVkOlxuICAvLyAgIHBvc2l0aW9uOiAoZGVmYXVsdCAtIGFic29sdXRlKVxuICAvLyAgIGl0ZW1Db2xvcjogY29sb3Igb2YgaW5kaWNhdG9yIGRvdHNcbiAgLy8gICBpdGVtU2VsZWN0ZWRDb2xvcjogY29sb3Igb2YgdGhlIHNlbGVjdGVkIGluZGljYXRvciBkb3RcbiAgLy8gICBpdGVtU2l6ZTogc2l6ZSBvZiBpbmRpY2F0b3JzXG4gIC8vICAgb3RoZXIgbGF5b3V0IHN0eWxlc1xuICBmdW5jdGlvbiBJbmRpY2F0b3IgKGRhdGEpIHtcbiAgICB0aGlzLmRpcmVjdGlvbiA9ICdyb3cnIC8vICdjb2x1bW4nIGlzIG5vdCB0ZW1wb3JhcmlseSBzdXBwb3J0ZWQuXG4gICAgdGhpcy5hbW91bnQgPSBkYXRhLmV4dHJhLmFtb3VudFxuICAgIHRoaXMuaW5kZXggPSBkYXRhLmV4dHJhLmluZGV4XG4gICAgdGhpcy5zbGlkZXJXaWR0aCA9IGRhdGEuZXh0cmEud2lkdGhcbiAgICB0aGlzLnNsaWRlckhlaWdodCA9IGRhdGEuZXh0cmEuaGVpZ2h0XG4gICAgY29uc3Qgc3R5bGVzID0gZGF0YS5zdHlsZSB8fCB7fVxuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB0aGlzLnN0eWxlLndpZHRoLmNhbGwodGhpcywgc3R5bGVzLndpZHRoKVxuICAgIHRoaXMuc3R5bGUuaGVpZ2h0LmNhbGwodGhpcywgc3R5bGVzLmhlaWdodClcbiAgICB0aGlzLml0ZW1Db2xvciA9IHN0eWxlcy5pdGVtQ29sb3IgfHwgREVGQVVMVF9JVEVNX0NPTE9SXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWRDb2xvciA9IHN0eWxlcy5pdGVtU2VsZWN0ZWRDb2xvclxuICAgICAgfHwgREVGQVVMVF9JVEVNX1NFTEVDVEVEX0NPTE9SXG4gICAgdGhpcy5pdGVtcyA9IFtdXG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBJbmRpY2F0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlKVxuICBleHRlbmQoSW5kaWNhdG9yLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChJbmRpY2F0b3IucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdpbmRpY2F0b3InLCBJbmRpY2F0b3IpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG4vLyBUT0RPOiByZWZhY3RvciB0aGlzIHNjc3MgY29kZSBzaW5jZSB0aGlzIGlzIHN0cm9uZ2x5XG4vLyBkZXBlbmRlbnQgb24gbGliLmZsZXhpYmxlIG90aGVyIHRoYW4gdGhlIHZhbHVlIG9mXG4vLyBzY2FsZS5cbmltcG9ydCAnLi90YWJoZWFkZXIuY3NzJ1xuXG5mdW5jdGlvbiBpbml0Rm9sZEJ0biAodGFiaGVhZGVyKSB7XG4gIGNvbnN0IG5vZGUgPSB0YWJoZWFkZXIubm9kZVxuICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcbiAgYnRuLmNsYXNzTmFtZSA9ICdmb2xkLXRvZ2dsZSBpY29uZm9udCdcbiAgYnRuLmlubmVySFRNTCA9ICcmI3hlNjYxOydcbiAgbm9kZS5hcHBlbmRDaGlsZChidG4pXG5cbiAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0YWJoZWFkZXIudW5mb2xkaW5nKSB7XG4gICAgICBmb2xkaW5nKHRhYmhlYWRlcilcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB1bmZvbGRpbmcodGFiaGVhZGVyKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gaW5pdE1hc2sgKHRhYmhlYWRlcikge1xuICBjb25zdCBtYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgbWFzay5jbGFzc05hbWUgPSAndGFiaGVhZGVyLW1hc2snXG4gIHRhYmhlYWRlci5tYXNrID0gbWFza1xuICAvLyBzdG9wIGRlZmF1bHQgYmVoYXZpb3I6IHBhZ2UgbW92aW5nLlxuICBtYXNrLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKVxuICB9KVxuICAvLyBjbGljayB0byB1bmZvbGQuXG4gIG1hc2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9sZGluZyh0YWJoZWFkZXIpXG4gIH0pXG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYXNrKVxufVxuXG5mdW5jdGlvbiB1bmZvbGRpbmcgKHRhYmhlYWRlcikge1xuICAvLyBtYXJrIHRoZSBpbml0aWFsIHBvc2lpdG9uIG9mIHRhYmhlYWRlclxuICBpZiAoIXRhYmhlYWRlci5mbGFnKSB7XG4gICAgY29uc3QgZmxhZyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ3RhYmhlYWRlcicpXG4gICAgdGFiaGVhZGVyLmZsYWcgPSBmbGFnXG4gICAgdGFiaGVhZGVyLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZmxhZywgdGFiaGVhZGVyLm5vZGUpXG4gIH1cbiAgaWYgKCF0YWJoZWFkZXIubWFzaykge1xuICAgIGluaXRNYXNrKHRhYmhlYWRlcilcbiAgfVxuXG4gIC8vIHJlY29yZCB0aGUgc2Nyb2xsIHBvc2l0aW9uLlxuICB0YWJoZWFkZXIuX3Njcm9sbFZhbCA9IHRhYmhlYWRlci5fYm9keS5zY3JvbGxMZWZ0XG4gIC8vIHJlY29yZCB0aGUgcG9zaXRpb24gaW4gZG9jdW1lbnQuXG4gIHRhYmhlYWRlci5fdG9wVmFsID0gdGFiaGVhZGVyLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gIHRhYmhlYWRlci5fc3R5bGVUb3AgPSB0YWJoZWFkZXIubm9kZS5zdHlsZS50b3BcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhYmhlYWRlci5ub2RlKVxuICB0YWJoZWFkZXIubm9kZS5jbGFzc0xpc3QuYWRkKCd1bmZvbGQtaGVhZGVyJylcbiAgdGFiaGVhZGVyLm5vZGUuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXG4gIC8vIHJlY2FsYyB0aGUgcG9zaXRpb24gd2hlbiBpdCBpcyB1bmZvbGRlZC5cbiAgY29uc3QgdGhIZWlnaHQgPSB0YWJoZWFkZXIubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgaWYgKHRoSGVpZ2h0ICsgdGFiaGVhZGVyLl90b3BWYWwgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICB0YWJoZWFkZXIuX3RvcFZhbCA9IHRhYmhlYWRlci5fdG9wVmFsXG4gICAgICAgICsgKHdpbmRvdy5pbm5lckhlaWdodCAtIHRoSGVpZ2h0IC0gdGFiaGVhZGVyLl90b3BWYWwpXG4gIH1cblxuICB0YWJoZWFkZXIubm9kZS5zdHlsZS50b3AgPSB0YWJoZWFkZXIuX3RvcFZhbCArICdweCdcbiAgLy8gcHJvY2VzcyBtYXNrIHN0eWxlXG4gIHRhYmhlYWRlci5tYXNrLmNsYXNzTGlzdC5hZGQoJ3VuZm9sZC1oZWFkZXInKVxuICB0YWJoZWFkZXIubWFzay5zdHlsZS5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKyAncHgnXG4gIHRhYmhlYWRlci51bmZvbGRpbmcgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIGZvbGRpbmcgKHRhYmhlYWRlcikge1xuICBpZiAodGFiaGVhZGVyLnVuZm9sZGluZyAhPT0gdHJ1ZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdGFiaGVhZGVyLm1hc2suY2xhc3NMaXN0LnJlbW92ZSgndW5mb2xkLWhlYWRlcicpXG4gIHRhYmhlYWRlci5ub2RlLmNsYXNzTGlzdC5yZW1vdmUoJ3VuZm9sZC1oZWFkZXInKVxuXG4gIHRhYmhlYWRlci5ub2RlLnN0eWxlLmhlaWdodCA9ICcnXG4gIHRhYmhlYWRlci5ub2RlLnN0eWxlLnRvcCA9IHRhYmhlYWRlci5fc3R5bGVUb3BcblxuICAvLyByZWNvdmVyIHRoZSBwb3NpdGlvbiBvZiB0YWJoZWFkZXIuXG4gIHRhYmhlYWRlci5mbGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRhYmhlYWRlci5ub2RlLCB0YWJoZWFkZXIuZmxhZylcbiAgLy8gcmVjb3ZlciB0aGUgcG9zaXRpb24gb2Ygc2NvbGxlci5cbiAgdGFiaGVhZGVyLl9ib2R5LnNjcm9sbExlZnQgPSB0YWJoZWFkZXIuX3Njcm9sbFZhbFxuXG4gIHNjcm9sbFRvVmlldyh0YWJoZWFkZXIpXG4gIHRhYmhlYWRlci51bmZvbGRpbmcgPSBmYWxzZVxufVxuXG5mdW5jdGlvbiBpbml0RXZlbnQgKHRhYmhlYWRlcikge1xuICBpbml0Q2xpY2tFdmVudCh0YWJoZWFkZXIpXG4gIGluaXRTZWxlY3RFdmVudCh0YWJoZWFkZXIpXG59XG5cbi8vIGluaXQgZXZlbnRzLlxuZnVuY3Rpb24gaW5pdENsaWNrRXZlbnQgKHRhYmhlYWRlcikge1xuICBjb25zdCBib3ggPSB0YWJoZWFkZXIuYm94XG5cbiAgYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGxldCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgaWYgKHRhcmdldC5ub2RlTmFtZSA9PT0gJ1VMJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC5wYXJlbnROb2RlLm5vZGVOYW1lID09PSAnTEknKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIGNvbnN0IGZsb29yID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1mbG9vcicpXG4gICAgLyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG4gICAgaWYgKHRhYmhlYWRlci5kYXRhLmF0dHIuc2VsZWN0ZWRJbmRleCA9PSBmbG9vcikge1xuICAgICAgLy8gRHVwbGljYXRlZCBjbGlja2luZywgbm90IHRvIHRyaWdnZXIgc2VsZWN0IGV2ZW50LlxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cbiAgICBmaXJlRXZlbnQodGFyZ2V0LCAnc2VsZWN0JywgeyBpbmRleDogZmxvb3IgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gaW5pdFNlbGVjdEV2ZW50ICh0YWJoZWFkZXIpIHtcbiAgY29uc3Qgbm9kZSA9IHRhYmhlYWRlci5ub2RlXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0JywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGxldCBpbmRleFxuICAgIGlmIChldnQuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBldnQuaW5kZXhcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZ0LmRhdGEgJiYgZXZ0LmRhdGEuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBldnQuZGF0YS5pbmRleFxuICAgIH1cblxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0YWJoZWFkZXIuYXR0ci5zZWxlY3RlZEluZGV4LmNhbGwodGFiaGVhZGVyLCBpbmRleClcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2Nyb2xsVG9WaWV3ICh0YWJoZWFkZXIsIG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgY29uc3QgYXR0ciA9IHRhYmhlYWRlci5kYXRhLmF0dHJcbiAgICBub2RlID0gdGFiaGVhZGVyLm5vZGUucXVlcnlTZWxlY3RvcignW2RhdGEtZmxvb3I9XCInICsgYXR0ci5zZWxlY3RlZEluZGV4ICsgJ1wiXScpXG4gIH1cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBjb25zdCBkZWZhdWx0VmFsID0gdGFiaGVhZGVyLl9ib2R5LnNjcm9sbExlZnRcbiAgLy8gY29uc3QgbGVmdFZhbCA9IGRlZmF1bHRWYWwgLSBub2RlLm9mZnNldExlZnQgKyAzMDBcblxuICBjb25zdCBzY3JvbGxWYWwgPSBnZXRTY3JvbGxWYWwodGFiaGVhZGVyLl9ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBub2RlKVxuICBkb1Njcm9sbCh0YWJoZWFkZXIuX2JvZHksIHNjcm9sbFZhbClcbn1cblxuLy8gc2Nyb2xsIHRoZSB0YWJoZWFkZXIuXG4vLyBwb3NpdGl2ZSB2YWwgbWVhbnMgdG8gc2Nyb2xsIHJpZ2h0LlxuLy8gbmVnYXRpdmUgdmFsIG1lYW5zIHRvIHNjcm9sbCBsZWZ0LlxuZnVuY3Rpb24gZG9TY3JvbGwgKG5vZGUsIHZhbCwgZmluaXNoKSB7XG4gIGlmICghdmFsKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZpbmlzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZmluaXNoID0gTWF0aC5hYnModmFsKVxuICB9XG5cbiAgaWYgKGZpbmlzaCA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmFsID4gMCkge1xuICAgICAgbm9kZS5zY3JvbGxMZWZ0ICs9IDJcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBub2RlLnNjcm9sbExlZnQgLT0gMlxuICAgIH1cbiAgICBmaW5pc2ggLT0gMlxuXG4gICAgZG9TY3JvbGwobm9kZSwgdmFsLCBmaW5pc2gpXG4gIH0pXG59XG5cbi8vIGdldCBzY3JvbGwgZGlzdGFuY2UuXG5mdW5jdGlvbiBnZXRTY3JvbGxWYWwgKHJlY3QsIG5vZGUpIHtcbiAgY29uc3QgbGVmdCA9IG5vZGUucHJldmlvdXNTaWJsaW5nXG4gIGNvbnN0IHJpZ2h0ID0gbm9kZS5uZXh0U2libGluZ1xuICBsZXQgc2Nyb2xsVmFsXG5cbiAgLy8gcHJvY2VzcyBsZWZ0LXNpZGUgZWxlbWVudCBmaXJzdC5cbiAgaWYgKGxlZnQpIHtcbiAgICBjb25zdCBsZWZ0UmVjdCA9IGxlZnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAvLyBvbmx5IG5lZWQgdG8gY29tcGFyZSB0aGUgdmFsdWUgb2YgbGVmdC5cbiAgICBpZiAobGVmdFJlY3QubGVmdCA8IHJlY3QubGVmdCkge1xuICAgICAgc2Nyb2xsVmFsID0gbGVmdFJlY3QubGVmdFxuICAgICAgcmV0dXJuIHNjcm9sbFZhbFxuICAgIH1cbiAgfVxuXG4gIGlmIChyaWdodCkge1xuICAgIGNvbnN0IHJpZ2h0UmVjdCA9IHJpZ2h0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgLy8gY29tcGFyZSB0aGUgdmFsdWUgb2YgcmlnaHQuXG4gICAgaWYgKHJpZ2h0UmVjdC5yaWdodCA+IHJlY3QucmlnaHQpIHtcbiAgICAgIHNjcm9sbFZhbCA9IHJpZ2h0UmVjdC5yaWdodCAtIHJlY3QucmlnaHRcbiAgICAgIHJldHVybiBzY3JvbGxWYWxcbiAgICB9XG4gIH1cblxuICAvLyBwcm9jZXNzIGN1cnJlbnQgbm9kZSwgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICBjb25zdCBub2RlUmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgaWYgKG5vZGVSZWN0LmxlZnQgPCByZWN0LmxlZnQpIHtcbiAgICBzY3JvbGxWYWwgPSBub2RlUmVjdC5sZWZ0XG4gIH1cbiAgZWxzZSBpZiAobm9kZVJlY3QucmlnaHQgPiByZWN0LnJpZ2h0KSB7XG4gICAgc2Nyb2xsVmFsID0gbm9kZVJlY3QucmlnaHQgLSByZWN0LnJpZ2h0XG4gIH1cblxuICByZXR1cm4gc2Nyb2xsVmFsXG59XG5cbi8vIHRyaWdnZXIgYW5kIGJyb2FkY2FzdCBldmVudHMuXG5mdW5jdGlvbiBmaXJlRXZlbnQgKGVsZW1lbnQsIHR5cGUsIGRhdGEpIHtcbiAgY29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50JylcbiAgZXZ0LmRhdGEgPSBkYXRhXG4gIGZvciAoY29uc3QgayBpbiBkYXRhKSB7XG4gICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgIGV2dFtrXSA9IGRhdGFba11cbiAgICB9XG4gIH1cbiAgLy8gbmVlZCBidWJibGUuXG4gIGV2dC5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSlcblxuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIaWdobGlnaHRJY29uIChjb2RlKSB7XG4gIGNvbnN0IGh0bWwgPSAnPGkgY2xhc3M9XCJobC1pY29uIGljb25mb250XCI+JyArICcmI3hlNjUwJyArICc8L2k+J1xuICByZXR1cm4gaHRtbFxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkQ29sb3IgKGNvbG9yKSB7XG4gIGlmICghY29sb3IpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChjb2xvci5jaGFyQXQoMCkgIT09ICcjJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGNvbG9yLmxlbmd0aCAhPT0gNykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgLy8gb3V0c2lkZSBjb250YWluZXIuXG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc05hbWUgPSAndGFiLWhlYWRlcidcbiAgICAvLyB0aXAgb24gdGhlIHRvcC5cbiAgICBjb25zdCBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIGJhci5jbGFzc05hbWUgPSAnaGVhZGVyLWJhcidcbiAgICBiYXIudGV4dENvbnRlbnQgPSAnQ0hBTkdFIEZMT09SJ1xuICAgIC8vIG1pZGRsZSBsYXllci5cbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBib2R5LmNsYXNzTmFtZSA9ICdoZWFkZXItYm9keSdcbiAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpXG4gICAgYm94LmNsYXNzTmFtZSA9ICd0YWJoZWFkZXInXG5cbiAgICBib2R5LmFwcGVuZENoaWxkKGJveClcbiAgICBub2RlLmFwcGVuZENoaWxkKGJhcilcbiAgICBub2RlLmFwcGVuZENoaWxkKGJvZHkpXG4gICAgdGhpcy5fYmFyID0gYmFyXG4gICAgdGhpcy5fYm9keSA9IGJvZHlcbiAgICB0aGlzLmJveCA9IGJveFxuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICAvLyBpbml0IGV2ZW50cy5cbiAgICBpbml0Rm9sZEJ0bih0aGlzKVxuICAgIGluaXRFdmVudCh0aGlzKVxuICAgIHJldHVybiBub2RlXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgaGlnaGxpZ2h0SWNvbiAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhpZ2hsaWdodEljb24oKVxuICB9LFxuXG4gIGRhdGEgKCkge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmRhdGEuYXR0clxuICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBhIGRlZmF1bHQgc2VsZWN0ZWQgdmFsdWUuXG4gICAgaWYgKGF0dHIuc2VsZWN0ZWRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhdHRyLnNlbGVjdGVkSW5kZXggPSAwXG4gICAgfVxuXG4gICAgY29uc3QgbGlzdCA9IGF0dHIuZGF0YSB8fCBbXVxuICAgIGNvbnN0IGN1ckl0ZW0gPSBhdHRyLnNlbGVjdGVkSW5kZXhcblxuICAgIGNvbnN0IHJldCA9IFtdXG4gICAgY29uc3QgaXRlbVRtcGwgPSAnPGxpIGNsYXNzPVwidGgtaXRlbVwiIGRhdGEtZmxvb3I9XCJ7e2Zsb29yfX1cIj4nXG4gICAgICAgICsgJ3t7aGxJY29ufX17e2Zsb29yTmFtZX19PC9saT4nXG5cbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGlkeCkge1xuICAgICAgbGV0IGh0bWwgPSBpdGVtVG1wbC5yZXBsYWNlKCd7e2Zsb29yfX0nLCBpZHgpXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cbiAgICAgIGlmIChjdXJJdGVtID09IGlkeCkge1xuICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCd7e2hsSWNvbn19JywgY3JlYXRlSGlnaGxpZ2h0SWNvbigpKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoJ3t7aGxJY29ufX0nLCAnJylcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cbiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoJ3t7Zmxvb3JOYW1lfX0nLCBpdGVtKVxuXG4gICAgICByZXQucHVzaChodG1sKVxuICAgIH0sIHRoaXMpXG5cbiAgICB0aGlzLmJveC5pbm5lckhUTUwgPSByZXQuam9pbignJylcbiAgfSxcblxuICBzZWxlY3RlZEluZGV4ICh2YWwpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5kYXRhLmF0dHJcblxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsID0gMFxuICAgIH1cblxuICAgIC8vIGlmICh2YWwgPT0gYXR0ci5zZWxlY3RlZEluZGV4KSB7XG4gICAgLy8gICByZXR1cm5cbiAgICAvLyB9XG5cbiAgICBhdHRyLnNlbGVjdGVkSW5kZXggPSB2YWxcblxuICAgIHRoaXMuYXR0ci5kYXRhLmNhbGwodGhpcylcblxuICAgIGZvbGRpbmcodGhpcylcbiAgICB0aGlzLnN0eWxlLnRleHRIaWdobGlnaHRDb2xvci5jYWxsKHRoaXMsIHRoaXMudGV4dEhpZ2hsaWdodENvbG9yKVxuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICBvcGFjaXR5ICh2YWwpIHtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsIDwgMCB8fCB2YWwgPiAxKSB7XG4gICAgICB2YWwgPSAxXG4gICAgfVxuXG4gICAgdGhpcy5ub2RlLnN0eWxlLm9wYWNpdHkgPSB2YWxcbiAgfSxcblxuICB0ZXh0Q29sb3IgKHZhbCkge1xuICAgIGlmICghaXNWYWxpZENvbG9yKHZhbCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubm9kZS5zdHlsZS5jb2xvciA9IHZhbFxuICB9LFxuXG4gIHRleHRIaWdobGlnaHRDb2xvciAodmFsKSB7XG4gICAgaWYgKCFpc1ZhbGlkQ29sb3IodmFsKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMudGV4dEhpZ2hsaWdodENvbG9yID0gdmFsXG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZGF0YS5hdHRyXG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZsb29yPVwiJ1xuICAgICAgICArIGF0dHIuc2VsZWN0ZWRJbmRleCArICdcIl0nKVxuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLnN0eWxlLmNvbG9yID0gdmFsXG4gICAgICBzY3JvbGxUb1ZpZXcodGhpcywgbm9kZSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIGZ1bmN0aW9uIFRhYkhlYWRlciAoZGF0YSkge1xuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgVGFiSGVhZGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFRhYkhlYWRlci5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoVGFiSGVhZGVyLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChUYWJIZWFkZXIucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd0YWJoZWFkZXInLCBUYWJIZWFkZXIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuaW1wb3J0IHsgZmluZEVudGVyS2V5VHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2luZGV4J1xuXG5sZXQgYXBwZW5kU3R5bGVcblxuY29uc3QgYXZhaWxhYmxlVHlwZXMgPSBbJ3RleHQnLCAncGFzc3dvcmQnLCAndGVsJywgJ2VtYWlsJywgJ3VybCcsICdkYXRlJywgJ3RpbWUnXVxuY29uc3QgREVGQVVMVF9UWVBFID0gJ3RleHQnXG5cbmZ1bmN0aW9uIHNldFBsYWNlaG9sZGVyQ29sb3IgKGlucHV0LCBwbGFjZWhvbGRlckNvbG9yKSB7XG4gIGlmICghcGxhY2Vob2xkZXJDb2xvcikge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHZlbmRvcnMgPSBbXG4gICAgJzo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcicsXG4gICAgJzotbW96LXBsYWNlaG9sZGVyJyxcbiAgICAnOjotbW96LXBsYWNlaG9sZGVyJyxcbiAgICAnOi1tcy1pbnB1dC1wbGFjZWhvbGRlcicsXG4gICAgJzpwbGFjZWhvbGRlci1zaG93bidcbiAgXVxuICBsZXQgY3NzID0gJydcbiAgY29uc3QgY3NzUnVsZSA9ICdjb2xvcjogJyArIHBsYWNlaG9sZGVyQ29sb3IgKyAnOydcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSB2ZW5kb3JzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNzcyArPSAnLicgKyBpbnB1dC5jbGFzc05hbWUgKyB2ZW5kb3JzW2ldICsgJ3snXG4gICAgICAgICAgICsgY3NzUnVsZSArICd9J1xuICB9XG4gIGFwcGVuZFN0eWxlKGNzcywgaW5wdXQuc3R5bGVJZCwgdHJ1ZSlcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcbiAgICBjb25zdCB1dWlkID0gTWF0aC5mbG9vcigxMDAwMDAwMDAwMDAwMCAqIE1hdGgucmFuZG9tKCkpICsgRGF0ZS5ub3coKVxuICAgIHRoaXMuY2xhc3NOYW1lID0gJ3dlZXgtaXB0LScgKyB1dWlkXG4gICAgdGhpcy5zdHlsZUlkID0gJ3dlZXgtc3R5bGUtJyArIHV1aWRcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc05hbWUpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWVsZW1lbnQnKVxuICAgIHRoaXMucGxhY2Vob2xkZXIgJiYgKG5vZGUucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyKVxuICAgIHRoaXMuY3JlYXRlS2V5Ym9yZEV2ZW50KG5vZGUpXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcblxuICAvLyBzdXBwb3J0IGVudGVyIGtleSBlbnZlbnRcbiAgY3JlYXRlS2V5Ym9yZEV2ZW50IChub2RlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLmV2ZW50KSAmJiB0aGlzLmRhdGEuZXZlbnQuaW5kZXhPZigncmV0dXJuJykgPiAtMSkge1xuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldikgPT4ge1xuICAgICAgICBjb25zdCBjb2RlID0gZXYua2V5Q29kZVxuICAgICAgICBsZXQga2V5ID0gZXYua2V5XG4gICAgICAgIGlmIChjb2RlID09PSAxMykge1xuICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICAgIGtleSA9ICduZXh0J1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByaWdodEtleVR5cGUgPSBmaW5kRW50ZXJLZXlUeXBlKHRoaXMuZGF0YS5hdHRyWydyZXR1cm5LZXlUeXBlJ10pXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZXR1cm4nLCB7IHJldHVybktleVR5cGU6IHJpZ2h0S2V5VHlwZSB9KVxuICAgICAgICB9XG4gICAgICB9LCBmYWxzZSlcbiAgICB9XG4gIH0sXG5cbiAgZm9jdXMgKCkge1xuICAgIHRoaXMubm9kZS5mb2N1cygpXG4gIH0sXG5cbiAgYmx1ciAoKSB7XG4gICAgdGhpcy5ub2RlLmJsdXIoKVxuICB9XG59XG5cbi8vIHVwZGF0YWJsZSBhdHRyaWJ1dGVzXG5jb25zdCBhdHRyID0ge1xuICBkaXNhYmxlZCAodmFsKSB7XG4gICAgdGhpcy5ub2RlLmRpc2FibGVkID0gISF2YWxcbiAgfSxcblxuICBwbGFjZWhvbGRlciAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnBsYWNlaG9sZGVyID0gdmFsIHx8ICcnXG4gIH0sXG5cbiAgdmFsdWUgKHZhbCkge1xuICAgIHRoaXMubm9kZS52YWx1ZSA9IHZhbCB8fCAnJ1xuICB9LFxuXG4gIGF1dG9mb2N1cyAodmFsKSB7XG4gICAgdGhpcy5ub2RlLmF1dG9mb2N1cyA9ICEhdmFsXG4gIH0sXG5cbiAgdHlwZSAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnR5cGUgPSBhdmFpbGFibGVUeXBlcy5pbmRleE9mKHZhbCkgIT09IC0xXG4gICAgICA/IHZhbFxuICAgICAgOiBERUZBVUxUX1RZUEVcbiAgfSxcblxuICByZXR1cm5LZXlUeXBlICh2YWwpIHtcbiAgICB0aGlzLm5vZGUucmV0dXJuS2V5VHlwZSA9IHZhbCB8fCAnJ1xuICB9XG59XG5cbi8vIHVwZGF0YWJsZSBzdHlsZXNcbmNvbnN0IHN0eWxlID0ge1xuICBwbGFjZWhvbGRlckNvbG9yOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgc2V0UGxhY2Vob2xkZXJDb2xvcih0aGlzLCB2YWwpXG4gIH1cbn1cblxuLy8gZXZlbnRzIGNvbmZpZ3VyYXRpb25zXG5jb25zdCBldmVudCA9IHtcbiAgaW5wdXQ6IHtcbiAgICB1cGRhdG9yICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMubm9kZS52YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBleHRyYSAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY2hhbmdlOiB7XG4gICAgdXBkYXRvcjogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcmV0dXJuOiB7XG4gICAgdXBkYXRvcjogZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuICBhcHBlbmRTdHlsZSA9IFdlZXgudXRpbHMuYXBwZW5kU3R5bGVcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIHR5cGU6IHRleHR8cGFzc3dvcmR8dGVsfGVtYWlsfHVybFxuICAvLyAgIC0gdmFsdWVcbiAgLy8gICAtIHBsYWNlaG9sZGVyXG4gIC8vICAgLSBkaXNhYmxlZFxuICAvLyAgIC0gYXV0b2ZvY3VzXG4gIGZ1bmN0aW9uIElucHV0IChkYXRhKSB7XG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBJbnB1dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChJbnB1dC5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoSW5wdXQucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKElucHV0LnByb3RvdHlwZSwge1xuICAgIHN0eWxlOiBleHRlbmQoT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlLnN0eWxlKSwgc3R5bGUpXG4gIH0pXG4gIGV4dGVuZChJbnB1dC5wcm90b3R5cGUsIHsgZXZlbnQgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdpbnB1dCcsIElucHV0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcbmltcG9ydCB7IGZpbmRFbnRlcktleVR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9pbmRleCdcblxuY29uc3QgREVGQVVMVF9ST1dTID0gMlxuXG4vKipcbiAqIGF0dHI6XG4gKiByb3dzOiBkZWZhdWx0IGlzIDIuXG4gKiBkaXNhYmxlZFxuICogcGxhY2Vob2xkZXJcbiAqL1xuXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1lbGVtZW50JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtdGV4dGFyZWEnKVxuICAgIHRoaXMuY3JlYXRlS2V5Ym9hcmRFdmVudChub2RlKVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgLy8gc3VwcG9ydCBlbnRlciBrZXkgZW52ZW50XG4gIGNyZWF0ZUtleWJvYXJkRXZlbnQgKG5vZGUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZXZlbnQpICYmIHRoaXMuZGF0YS5ldmVudC5pbmRleE9mKCdyZXR1cm4nKSA+IC0xKSB7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBldi5rZXlDb2RlXG4gICAgICAgIGxldCBrZXkgPSBldi5rZXlcbiAgICAgICAgaWYgKGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAndGFiJykge1xuICAgICAgICAgICAga2V5ID0gJ25leHQnXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJpZ2h0S2V5VHlwZSA9IGZpbmRFbnRlcktleVR5cGUodGhpcy5kYXRhLmF0dHJbJ3JldHVybktleVR5cGUnXSlcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3JldHVybicsIHsgcmV0dXJuS2V5VHlwZTogcmlnaHRLZXlUeXBlIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIGZhbHNlKVxuICAgIH1cbiAgfVxufVxuXG4vLyB1cGRhdGFibGUgYXR0cmlidXRlc1xuY29uc3QgYXR0ciA9IHtcbiAgcm93cyAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnJvd3MgPSB2YWwgfHwgREVGQVVMVF9ST1dTXG4gIH0sXG4gIGRpc2FibGVkICh2YWwpIHtcbiAgICB0aGlzLm5vZGUuZGlzYWJsZWQgPSAhIXZhbFxuICB9LFxuICBwbGFjZWhvbGRlciAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnBsYWNlaG9sZGVyID0gdmFsIHx8ICcnXG4gIH0sXG4gIHZhbHVlICh2YWwpIHtcbiAgICB0aGlzLm5vZGUudmFsdWUgPSB2YWwgfHwgJydcbiAgfSxcbiAgYXV0b2ZvY3VzICh2YWwpIHtcbiAgICB0aGlzLm5vZGUuYXV0b2ZvY3VzID0gISF2YWxcbiAgfSxcbiAgcmV0dXJuS2V5VHlwZSAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnJldHVybktleVR5cGUgPSB2YWwgfHwgJydcbiAgfVxufVxuXG4vLyBldmVudHMgY29uZmlndXJhdGlvbnNcbmNvbnN0IGV2ZW50ID0ge1xuICBpbnB1dDoge1xuICAgIHVwZGF0b3IgKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWUsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjaGFuZ2U6IHtcbiAgICB1cGRhdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZXh0cmE6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWUsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZXR1cm46IHtcbiAgICB1cGRhdG9yOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgLy8gYXR0cnM6XG4gIC8vICAgLSByb3dzXG4gIC8vICAgLSBkaXNhYmxlZFxuICAvLyAgIC0gcGxhY2Vob2xkZXJcbiAgZnVuY3Rpb24gVGV4dGFyZWEgKGRhdGEpIHtcbiAgICBBdG9taWMuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFRleHRhcmVhLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFRleHRhcmVhLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChUZXh0YXJlYS5wcm90b3R5cGUsIHsgYXR0ciB9KVxuICBleHRlbmQoVGV4dGFyZWEucHJvdG90eXBlLCB7IGV2ZW50IH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgndGV4dGFyZWEnLCBUZXh0YXJlYSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi92aWRlby5jc3MnXG5cbmZ1bmN0aW9uIGdldFByb3RvIChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIHJldHVybiB7XG4gICAgY3JlYXRlICgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpXG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtdmlkZW8nKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWVsZW1lbnQnKVxuICAgICAgbm9kZS5jb250cm9scyA9IHRydWVcbiAgICAgIG5vZGUuYXV0b3BsYXkgPSB0aGlzLmF1dG9QbGF5XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJylcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCd3ZWJraXQtcGxheXNpbmxpbmUnLCAnJylcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdwbGF5LXN0YXR1cycsIHRoaXMucGxheVN0YXR1cylcbiAgICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICAgIGlmICh0aGlzLmF1dG9QbGF5ICYmIHRoaXMucGxheVN0YXR1cyA9PT0gJ3BsYXknKSB7XG4gICAgICAgIC8vIHNldCB0aW1lciB0byBhdm9pZCBlcnJvcjogdW5jYXVnaHQgRE9NIGV4Y2VwdGlvbjogdGhlIHBsYXkoKSByZXF1ZXN0XG4gICAgICAgIC8vIHdhcyBpbnRlcnJ1cHRlZCBieSBhIG5ldyBsb2FkIHJlcXVlc3QuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGxheSgpXG4gICAgICAgIH0sIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZVxuICAgIH0sXG5cbiAgICBiaW5kRXZlbnRzIChldnRzKSB7XG4gICAgICBBdG9taWMucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzLCBldnRzKVxuXG4gICAgICAvLyBjb252ZXJ0IHczYy12aWRlbyBldmVudHMgdG8gd2VleC12aWRlbyBldmVudHMuXG4gICAgICBjb25zdCBldnRzTWFwID0ge1xuICAgICAgICBzdGFydDogJ3BsYXknLFxuICAgICAgICBmaW5pc2g6ICdlbmRlZCcsXG4gICAgICAgIGZhaWw6ICdlcnJvcidcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZXZ0TmFtZSBpbiBldnRzTWFwKSB7XG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dHNNYXBbZXZ0TmFtZV0sIGZ1bmN0aW9uICh0eXBlLCBlKSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHR5cGUsIGUuZGF0YSlcbiAgICAgICAgfS5iaW5kKHRoaXMsIGV2dE5hbWUpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwbGF5ICgpIHtcbiAgICAgIGxldCBzcmMgPSB0aGlzLm5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKVxuICAgICAgaWYgKCFzcmMpIHtcbiAgICAgICAgc3JjID0gdGhpcy5ub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1zcmMnKVxuICAgICAgICBzcmMgJiYgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnc3JjJywgc3JjKVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5ub2RlLnBsYXkoKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBETyBOT1RISU5HLlxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXVzZSAoKSB7XG4gICAgICB0aGlzLm5vZGUucGF1c2UoKVxuICAgIH0sXG5cbiAgICBzdG9wICgpIHtcbiAgICAgIHRoaXMubm9kZS5wYXVzZSgpXG4gICAgICB0aGlzLm5vZGUuYXV0b3BsYXkgPSBmYWxzZVxuICAgICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1zcmMnLCB0aGlzLm5vZGUuc3JjKVxuICAgICAgdGhpcy5ub2RlLnNyYyA9ICcnXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIHBsYXlTdGF0dXMgKHZhbCkge1xuICAgIGlmICh2YWwgIT09ICdwbGF5JyAmJiB2YWwgIT09ICdzdG9wJyAmJiB2YWwgIT09ICdwYXVzZScpIHtcbiAgICAgIHZhbCA9ICdwYXVzZSdcbiAgICB9XG4gICAgaWYgKHRoaXMucGxheVN0YXR1cyA9PT0gdmFsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5wbGF5U3RhdHVzID0gdmFsXG4gICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgncGxheS1zdGF0dXMnLCB2YWwpXG4gICAgdGhpc1t0aGlzLnBsYXlTdGF0dXNdKClcbiAgfSxcblxuICBhdXRvUGxheSAodmFsKSB7XG4gICAgLy8gRE8gTk9USElOR1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIGF1dG9QbGF5OiB0cnVlIHwgZmFsc2UgKGRlZmF1bHQ6IGZhbHNlKVxuICAvLyAgIC0gcGxheVN0YXR1czogcGxheSB8IHBhdXNlIHwgc3RvcFxuICAvLyAgIC0gc3JjOiB7c3RyaW5nfVxuICAvLyAgIC0gcG9zdGVyOiB7c3RyaW5nfVxuICAvLyAgIC0gbG9vcDogdHJ1ZSB8IGZhbHNlIChkZWZhdWx0OiBmYWxzZSlcbiAgLy8gICAtIG11dGVkOiB0cnVlIHwgZmFsc2UgKGRlZmF1bHQ6IGZhbHNlKVxuICAvLyBldmVudHM6XG4gIC8vICAgLSBzdGFydFxuICAvLyAgIC0gcGF1c2VcbiAgLy8gICAtIGZpbmlzaFxuICAvLyAgIC0gZmFpbFxuICBmdW5jdGlvbiBWaWRlbyAoZGF0YSkge1xuICAgIGNvbnN0IGF1dG9QbGF5ID0gZGF0YS5hdHRyLmF1dG9QbGF5XG4gICAgY29uc3QgcGxheVN0YXR1cyA9IGRhdGEuYXR0ci5wbGF5U3RhdHVzXG4gICAgdGhpcy5hdXRvUGxheSA9IGF1dG9QbGF5ID09PSB0cnVlIHx8IGF1dG9QbGF5ID09PSAndHJ1ZSdcbiAgICBpZiAocGxheVN0YXR1cyAhPT0gJ3BsYXknXG4gICAgICAgICYmIHBsYXlTdGF0dXMgIT09ICdzdG9wJ1xuICAgICAgICAmJiBwbGF5U3RhdHVzICE9PSAncGF1c2UnKSB7XG4gICAgICB0aGlzLnBsYXlTdGF0dXMgPSAncGF1c2UnXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5wbGF5U3RhdHVzID0gcGxheVN0YXR1c1xuICAgIH1cbiAgICBBdG9taWMuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFZpZGVvLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFZpZGVvLnByb3RvdHlwZSwgZ2V0UHJvdG8oV2VleCkpXG4gIGV4dGVuZChWaWRlby5wcm90b3R5cGUsIHsgYXR0ciB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3ZpZGVvJywgVmlkZW8pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG5cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi9zd2l0Y2guY3NzJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgY29sb3I6ICcjNjRiZDYzJyxcbiAgc2Vjb25kYXJ5Q29sb3I6ICcjZGZkZmRmJyxcbiAgamFja0NvbG9yOiAnI2ZmZicsXG4gIGphY2tTZWNvbmRhcnlDb2xvcjogbnVsbCxcbiAgY2xhc3NOYW1lOiAnd2VleC1zd2l0Y2gnLFxuICBkaXNhYmxlZE9wYWNpdHk6IDAuNSxcbiAgc3BlZWQ6ICcwLjRzJyxcbiAgd2lkdGg6IDEwMCxcbiAgaGVpZ2h0OiA2MCxcbiAgLy8gaXMgd2lkdGggYW5kIGhlaWdodCBzY2FsYWJsZSA/XG4gIHNjYWxhYmxlOiBmYWxzZVxufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uaXplIChlbGVtZW50LCBwcm9wcykge1xuICBjb25zdCB0cmFuc2l0aW9ucyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgdHJhbnNpdGlvbnMucHVzaChrZXkgKyAnICcgKyBwcm9wc1trZXldKVxuICB9XG4gIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25zLmpvaW4oJywgJylcbiAgZWxlbWVudC5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gdHJhbnNpdGlvbnMuam9pbignLCAnKVxufVxuXG5mdW5jdGlvbiBzZXRTaXplIChjb21wKSB7XG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKGNvbXAud2lkdGgsIGNvbXAuaGVpZ2h0KVxuICBjb25zdCBtYXggPSBNYXRoLm1heChjb21wLndpZHRoLCBjb21wLmhlaWdodClcbiAgY29tcC5ub2RlLnN0eWxlLndpZHRoID0gbWF4ICsgJ3B4J1xuICBjb21wLm5vZGUuc3R5bGUuaGVpZ2h0ID0gbWluICsgJ3B4J1xuICBjb21wLm5vZGUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWluIC8gMiArICdweCdcbiAgY29tcC5qYWNrLnN0eWxlLndpZHRoXG4gICAgICA9IGNvbXAuamFjay5zdHlsZS5oZWlnaHRcbiAgICAgID0gbWluICsgJ3B4J1xufVxuXG5mdW5jdGlvbiBzZXRQb3NpdGlvbiAoY29tcCwgY2xpY2tlZCkge1xuICBsZXQgY2hlY2tlZCA9IGNvbXAuY2hlY2tlZFxuICBjb25zdCBub2RlID0gY29tcC5ub2RlXG4gIGNvbnN0IGphY2sgPSBjb21wLmphY2tcblxuICBpZiAoY2xpY2tlZCAmJiBjaGVja2VkKSB7XG4gICAgY2hlY2tlZCA9IGZhbHNlXG4gIH1cbiAgZWxzZSBpZiAoY2xpY2tlZCAmJiAhY2hlY2tlZCkge1xuICAgIGNoZWNrZWQgPSB0cnVlXG4gIH1cblxuICBpZiAoY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgIGNvbXAuY2hlY2tlZCA9IHRydWVcblxuICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgamFjay5zdHlsZS5sZWZ0ID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkud2lkdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAtIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGphY2spLndpZHRoKSArICdweCdcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBqYWNrLnN0eWxlLmxlZnQgPSBwYXJzZUludChub2RlLmN1cnJlbnRTdHlsZVsnd2lkdGgnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoamFjay5jdXJyZW50U3R5bGVbJ3dpZHRoJ10pICsgJ3B4J1xuICAgIH1cblxuICAgIGNvbXAub3B0aW9ucy5jb2xvciAmJiBjb2xvcml6ZShjb21wKVxuICAgIHNldFNwZWVkKGNvbXApXG4gIH1cbiAgZWxzZSB7XG4gICAgY29tcC5jaGVja2VkID0gZmFsc2VcbiAgICBqYWNrLnN0eWxlLmxlZnQgPSAwXG4gICAgbm9kZS5zdHlsZS5ib3hTaGFkb3cgPSAnaW5zZXQgMCAwIDAgMCAnICsgY29tcC5vcHRpb25zLnNlY29uZGFyeUNvbG9yXG4gICAgbm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbXAub3B0aW9ucy5zZWNvbmRhcnlDb2xvclxuICAgIG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgID0gKGNvbXAub3B0aW9ucy5zZWNvbmRhcnlDb2xvciAhPT0gZGVmYXVsdHMuc2Vjb25kYXJ5Q29sb3IpXG4gICAgICAgICAgPyBjb21wLm9wdGlvbnMuc2Vjb25kYXJ5Q29sb3JcbiAgICAgICAgICA6ICcjZmZmJ1xuICAgIGphY2suc3R5bGUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgID0gKGNvbXAub3B0aW9ucy5qYWNrU2Vjb25kYXJ5Q29sb3IgIT09IGNvbXAub3B0aW9ucy5qYWNrQ29sb3IpXG4gICAgICAgICAgPyBjb21wLm9wdGlvbnMuamFja1NlY29uZGFyeUNvbG9yXG4gICAgICAgICAgOiBjb21wLm9wdGlvbnMuamFja0NvbG9yXG4gICAgc2V0U3BlZWQoY29tcClcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRTcGVlZCAoY29tcCkge1xuICBsZXQgc3dpdGNoZXJQcm9wID0ge31cbiAgY29uc3QgamFja1Byb3AgPSB7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiBjb21wLm9wdGlvbnMuc3BlZWQsXG4gICAgbGVmdDogY29tcC5vcHRpb25zLnNwZWVkLnJlcGxhY2UoL1thLXpdLywgJycpIC8gMiArICdzJ1xuICB9XG5cbiAgaWYgKGNvbXAuY2hlY2tlZCkge1xuICAgIHN3aXRjaGVyUHJvcCA9IHtcbiAgICAgIGJvcmRlcjogY29tcC5vcHRpb25zLnNwZWVkLFxuICAgICAgJ2JveC1zaGFkb3cnOiBjb21wLm9wdGlvbnMuc3BlZWQsXG4gICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGNvbXAub3B0aW9ucy5zcGVlZC5yZXBsYWNlKC9bYS16XS8sICcnKSAqIDMgKyAncydcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgc3dpdGNoZXJQcm9wID0ge1xuICAgICAgYm9yZGVyOiBjb21wLm9wdGlvbnMuc3BlZWQsXG4gICAgICAnYm94LXNoYWRvdyc6IGNvbXAub3B0aW9ucy5zcGVlZFxuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25pemUoY29tcC5ub2RlLCBzd2l0Y2hlclByb3ApXG4gIHRyYW5zaXRpb25pemUoY29tcC5qYWNrLCBqYWNrUHJvcClcbn1cblxuZnVuY3Rpb24gY29sb3JpemUgKGNvbXApIHtcbiAgY29uc3Qgbm9kZUhlaWdodCA9IGNvbXAubm9kZS5vZmZzZXRIZWlnaHQgLyAyXG5cbiAgY29tcC5ub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbXAub3B0aW9ucy5jb2xvclxuICBjb21wLm5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb21wLm9wdGlvbnMuY29sb3JcbiAgY29tcC5ub2RlLnN0eWxlLmJveFNoYWRvdyA9ICdpbnNldCAwIDAgMCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5vZGVIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ3B4ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcC5vcHRpb25zLmNvbG9yXG4gIGNvbXAuamFjay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb21wLm9wdGlvbnMuamFja0NvbG9yXG59XG5cbmZ1bmN0aW9uIGdldENsaWNrSGFuZGxlciAoY29tcCkge1xuICBpZiAoIWNvbXAuX2NsaWNrSGFuZGxlcikge1xuICAgIGNvbXAuX2NsaWNrSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFBvc2l0aW9uKGNvbXAsIHRydWUpXG4gICAgICBjb21wLmRpc3BhdGNoRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgdmFsdWU6IGNvbXAuY2hlY2tlZFxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXAuX2NsaWNrSGFuZGxlclxufVxuXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXG4gICAgdGhpcy5qYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc21hbGwnKVxuICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5qYWNrKVxuICAgIG5vZGUuY2xhc3NOYW1lID0gdGhpcy5vcHRpb25zLmNsYXNzTmFtZVxuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICB0aGlzLmF0dHIuZGlzYWJsZWQuY2FsbCh0aGlzLCB0aGlzLmRhdGEuYXR0ci5kaXNhYmxlZClcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIG9uQXBwZW5kICgpIHtcbiAgICBzZXRTaXplKHRoaXMpXG4gICAgc2V0UG9zaXRpb24odGhpcylcbiAgfSxcblxuICBlbmFibGUgKCkge1xuICAgIHRoaXMuZGlzYWJsZWQgJiYgKHRoaXMuZGlzYWJsZWQgPSBmYWxzZSlcbiAgICB0aGlzLm5vZGUuc3R5bGUub3BhY2l0eSA9IDFcbiAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnZXRDbGlja0hhbmRsZXIodGhpcykpXG4gIH0sXG5cbiAgZGlzYWJsZSAoKSB7XG4gICAgIXRoaXMuZGlzYWJsZWQgJiYgKHRoaXMuZGlzYWJsZWQgPSB0cnVlKVxuICAgIHRoaXMubm9kZS5zdHlsZS5vcGFjaXR5ID0gZGVmYXVsdHMuZGlzYWJsZWRPcGFjaXR5XG4gICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2V0Q2xpY2tIYW5kbGVyKHRoaXMpKVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGRpc2FibGVkOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHZhbCAmJiB2YWwgIT09ICdmYWxzZSdcbiAgICB0aGlzLmRpc2FibGVkID8gdGhpcy5kaXNhYmxlKCkgOiB0aGlzLmVuYWJsZSgpXG4gIH1cbn1cblxuY29uc3Qgc3R5bGUgPSB7XG4gIHdpZHRoOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2NhbGFibGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICBpZiAoaXNOYU4odmFsKSB8fCB2YWwgPCAwKSB7XG4gICAgICB2YWwgPSB0aGlzLm9wdGlvbnMud2lkdGhcbiAgICB9XG4gICAgdGhpcy53aWR0aCA9IHZhbFxuICAgIHRoaXMuc2V0U2l6ZSgpXG4gIH0sXG5cbiAgaGVpZ2h0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2NhbGFibGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICBpZiAoaXNOYU4odmFsKSB8fCB2YWwgPCAwKSB7XG4gICAgICB2YWwgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0XG4gICAgfVxuICAgIHRoaXMuaGVpZ2h0ID0gdmFsXG4gICAgdGhpcy5zZXRTaXplKClcbiAgfVxufVxuXG5jb25zdCBldmVudCA9IHtcbiAgY2hhbmdlOiB7XG4gICAgdXBkYXRvciAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuY2hlY2tlZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBleHRyYSAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdGhpcy5jaGVja2VkXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIGNoZWNrZWQ6IGlmIGlzIGNoZWNrZWQuXG4gIC8vICAgLSBkaXNhYmxlZDogaWYgdHJ1ZSwgdGhpcyBjb21wb25lbnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgaW50ZXJhY3Rpb24uXG4gIGZ1bmN0aW9uIFN3aXRjaCAoZGF0YSkge1xuICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMpXG4gICAgdGhpcy5jaGVja2VkID0gZGF0YS5hdHRyLmNoZWNrZWRcbiAgICAgICAgJiYgZGF0YS5hdHRyLmNoZWNrZWQgIT09ICdmYWxzZSdcbiAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgdGhpcy53aWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlaWdodFxuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgU3dpdGNoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFN3aXRjaC5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoU3dpdGNoLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChTd2l0Y2gucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcbiAgZXh0ZW5kKFN3aXRjaC5wcm90b3R5cGUsIHsgZXZlbnQgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdzd2l0Y2gnLCBTd2l0Y2gpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBnZXRQcm90byAoV2VleCkge1xuICBjb25zdCBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuICByZXR1cm4ge1xuICAgIGNyZWF0ZSAoKSB7XG4gICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtY29udGFpbmVyJylcbiAgICAgIG5vZGUuc3R5bGUudGV4dERlY29yYXRpb24gPSAnbm9uZSdcbiAgICAgIHJldHVybiBub2RlXG4gICAgfSxcblxuICAgIGJpbmRFdmVudHMgKGV2dHMpIHtcbiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgZm9yIGNsaWNrIGV2ZW50IHdpbGwgYmUgcHJvY2Vzc2VkXG4gICAgICAvLyBiZWZvcmUgdGhlIHVybCByZWRpcmVjdGlvbi5cbiAgICAgIENvbXBvbmVudC5wcm90b3R5cGUuYmluZEV2ZW50cy5jYWxsKHRoaXMsIGV2dHMpXG4gICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGlmIChldnQuX2FscmVhZHlGaXJlZCAmJiBldnQudGFyZ2V0ICE9PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnQgdGFyZ2V0IGlzIHRoaXMubm9kZSwgdGhlbiB0aGlzIGlzXG4gICAgICAgICAgLy8ganVzdCBhbm90aGVyIGNsaWNrIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBzYW1lXG4gICAgICAgICAgLy8gdGFyZ2V0LCBub3QgYSBoYW5kbGVyIGZvciBhIGJ1YmJsaW5nIHVwIGV2ZW50LFxuICAgICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBhIGJ1YmJsaW5nIHVwIGV2ZW50LCBhbmQgaXRcbiAgICAgICAgICAvLyBzaG91bGQgYmUgZGlzcmVnYXJkZWQuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZXZ0Ll9hbHJlYWR5RmlyZWQgPSB0cnVlXG4gICAgICAgIGxvY2F0aW9uLmhyZWYgPSB0aGlzLmhyZWZcbiAgICAgIH0uYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgaHJlZjogZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuKCdbd2ViLXJlbmRlcl0gaHJlZiBvZiA8YT4gc2hvdWxkIG5vdCBiZSBhIG51bGwgdmFsdWUuJylcbiAgICB9XG4gICAgdGhpcy5ocmVmID0gdmFsXG4gICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJywgdmFsKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIGhyZWZcbiAgZnVuY3Rpb24gQSAoZGF0YSkge1xuICAgIENvbXBvbmVudC5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cblxuICBBLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tcG9uZW50LnByb3RvdHlwZSlcbiAgZXh0ZW5kKEEucHJvdG90eXBlLCBnZXRQcm90byhXZWV4KSlcbiAgZXh0ZW5kKEEucHJvdG90eXBlLCB7IGF0dHIgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdhJywgQSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgSURfUFJFRklYID0gJ3dlZXhfZW1iZWRfJ1xuXG5sZXQgZ2V0UmFuZG9tXG5cbmZ1bmN0aW9uIF9nZW5lcmF0ZUlkICgpIHtcbiAgcmV0dXJuIElEX1BSRUZJWCArIGdldFJhbmRvbSgxMClcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5pZCA9IHRoaXMuaWRcbiAgICBub2RlLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCdcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGluaXRXZWV4ICgpIHtcbiAgICB0aGlzLmlkID0gX2dlbmVyYXRlSWQoKVxuICAgIHRoaXMubm9kZS5pZCA9IHRoaXMuaWRcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBhcHBJZDogdGhpcy5pZCxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBidW5kbGVVcmw6IHRoaXMuc291cmNlLFxuICAgICAgbG9hZGVyOiB0aGlzLmxvYWRlcixcbiAgICAgIGpzb25wQ2FsbGJhY2s6IHRoaXMuanNvbnBDYWxsYmFjayxcbiAgICAgIHdpZHRoOiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsXG4gICAgICByb290SWQ6IHRoaXMuaWQsXG4gICAgICBlbWJlZDogdHJ1ZVxuICAgIH1cbiAgICB3aW5kb3cud2VleC5pbml0KGNvbmZpZylcbiAgfSxcblxuICBkZXN0cm95V2VleCAoKSB7XG4gICAgdGhpcy5pZCAmJiB3aW5kb3cuZGVzdHJveUluc3RhbmNlKHRoaXMuaWQpXG4gICAgLy8gVE9ETzogdW5iaW5kIGV2ZW50cyBhbmQgY2xlYXIgZG9tcy5cbiAgICB0aGlzLm5vZGUuaW5uZXJIVE1MID0gJydcbiAgfSxcblxuICByZWxvYWRXZWV4ICgpIHtcbiAgICBpZiAodGhpcy5pZCkge1xuICAgICAgdGhpcy5kZXN0cm95V2VleCgpXG4gICAgICB0aGlzLmlkID0gbnVsbFxuICAgICAgdGhpcy5ub2RlLmlkID0gbnVsbFxuICAgICAgdGhpcy5ub2RlLmlubmVySFRNTCA9ICcnXG4gICAgfVxuICAgIHRoaXMuaW5pdFdlZXgoKVxuICB9XG59XG5cbi8vIG5vdCByZWNvbW1lbmRlZCwgYmVjYXVzZSBvZiB0aGUgbGVhayBvZiBtZW1vcnkuXG5jb25zdCBhdHRyID0ge1xuICBzcmM6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHRoaXMuc291cmNlID0gdmFsdWVcbiAgICB0aGlzLnJlbG9hZFdlZXgoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcbiAgZ2V0UmFuZG9tID0gV2VleC51dGlscy5nZXRSYW5kb21cblxuICBmdW5jdGlvbiBFbWJlZCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBjb25zdCBhdHRyID0gZGF0YS5hdHRyXG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIHRoaXMuc291cmNlID0gYXR0ci5zcmNcbiAgICAgIHRoaXMubG9hZGVyID0gYXR0ci5sb2FkZXIgfHwgJ3hocidcbiAgICAgIHRoaXMuanNvbnBDYWxsYmFjayA9IGF0dHIuanNvbnBDYWxsYmFja1xuICAgIH1cbiAgICBDb21wb25lbnQuY2FsbCh0aGlzLCBkYXRhLCBub2RlVHlwZSlcbiAgfVxuXG4gIEVtYmVkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tcG9uZW50LnByb3RvdHlwZSlcbiAgZXh0ZW5kKEVtYmVkLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChFbWJlZC5wcm90b3R5cGUsIHsgYXR0ciB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2VtYmVkJywgRW1iZWQpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBDU1NSdWxlICovXG5cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgJy4vc3Bpbm5lci5jc3MnXG5cbmxldCBsb29wQXJyYXksIGdldFJnYlxuXG5mdW5jdGlvbiBnZXRTdHlsZVNoZWV0IChzcGlubmVyKSB7XG4gIGlmIChzcGlubmVyLnN0eWxlU2hlZXQpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1xuICBsZXQgaSwgbCwgaiwgbVxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sYWJlbHMgKi9cbiAgb3V0ZXI6IGZvciAoaSA9IDAsIGwgPSBzdHlsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgcnVsZXMgPSBzdHlsZXNbaV0ucnVsZXNcbiAgICBpZiAoIXJ1bGVzKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBmb3IgKGogPSAwLCBtID0gcnVsZXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7XG4gICAgICBjb25zdCBpdGVtID0gcnVsZXMuaXRlbShqKVxuICAgICAgaWYgKFxuICAgICAgICAoaXRlbS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FU19SVUxFXG4gICAgICAgICAgfHwgaXRlbS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRVNfUlVMRSlcbiAgICAgICAgJiYgaXRlbS5uYW1lID09PSAnd2VleC1zcGlubmVyJykge1xuICAgICAgICBicmVhayBvdXRlclxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxhYmVscyAqL1xuICBzcGlubmVyLnN0eWxlU2hlZXQgPSBzdHlsZXNbaV1cbn1cblxuZnVuY3Rpb24gc2V0S2V5ZnJhbWVDb2xvciAoc3Bpbm5lciwgdmFsKSB7XG4gIGdldFN0eWxlU2hlZXQoc3Bpbm5lcilcbiAgY29uc3Qga2V5ZnJhbWVSdWxlcyA9IGNvbXB1dGVLZXlGcmFtZVJ1bGVzKHZhbClcbiAgY29uc3QgcnVsZXMgPSBzcGlubmVyLnN0eWxlU2hlZXQucnVsZXNcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBydWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gcnVsZXMuaXRlbShpKVxuICAgIGlmICgoaXRlbS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FU19SVUxFXG4gICAgICAgICAgfHwgaXRlbS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRVNfUlVMRSlcbiAgICAgICAgJiYgaXRlbS5uYW1lID09PSAnd2VleC1zcGlubmVyJykge1xuICAgICAgY29uc3QgY3NzUnVsZXMgPSBpdGVtLmNzc1J1bGVzXG4gICAgICBmb3IgKGxldCBqID0gMCwgbSA9IGNzc1J1bGVzLmxlbmd0aDsgaiA8IG07IGorKykge1xuICAgICAgICBjb25zdCBrZXlmcmFtZSA9IGNzc1J1bGVzW2pdXG4gICAgICAgIGlmIChrZXlmcmFtZS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FX1JVTEVcbiAgICAgICAgICB8fCBrZXlmcmFtZS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRV9SVUxFKSB7XG4gICAgICAgICAga2V5ZnJhbWUuc3R5bGUuYm94U2hhZG93ID0ga2V5ZnJhbWVSdWxlc1tqXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVLZXlGcmFtZVJ1bGVzIChyZ2IpIHtcbiAgaWYgKCFyZ2IpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBzY2FsZUFyciA9IFtcbiAgICAnMGVtIC0yLjZlbSAwZW0gMGVtJyxcbiAgICAnMS44ZW0gLTEuOGVtIDAgMGVtJyxcbiAgICAnMi41ZW0gMGVtIDAgMGVtJyxcbiAgICAnMS43NWVtIDEuNzVlbSAwIDBlbScsXG4gICAgJzBlbSAyLjVlbSAwIDBlbScsXG4gICAgJy0xLjhlbSAxLjhlbSAwIDBlbScsXG4gICAgJy0yLjZlbSAwZW0gMCAwZW0nLFxuICAgICctMS44ZW0gLTEuOGVtIDAgMGVtJ11cbiAgY29uc3QgY29sb3JBcnIgPSBbXG4gICAgJzEnLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjUnLFxuICAgICcwLjcnXS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiAncmdiYSgnICsgcmdiLnIgKyAnLCcgKyByZ2IuZyArICcsJyArIHJnYi5iICsgJywnICsgZSArICcpJ1xuICAgIH0pXG4gIGNvbnN0IHJ1bGVzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2FsZUFyci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRtcENvbG9yQXJyID0gbG9vcEFycmF5KGNvbG9yQXJyLCBpLCAncicpXG4gICAgcnVsZXMucHVzaChzY2FsZUFyci5tYXAoZnVuY3Rpb24gKHNjYWxlU3RyLCBpKSB7XG4gICAgICByZXR1cm4gc2NhbGVTdHIgKyAnICcgKyB0bXBDb2xvckFycltpXVxuICAgIH0pLmpvaW4oJywgJykpXG4gIH1cbiAgcmV0dXJuIHJ1bGVzXG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1zcGlubmVyLXdyYXAnKVxuICAgIHRoaXMuc3Bpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGhpcy5zcGlubmVyLmNsYXNzTGlzdC5hZGQoJ3dlZXgtZWxlbWVudCcpXG4gICAgdGhpcy5zcGlubmVyLmNsYXNzTGlzdC5hZGQoJ3dlZXgtc3Bpbm5lcicpXG4gICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLnNwaW5uZXIpXG4gICAgcmV0dXJuIG5vZGVcbiAgfVxufVxuXG5jb25zdCBzdHlsZSA9IHtcbiAgY29sb3I6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBjb25zdCByZ2IgPSBnZXRSZ2IodmFsKVxuICAgIGlmICghcmdiKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW3dlYi1yZW5kZXJdIGludmFsaWQgY29sb3IgdmFsdWU6JywgdmFsKVxuICAgIH1cbiAgICBzZXRLZXlmcmFtZUNvbG9yKHRoaXMsIHJnYilcbiAgfVxufVxuXG4vLyBTcGlubmVyLnByb3RvdHlwZS51cGRhdGVTdHlsZSA9IGZ1bmN0aW9uIChzdHlsZSkge1xuLy8gICBBdG9taWMucHJvdG90eXBlLnVwZGF0ZVN0eWxlLmNhbGwodGhpcywgc3R5bGUpXG4vLyAgIGlmIChzdHlsZSAmJiBzdHlsZS5jb2xvcikge1xuLy8gICAgIHRoaXMuc2V0S2V5ZnJhbWVDb2xvcihnbG9iYWwud2VleC51dGlscy5nZXRSZ2IodGhpcy5ub2RlLnN0eWxlLmNvbG9yKSlcbi8vICAgfVxuLy8gfVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG4gIGdldFJnYiA9IFdlZXgudXRpbHMuZ2V0UmdiXG4gIGxvb3BBcnJheSA9IFdlZXgudXRpbHMubG9vcEFycmF5XG5cbiAgZnVuY3Rpb24gU3Bpbm5lciAoZGF0YSkge1xuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgU3Bpbm5lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChTcGlubmVyLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChTcGlubmVyLnByb3RvdHlwZSwge1xuICAgIHN0eWxlOiBleHRlbmQoT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlLnN0eWxlKSwgc3R5bGUpXG4gIH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnc3Bpbm5lcicsIFNwaW5uZXIpXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2xvYWRpbmctaW5kaWNhdG9yJywgU3Bpbm5lcilcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmxldCBpc0FycmF5XG5cbmZ1bmN0aW9uIGhhbmRsZU1zZyAod2ViLCBldnQpIHtcbiAgbGV0IG1zZyA9IGV2dC5kYXRhXG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICBtc2cgPSBKU09OLnBhcnNlKG1zZylcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHt9XG4gIH1cbiAgaWYgKCFtc2cpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobXNnLnR5cGUgPT09ICd3ZWV4Jykge1xuICAgIGlmICghaXNBcnJheShtc2cuY29udGVudCkpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB3ZWV4IG1zZyByZWNlaXZlZCBieSB3ZWIgY29tcG9uZW50LidcbiAgICAgICAgKyAnIG1zZy5jb250ZW50IHNob3VsZCBiZSBhIGFycmF5OicsIG1zZy5jb250ZW50KVxuICAgIH1cbiAgICBjYWxsTmF0aXZlKHdlYi5nZXRDb21wb25lbnRNYW5hZ2VyKCkuaW5zdGFuY2VJZCwgbXNnLmNvbnRlbnQpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG8gKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGUgKCkge1xuICAgICAgLy8gSWZyYW1lJ3MgZGVmZWN0OiBjYW4ndCB1c2UgcG9zaXRpb246YWJzb2x1dGUgYW5kIHRvcCwgbGVmdCwgcmlnaHQsXG4gICAgICAvLyBib3R0b20gYWxsIHNldHRpbmcgdG8gemVybyBhbmQgdXNlIG1hcmdpbiB0byBsZWF2ZSBzcGVjaWZpZWRcbiAgICAgIC8vIGhlaWdodCBmb3IgYSBibGFuayBhcmVhLCBhbmQgaGF2ZSB0byB1c2UgMTAwJSB0byBmaWxsIHRoZSBwYXJlbnRcbiAgICAgIC8vIGNvbnRhaW5lciwgb3RoZXJ3aXNlIGl0IHdpbGwgdXNlIGEgdW53YW50ZWQgZGVmYXVsdCBzaXplIGluc3RlYWQuXG4gICAgICAvLyBUaGVyZWZvcmUgYSBkaXYgYXMgYSBpZnJhbWUgd3JhcHBlciBpcyBuZWVkZWQgaGVyZS5cbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgICB0aGlzLndlYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpXG4gICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMud2ViKVxuICAgICAgdGhpcy53ZWIuY2xhc3NMaXN0LmFkZCgnd2VleC1lbGVtZW50JylcbiAgICAgIHRoaXMud2ViLnN0eWxlLndpZHRoID0gJzEwMCUnXG4gICAgICB0aGlzLndlYi5zdHlsZS5oZWlnaHQgPSAnMTAwJSdcbiAgICAgIHRoaXMud2ViLnN0eWxlLmJvcmRlciA9ICdub25lJ1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9LFxuXG4gICAgYmluZEV2ZW50cyAoZXZ0cykge1xuICAgICAgQXRvbWljLnByb3RvdHlwZS5iaW5kRXZlbnRzLmNhbGwodGhpcywgZXZ0cylcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLndlYi5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5kaXNwYXRjaEV2ZW50KCdwYWdlZmluaXNoJywge1xuICAgICAgICAgIHVybDogdGhhdC53ZWIuc3JjXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNc2cuYmluZChudWxsLCB0aGlzKSlcbiAgICB9LFxuXG4gICAgZ29CYWNrICgpIHtcbiAgICAgIHRoaXMud2ViLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5iYWNrKClcbiAgICB9LFxuXG4gICAgZ29Gb3J3YXJkICgpIHtcbiAgICAgIHRoaXMud2ViLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5mb3J3YXJkKClcbiAgICB9LFxuXG4gICAgcmVsb2FkICgpIHtcbiAgICAgIHRoaXMud2ViLmNvbnRlbnRXaW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgc3JjOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy53ZWIuc3JjID0gdmFsXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3BhZ2VzdGFydCcsIHsgdXJsOiB2YWwgfSlcbiAgICB9LmJpbmQodGhpcyksIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuICBpc0FycmF5ID0gV2VleC51dGlscy5pc0FycmF5XG5cbiAgLy8gQSBjb21wb25lbnQgdG8gaW1wb3J0IHdlYiBwYWdlcywgd2hpY2ggd29ya3MgbGlrZVxuICAvLyBhIGlmcmFtZSBlbGVtZW50IG9yIGEgd2Vidmlldy5cbiAgLy8gYXR0cnM6XG4gIC8vICAgLSBzcmNcbiAgLy8gZXZlbnRzOlxuICAvLyAgIC0gcGFnZXN0YXJ0XG4gIC8vICAgLSBwYWdlZmluaXNoXG4gIC8vICAgLSBlcnJvclxuICBmdW5jdGlvbiBXZWIgKGRhdGEpIHtcbiAgICBBdG9taWMuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFdlYi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChXZWIucHJvdG90eXBlLCBnZXRQcm90byhXZWV4KSlcbiAgZXh0ZW5kKFdlYi5wcm90b3R5cGUsIHsgYXR0ciB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3dlYicsIFdlYilcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL25laWdoYm9yLmNzcydcblxuY29uc3QgREVGQVVMVF9JTlRFUlZBTCA9IDMwMDBcbmNvbnN0IERFRkFVTFRfTkVJR0hCT1JfU1BBQ0UgPSAyMFxuY29uc3QgREVGQVVMVF9ORUlHSEJPUl9BTFBIQSA9IDAuNlxuY29uc3QgREVGQVVMVF9ORUlHSEJPUl9TQ0FMRSA9IDAuOFxuXG5jb25zdCBUUkFOU0lUSU9OX0RVUkFUSU9OID0gNDAwXG5cbmNvbnN0IE1BSU5fU0xJREVfU0NBTEUgPSAwLjlcbmNvbnN0IE1BSU5fU0xJREVfT1BBQ0lUWSA9IDFcblxubGV0IGV4dGVuZCwgQ29tcG9uZW50XG5cbmZ1bmN0aW9uIGlkbGVXaGVuUGFnZURpc2FwcGVhciAoc2xpZGVyKSB7XG4gIGZ1bmN0aW9uIGhhbmRsZVBhZ2VTaG93ICgpIHtcbiAgICBzbGlkZXIuaXNQYWdlU2hvdyA9IHRydWVcbiAgICBzbGlkZXIuYXV0b1BsYXkgJiYgIXNsaWRlci5pc0RvbVJlbmRlcmluZyAmJiBzbGlkZXIucGxheSgpXG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlUGFnZUhpZGUgKCkge1xuICAgIHNsaWRlci5pc1BhZ2VTaG93ID0gZmFsc2VcbiAgICBzbGlkZXIuc3RvcCgpXG4gIH1cbiAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgaGFuZGxlUGFnZVNob3cpXG4gIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIGhhbmRsZVBhZ2VIaWRlKVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xuICAgICAgaGFuZGxlUGFnZVNob3coKVxuICAgIH1cbiAgICBlbHNlIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICBoYW5kbGVQYWdlSGlkZSgpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBpZGxlV2hlbkRvbVJlbmRlcmluZyAoc2xpZGVyKSB7XG4gIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2xpZGVyLmlzRG9tUmVuZGVyaW5nID0gZmFsc2VcbiAgICBzbGlkZXIuYXV0b1BsYXkgJiYgc2xpZGVyLmlzUGFnZVNob3cgJiYgc2xpZGVyLnBsYXkoKVxuICB9KVxuICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigncmVuZGVyYmVnaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgc2xpZGVyLmlzRG9tUmVuZGVyaW5nID0gdHJ1ZVxuICAgIHNsaWRlci5zdG9wKClcbiAgfSlcbn1cblxuZnVuY3Rpb24gX3JlbmRlckluZGljYXRvcnMgKHNsaWRlciwgY3QsIGRhdGEpIHtcbiAgZGF0YS5leHRyYS53aWR0aCA9IGRhdGEuc3R5bGUud2lkdGggfHwgc2xpZGVyLndpZHRoXG4gIGRhdGEuZXh0cmEuaGVpZ2h0ID0gZGF0YS5zdHlsZS5oZWlnaHQgfHwgc2xpZGVyLmhlaWdodFxuICBjb25zdCBpbmRpY2F0b3IgPSBzbGlkZXIuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmNyZWF0ZUVsZW1lbnQoZGF0YSlcbiAgaW5kaWNhdG9yLnBhcmVudFJlZiA9IHNsaWRlci5kYXRhLnJlZlxuICBpbmRpY2F0b3Iuc2xpZGVyID0gc2xpZGVyXG4gIHNsaWRlci5pbmRpY2F0b3IgPSBpbmRpY2F0b3JcbiAgY3QuYXBwZW5kQ2hpbGQoaW5kaWNhdG9yLm5vZGUpXG59XG5cbmZ1bmN0aW9uIHJlbmRlckluZGljYXRvcnMgKHNsaWRlciwgY3QsIGRhdGEpIHtcbiAgc2V0VGltZW91dCgoKSA9PiBfcmVuZGVySW5kaWNhdG9ycyhzbGlkZXIsIGN0LCBkYXRhKSwgMClcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5kaWNhdG9ycyAoc2xpZGVyKSB7XG4gIHNsaWRlci5pbmRpY2F0b3IgJiYgc2xpZGVyLmluZGljYXRvci5zZXRJbmRleChzbGlkZXIuY3VycmVudEluZGV4KVxufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uT25jZSAobm9kZSwgZHVyYXRpb24sIHRpbWluZ0Z1bmMpIHtcbiAgY29uc3QgdHJhbnNpdGlvblN0ciA9IGBhbGwgJHtkdXJhdGlvbn1tcyAke3RpbWluZ0Z1bmN9YFxuICBub2RlLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSB0cmFuc2l0aW9uU3RyXG4gIG5vZGUuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25TdHJcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJydcbiAgICBub2RlLnN0eWxlLnRyYW5zaXRpb24gPSAnJ1xuICB9LCBkdXJhdGlvbilcbn1cblxuZnVuY3Rpb24gYW5pbWF0ZVRyYW5zZm9ybSAobm9kZSwgc3R5bGUsIGR1cmF0aW9uLCB0aW1lRnVuY3Rpb24pIHtcbiAgdHJhbnNpdGlvbk9uY2Uobm9kZSwgZHVyYXRpb24gfHwgVFJBTlNJVElPTl9EVVJBVElPTiwgdGltZUZ1bmN0aW9uIHx8ICdlYXNlJylcbiAgZm9yIChjb25zdCBrIGluIHN0eWxlKSB7XG4gICAgbm9kZS5zdHlsZVtrXSA9IHN0eWxlW2tdXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtU2xpZGUgKHNsaWRlciwgaW5kZXgpIHtcbiAgY29uc3Qgbm9kZSA9IHNsaWRlci5zbGlkZXNbaW5kZXhdLm5vZGVcbiAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gc2xpZGVyLm5laWdoYm9yQWxwaGFcbiAgY29uc3QgdHJhbnNmb3JtU3RyID0gYHNjYWxlKCR7c2xpZGVyLm5laWdoYm9yU2NhbGV9KWBcbiAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1TdHJcbiAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1TdHJcbiAgbm9kZS5zdHlsZS53aWR0aCA9IHNsaWRlci53aWR0aCArICdweCdcbiAgbm9kZS5zdHlsZS5oZWlnaHQgPSBzbGlkZXIuaGVpZ2h0ICsgJ3B4J1xuICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBub2RlLnN0eWxlLnRvcCA9ICcwcHgnXG4gIG5vZGUuc3R5bGUubGVmdCA9ICcwcHgnXG59XG5cbmZ1bmN0aW9uIGxvYWRJbWcgKHNsaWRlcikge1xuICBjb25zdCBpbWdzMSA9IHNsaWRlci5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpbWctc3JjXScpIHx8IFtdXG4gIGNvbnN0IGltZ3MyID0gc2xpZGVyLm5vZGUucXVlcnlTZWxlY3RvckFsbCgnW2ktbGF6eS1zcmNdJykgfHwgW11cbiAgZnVuY3Rpb24gbG9hZCAobm9kZSkge1xuICAgIGNvbnN0IHNyYyA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpbWctc3JjJykgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2ktbGF6eS1zcmMnKVxuICAgIGxpYi5pbWcuYXBwbHlTcmMobm9kZSwgc3JjLCBub2RlLmRhdGFzZXQucGxhY2Vob2xkZXIpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWdzMS5sZW5ndGg7IGkrKykge1xuICAgIGxvYWQoaW1nczFbaV0pXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWdzMi5sZW5ndGg7IGkrKykge1xuICAgIGxvYWQoaW1nczJbaV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gX2RvUmVuZGVyIChzbGlkZXIpIHtcbiAgbG9hZEltZyhzbGlkZXIpXG4gIHNsaWRlci50b3RhbCA9IHNsaWRlci5zbGlkZXMubGVuZ3RoXG4gIHNsaWRlci5jdXJyZW50SW5kZXggPSAwXG4gIGNvbnN0IHdpZHRoID0gc2xpZGVyLmRhdGEuc3R5bGUud2lkdGggfHwgMFxuICBjb25zdCBoZWlnaHQgPSBzbGlkZXIuZGF0YS5zdHlsZS5oZWlnaHQgfHwgMFxuICBzbGlkZXIud2lkdGggPSBwYXJzZUZsb2F0KHdpZHRoKSB8fCBzbGlkZXIubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICBzbGlkZXIuaGVpZ2h0ID0gcGFyc2VGbG9hdChoZWlnaHQpIHx8IHNsaWRlci5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuXG4gIGNvbnN0IGwgPSBzbGlkZXIuc2xpZGVzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHRyYW5zZm9ybVNsaWRlKHNsaWRlciwgaSlcbiAgfVxuXG4gIHNldFRpbWVvdXQoKCkgPT4gc2xpZGVyLnNsaWRlVG8oMCksIDApXG59XG5cbmZ1bmN0aW9uIGRvUmVuZGVyIChzbGlkZXIpIHtcbiAgc2V0VGltZW91dChfZG9SZW5kZXIuYmluZChudWxsLCBzbGlkZXIpLCAwKVxufVxuXG5mdW5jdGlvbiBsb29wSW5kZXggKGlkeCwgdG90YWwpIHtcbiAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICByZXR1cm4gKHRvdGFsICsgaWR4KSAlIHRvdGFsXG59XG5cbmZ1bmN0aW9uIGF1dG9QbGF5IChzbGlkZXIpIHtcbiAgY29uc3QgbmV4dCA9IHNsaWRlci5jdXJyZW50SW5kZXggKyAxXG4gIHNldFRpbWVvdXQoKCkgPT4gc2xpZGVyLnNsaWRlVG8obmV4dCksIDApXG4gIHNsaWRlci5wbGF5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGF1dG9QbGF5KHNsaWRlciksIHNsaWRlci5pbnRlcnZhbCArIFRSQU5TSVRJT05fRFVSQVRJT04pXG59XG5cbmZ1bmN0aW9uIHVzZUdlc3R1cmUgKHNsaWRlcikge1xuICBjb25zdCBub2RlID0gc2xpZGVyLm5vZGVcbiAgbGV0IGRpc3BsYWNlbWVudCwgcGFubmluZ1xuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncGFuc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghZS5pc1ZlcnRpY2FsKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIHNsaWRlci5zdG9wKClcbiAgICAgIHBhbm5pbmcgPSB0cnVlXG4gICAgICBkaXNwbGFjZW1lbnQgPSAwXG4gICAgfVxuICB9KVxuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncGFubW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFlLmlzVmVydGljYWwgJiYgcGFubmluZykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBjb25zdCBkaXNwbGFjZW1lbnQgPSBlLmRpc3BsYWNlbWVudFhcbiAgICAgIG1vdmVTbGlkZXMoc2xpZGVyLCBkaXNwbGFjZW1lbnQpXG4gICAgfVxuICB9KVxuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncGFuZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiBwYW5uaW5nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGRpc3BsYWNlbWVudCA9IGUuZGlzcGxhY2VtZW50WFxuICAgICAgaWYgKGUuaXNTd2lwZSkge1xuICAgICAgICBpZiAoZGlzcGxhY2VtZW50IDwgMCkge1xuICAgICAgICAgIHNsaWRlci5zbGlkZVRvTmV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc2xpZGVyLnNsaWRlVG9QcmV2KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhkaXNwbGFjZW1lbnQpIDwgc2xpZGVyLndpZHRoIC8gMikge1xuICAgICAgICAgIHNsaWRlci5zbGlkZVRvKHNsaWRlci5jdXJyZW50SW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlzcGxhY2VtZW50IDwgMCkge1xuICAgICAgICAgIHNsaWRlci5zbGlkZVRvTmV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc2xpZGVyLnNsaWRlVG9QcmV2KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFubmluZyA9IGZhbHNlXG4gICAgICBzbGlkZXIucGxheSgpXG4gICAgfVxuICB9KVxuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignc3dpcGUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghZS5pc1ZlcnRpY2FsKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1vdmVTbGlkZXMgKHNsaWRlciwgb2Zmc2V0KSB7XG4gIGNvbnN0IG1haW5UcmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKCR7b2Zmc2V0fXB4LCAwcHgpIHNjYWxlKCR7TUFJTl9TTElERV9TQ0FMRX0pYFxuICBjb25zdCBtYWluTm9kZSA9IHNsaWRlci5tYWluU2xpZGUubm9kZVxuICBtYWluTm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBtYWluVHJhbnNmb3JtU3RyXG4gIG1haW5Ob2RlLnN0eWxlLnRyYW5zZm9ybSA9IG1haW5UcmFuc2Zvcm1TdHJcblxuICBjb25zdCBsZWZ0VHJhbnNmb3JtU3RyID0gYHRyYW5zbGF0ZSgke3NsaWRlci5sZWZ0VHJhbnNsYXRlICsgb2Zmc2V0fXB4LCAwcHgpIHNjYWxlKCR7c2xpZGVyLm5laWdoYm9yU2NhbGV9KWBcbiAgY29uc3QgbGVmdE5vZGUgPSBzbGlkZXIubGVmdFNsaWRlLm5vZGVcbiAgbGVmdE5vZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gbGVmdFRyYW5zZm9ybVN0clxuICBsZWZ0Tm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBsZWZ0VHJhbnNmb3JtU3RyXG5cbiAgY29uc3QgcmlnaHRUcmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKCR7c2xpZGVyLnJpZ2h0VHJhbnNsYXRlICsgb2Zmc2V0fXB4LCAwcHgpIHNjYWxlKCR7c2xpZGVyLm5laWdoYm9yU2NhbGV9KWBcbiAgY29uc3QgcmlnaHROb2RlID0gc2xpZGVyLnJpZ2h0U2xpZGUubm9kZVxuICByaWdodE5vZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gcmlnaHRUcmFuc2Zvcm1TdHJcbiAgcmlnaHROb2RlLnN0eWxlLnRyYW5zZm9ybSA9IHJpZ2h0VHJhbnNmb3JtU3RyXG59XG5cbmZ1bmN0aW9uIHJlc2V0U2lkZVNsaWRlUG9zIChzbGlkZXIsIHNpZGUpIHtcbiAgY29uc3Qgc2lnbk1hcCA9IHsgbGVmdDogJy0nLCByaWdodDogJycgfVxuICBjb25zdCB0cmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKCR7c2lnbk1hcFtzaWRlXSArIHNsaWRlci53aWR0aH1weCwgMHB4KWBcbiAgY29uc3Qgbm9kZSA9IHNsaWRlcltzaWRlICsgJ1NsaWRlJ10ubm9kZVxuICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVN0clxuICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVN0clxufVxuXG5mdW5jdGlvbiByZXNldE91dHNpZGVTbGlkZXMgKHNsaWRlciwgaW5kZXhBcnIpIHtcbiAgaW5kZXhBcnIgPSBpbmRleEFyciB8fCBbXVxuICBjb25zdCBsID0gc2xpZGVyLnNsaWRlcy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoaW5kZXhBcnIuaW5kZXhPZihpKSA8PSAtMSkge1xuICAgICAgc2xpZGVyLnNsaWRlc1tpXS5ub2RlLnN0eWxlLm9wYWNpdHkgPSAwXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3NsaWRlci1uZWlnaGJvcicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgdGhpcy5zdHlsZS5mbGV4RGlyZWN0aW9uLmNhbGwodGhpcywgJ3JvdycpXG4gICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSdcbiAgICBub2RlLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGNyZWF0ZUNoaWxkcmVuICgpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcblxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjaGlsZHJlbltpXVxuICAgICAgICBkYXRhLmluc3RhbmNlSWQgPSB0aGlzLmRhdGEuaW5zdGFuY2VJZFxuICAgICAgICAvLyAnaW5kaWNhdG9yJyBtYXliZSB0aGUgbGFzdCBjaGlsZCBvZiB0aGlzIGNvbXBvbmVudC5cbiAgICAgICAgaWYgKGRhdGEudHlwZSAhPT0gJ2luZGljYXRvcicpIHtcbiAgICAgICAgICBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChkYXRhKVxuICAgICAgICAgIGNoaWxkLm5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1uZWlnaGJvci1pdGVtJylcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IChkYXRhLnN0eWxlIHx8IHt9KS53aWR0aCB8fCB0aGlzLmRhdGEuc3R5bGUud2lkdGhcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSAoZGF0YS5zdHlsZSB8fCB7fSkuaGVpZ2h0IHx8IHRoaXMuZGF0YS5zdHlsZS5oZWlnaHRcbiAgICAgICAgICBjaGlsZC5ub2RlLnN0eWxlLm1hcmdpblRvcCA9IC0oaGVpZ2h0IC8gMikgKyAncHgnXG4gICAgICAgICAgY2hpbGQubm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gLSh3aWR0aCAvIDIpICsgJ3B4J1xuICAgICAgICAgIHRoaXMuc2xpZGVzLnB1c2goY2hpbGQpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICAgICAgICBjaGlsZC5wYXJlbnRSZWYgPSB0aGlzLmRhdGEucmVmXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmVuZGVySW5kaWNhdG9ycyh0aGlzLCBmcmFnbWVudCwgZXh0ZW5kKGRhdGEsIHtcbiAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogY2hpbGRyZW4ubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgaW5kZXg6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtdKVxuICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGZyYWdtZW50KVxuICAgICAgZG9SZW5kZXIodGhpcylcbiAgICB9XG4gIH0sXG5cbiAgYXBwZW5kQ2hpbGQgKGRhdGEpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGxldCBjaGlsZFxuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2luZGljYXRvcicpIHtcbiAgICAgIHJlbmRlckluZGljYXRvcnModGhpcywgdGhpcy5ub2RlLCBleHRlbmQoZGF0YSwge1xuICAgICAgICBleHRyYToge1xuICAgICAgICAgIGFtb3VudDogY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICAgIGluZGV4OiB0aGlzLmN1cnJlbnRJbmRleFxuICAgICAgICB9XG4gICAgICB9KSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChkYXRhKVxuICAgICAgY2hpbGQubm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LW5laWdoYm9yLWl0ZW0nKVxuICAgICAgY29uc3Qgd2lkdGggPSAoZGF0YS5zdHlsZSB8fCB7fSkud2lkdGggfHwgdGhpcy5kYXRhLnN0eWxlLndpZHRoXG4gICAgICBjb25zdCBoZWlnaHQgPSAoZGF0YS5zdHlsZSB8fCB7fSkuaGVpZ2h0IHx8IHRoaXMuZGF0YS5zdHlsZS5oZWlnaHRcbiAgICAgIGNoaWxkLm5vZGUuc3R5bGUubWFyZ2luVG9wID0gLShoZWlnaHQgLyAyKSArICdweCdcbiAgICAgIGNoaWxkLm5vZGUuc3R5bGUubWFyZ2luTGVmdCA9IC0od2lkdGggLyAyKSArICdweCdcbiAgICAgIHRoaXMuc2xpZGVzLnB1c2goY2hpbGQpXG4gICAgICByZXNldE91dHNpZGVTbGlkZXModGhpcywgW10pXG4gICAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICB9XG5cbiAgICBkb1JlbmRlcih0aGlzKVxuXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRhdGEuY2hpbGRyZW4gPSBbZGF0YV1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkIHx8IHRoaXMuaW5kaWNhdG9yXG4gIH0sXG5cbiAgaW5zZXJ0QmVmb3JlIChjaGlsZCwgYmVmb3JlKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgICBsZXQgaSA9IDBcbiAgICBsZXQgc2xpZGVzSWR4ID0gMFxuICAgIGxldCBpc0FwcGVuZCA9IGZhbHNlXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8ICFiZWZvcmUpIHtcbiAgICAgIGlzQXBwZW5kID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gYmVmb3JlLmRhdGEucmVmKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRyZW5baV0udHlwZSAhPT0gJ2luZGljYXRvcicpIHtcbiAgICAgICAgICBzbGlkZXNJZHgrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbCkge1xuICAgICAgICBpc0FwcGVuZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZC5ub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtbmVpZ2hib3ItaXRlbScpXG4gICAgY29uc3QgZGF0YSA9IGNoaWxkLmRhdGFcbiAgICBjb25zdCB3aWR0aCA9IChkYXRhLnN0eWxlIHx8IHt9KS53aWR0aCB8fCB0aGlzLmRhdGEuc3R5bGUud2lkdGhcbiAgICBjb25zdCBoZWlnaHQgPSAoZGF0YS5zdHlsZSB8fCB7fSkuaGVpZ2h0IHx8IHRoaXMuZGF0YS5zdHlsZS5oZWlnaHRcbiAgICBjaGlsZC5ub2RlLnN0eWxlLm1hcmdpblRvcCA9IC0oaGVpZ2h0IC8gMikgKyAncHgnXG4gICAgY2hpbGQubm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gLSh3aWR0aCAvIDIpICsgJ3B4J1xuICAgIGlmIChpc0FwcGVuZCkge1xuICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG4gICAgICB0aGlzLnNsaWRlcy5wdXNoKGNoaWxkKVxuICAgICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtdKVxuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZC5kYXRhKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLm5vZGUpXG4gICAgICB0aGlzLnNsaWRlcy5zcGxpY2Uoc2xpZGVzSWR4LCAwLCBjaGlsZClcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAwLCBjaGlsZC5kYXRhKVxuICAgIH1cblxuICAgIGRvUmVuZGVyKHRoaXMpXG4gIH0sXG5cbiAgcmVtb3ZlQ2hpbGQgKGNoaWxkKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgICBsZXQgaSA9IDBcbiAgICBsZXQgc2xpZGVzSWR4ID0gMFxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gY2hpbGQuZGF0YS5yZWYpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS50eXBlICE9PSAnaW5kaWNhdG9yJykge1xuICAgICAgICAgIHNsaWRlc0lkeCsrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgbCkge1xuICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSlcbiAgICAgICAgdGhpcy5zbGlkZXMuc3BsaWNlKHNsaWRlc0lkeCwgMSlcbiAgICAgICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtdKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLnJlbW92ZUNvbXBvbmVudChjaGlsZC5kYXRhLnJlZilcbiAgICBjaGlsZC5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQubm9kZSlcblxuICAgIGRvUmVuZGVyKHRoaXMpXG4gIH0sXG5cbiAgb25BcHBlbmQgKCkge1xuICAgIHRoaXMuc2xpZGVUbygwKVxuICAgIHVzZUdlc3R1cmUodGhpcylcbiAgICBDb21wb25lbnQucHJvdG90eXBlLm9uQXBwZW5kLmNhbGwodGhpcylcbiAgfSxcblxuICBwbGF5ICgpIHtcbiAgICAvLyBzdGFydCBwbGF5aW5nXG4gICAgdGhpcy5wbGF5VGltZXIgJiYgY2xlYXJUaW1lb3V0KHRoaXMucGxheVRpbWVyKVxuICAgIGlmICh0aGlzLnBsYXlzdGF0dXMvKiAmJiAhdGhpcy50b2dnbGVPZmYqLykge1xuICAgICAgdGhpcy5wbGF5VGltZXIgPSBzZXRUaW1lb3V0KGF1dG9QbGF5LmJpbmQobnVsbCwgdGhpcyksIHRoaXMuaW50ZXJ2YWwpXG4gICAgfVxuICB9LFxuXG4gIHN0b3AgKCkge1xuICAgIC8vIHN0b3AgcGxheWluZ1xuICAgIHRoaXMucGxheVRpbWVyICYmIGNsZWFyVGltZW91dCh0aGlzLnBsYXlUaW1lcilcbiAgfSxcblxuICBzbGlkZVRvIChpbmRleCwgcmVzdGFydEF1dG9wbGF5KSB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnNsaWRlcy5sZW5ndGhcbiAgICBpZiAodG90YWwgPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAocmVzdGFydEF1dG9wbGF5KSB7XG4gICAgICB0aGlzLnN0b3AoKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnBsYXkoKSwgMTAwKVxuICAgIH1cbiAgICBjb25zdCBvcmlnSWR4ID0gaW5kZXhcbiAgICBpbmRleCA9IGxvb3BJbmRleChvcmlnSWR4LCB0b3RhbClcbiAgICBjb25zdCBsZWZ0SW5kZXggPSBsb29wSW5kZXgoaW5kZXggLSAxLCB0b3RhbClcbiAgICBjb25zdCByaWdodEluZGV4ID0gbG9vcEluZGV4KGluZGV4ICsgMSwgdG90YWwpXG5cbiAgICB0aGlzLm1haW5TbGlkZSA9IHRoaXMuc2xpZGVzW2luZGV4XVxuICAgIHRoaXMubGVmdFNsaWRlID0gdGhpcy5zbGlkZXNbbG9vcEluZGV4KGluZGV4IC0gMSwgdG90YWwpXVxuICAgIHRoaXMucmlnaHRTbGlkZSA9IHRoaXMuc2xpZGVzW2xvb3BJbmRleChpbmRleCArIDEsIHRvdGFsKV1cblxuICAgIGNvbnN0IG1haW5UcmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKDBweCwgMHB4KSBzY2FsZSgke01BSU5fU0xJREVfU0NBTEV9KWBcbiAgICBzZXRUaW1lb3V0KCgpID0+IGFuaW1hdGVUcmFuc2Zvcm0odGhpcy5tYWluU2xpZGUubm9kZSwge1xuICAgICAgd2Via2l0VHJhbnNmb3JtOiBtYWluVHJhbnNmb3JtU3RyLFxuICAgICAgdHJhbnNmb3JtOiBtYWluVHJhbnNmb3JtU3RyLFxuICAgICAgb3BhY2l0eTogTUFJTl9TTElERV9PUEFDSVRZLFxuICAgICAgekluZGV4OiA5OVxuICAgIH0pLCAxMDApXG5cbiAgICBjb25zdCB0cmFuc2xhdGVYID0gdGhpcy53aWR0aFxuICAgICAgLSB0aGlzLndpZHRoICogKDEgLSB0aGlzLm5laWdoYm9yU2NhbGUpIC8gMlxuICAgICAgLSB0aGlzLm5laWdoYm9yU3BhY2VcbiAgICB0aGlzLmxlZnRUcmFuc2xhdGUgPSAtdHJhbnNsYXRlWFxuICAgIHRoaXMucmlnaHRUcmFuc2xhdGUgPSB0cmFuc2xhdGVYXG5cbiAgICBpZiAob3JpZ0lkeCA+IHRoaXMuY3VycmVudEluZGV4KSB7XG4gICAgICByZXNldFNpZGVTbGlkZVBvcyh0aGlzLCAncmlnaHQnKVxuICAgIH1cbiAgICBlbHNlIGlmIChvcmlnSWR4IDwgdGhpcy5jdXJyZW50SW5kZXgpIHtcbiAgICAgIHJlc2V0U2lkZVNsaWRlUG9zKHRoaXMsICdsZWZ0JylcbiAgICB9XG5cbiAgICBjb25zdCBsZWZ0VHJhbnNmb3JtU3RyID0gYHRyYW5zbGF0ZSgkey10cmFuc2xhdGVYICsgJ3B4J30sIDBweCkgc2NhbGUoJHt0aGlzLm5laWdoYm9yU2NhbGV9KWBcbiAgICBzZXRUaW1lb3V0KCgpID0+IGFuaW1hdGVUcmFuc2Zvcm0odGhpcy5sZWZ0U2xpZGUubm9kZSwge1xuICAgICAgd2Via2l0VHJhbnNmb3JtOiBsZWZ0VHJhbnNmb3JtU3RyLFxuICAgICAgdHJhbnNmb3JtOiBsZWZ0VHJhbnNmb3JtU3RyLFxuICAgICAgb3BhY2l0eTogdGhpcy5uZWlnaGJvckFscGhhLFxuICAgICAgekluZGV4OiAxXG4gICAgfSksIDEwMClcblxuICAgIGNvbnN0IHJpZ2h0VHJhbnNmb3JtU3RyID0gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVggKyAncHgnfSwgMHB4KSBzY2FsZSgke3RoaXMubmVpZ2hib3JTY2FsZX0pYFxuICAgIHNldFRpbWVvdXQoKCkgPT4gYW5pbWF0ZVRyYW5zZm9ybSh0aGlzLnJpZ2h0U2xpZGUubm9kZSwge1xuICAgICAgd2Via2l0VHJhbnNmb3JtOiByaWdodFRyYW5zZm9ybVN0cixcbiAgICAgIHRyYW5zZm9ybTogcmlnaHRUcmFuc2Zvcm1TdHIsXG4gICAgICBvcGFjaXR5OiB0aGlzLm5laWdoYm9yQWxwaGEsXG4gICAgICB6SW5kZXg6IDFcbiAgICB9KSwgMTAwKVxuXG4gICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtpbmRleCwgbGVmdEluZGV4LCByaWdodEluZGV4XSlcblxuICAgIHRoaXMuY3VycmVudEluZGV4ID0gaW5kZXhcbiAgICB1cGRhdGVJbmRpY2F0b3JzKHRoaXMpXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjaGFuZ2UnLCB7IGluZGV4OiB0aGlzLmN1cnJlbnRJbmRleCB9KVxuICB9LFxuXG4gIHNsaWRlVG9QcmV2ICgpIHtcbiAgICB0aGlzLnNsaWRlVG8odGhpcy5jdXJyZW50SW5kZXggLSAxKVxuICB9LFxuXG4gIHNsaWRlVG9OZXh0ICgpIHtcbiAgICB0aGlzLnNsaWRlVG8odGhpcy5jdXJyZW50SW5kZXggKyAxKVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGludGVydmFsOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy5pbnRlcnZhbCA9IHBhcnNlSW50KHZhbCkgfHwgREVGQVVMVF9JTlRFUlZBTFxuICB9LFxuXG4gIGluZGV4OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgY29uc3QgX3RoaXMgPSB0aGlzXG4gICAgZnVuY3Rpb24gZG9TbGlkZSAoaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gcGFyc2VJbnQoaW5kZXgpXG4gICAgICBpZiAoaW5kZXggPCAwIHx8IGlzTmFOKGluZGV4KSkge1xuICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBpbmRleCAnLCBpbmRleClcbiAgICAgIH1cbiAgICAgIF90aGlzLnN0b3AoKVxuICAgICAgX3RoaXMuc2xpZGVUbyhpbmRleClcbiAgICAgIF90aGlzLmF1dG9QbGF5ICYmIF90aGlzLmlzUGFnZVNob3cgJiYgX3RoaXMucGxheSgpXG4gICAgICBpZiAoX3RoaXMuX3VwZGF0ZUluZGV4KSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBfdGhpcy5fdXBkYXRlSW5kZXgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRG9tUmVuZGVyaW5nKSB7XG4gICAgICBjb25zdCBwcmUgPSAhIXRoaXMuX3VwZGF0ZUluZGV4XG4gICAgICB0aGlzLl91cGRhdGVJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZG9TbGlkZSh2YWwpXG4gICAgICB9XG4gICAgICAhcHJlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCB0aGlzLl91cGRhdGVJbmRleClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkb1NsaWRlKHZhbClcbiAgICB9XG4gIH0sXG5cbiAgcGxheXN0YXR1czogZnVuY3Rpb24gKHZhbCkge1xuICAgIGNvbnN0IF90aGlzID0gdGhpc1xuICAgIHRoaXMucGxheXN0YXR1cyA9IHZhbCAmJiB2YWwgIT09ICdmYWxzZSdcbiAgICB0aGlzLmF1dG9QbGF5ID0gdGhpcy5wbGF5c3RhdHVzXG5cbiAgICBmdW5jdGlvbiBkb1BsYXkgKCkge1xuICAgICAgX3RoaXMuaXNQYWdlU2hvdyAmJiBfdGhpcy5wbGF5KClcbiAgICAgIGlmIChfdGhpcy5fdXBkYXRlUGxheXN0YXR1cykge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVuZGVyZW5kJywgX3RoaXMuX3VwZGF0ZVBsYXlzdGF0dXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxheXN0YXR1cykge1xuICAgICAgaWYgKHRoaXMuaXNEb21SZW5kZXJpbmcpIHtcbiAgICAgICAgY29uc3QgcHJlID0gISF0aGlzLl91cGRhdGVQbGF5c3RhdHVzXG4gICAgICAgIHRoaXMuX3VwZGF0ZVBsYXlzdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG9QbGF5KClcbiAgICAgICAgfVxuICAgICAgICAhcHJlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCB0aGlzLl91cGRhdGVQbGF5c3RhdHVzKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGRvUGxheSgpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5zdG9wKClcbiAgICB9XG4gIH0sXG5cbiAgLy8gc3VwcG9ydCBwbGF5c3RhdHVzJyBhbGlhcyBhdXRvLXBsYXkgZm9yIGNvbXBhdGliaWxpdHlcbiAgYXV0b1BsYXk6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLmF0dHIucGxheXN0YXR1cy5jYWxsKHRoaXMsIHZhbClcbiAgfSxcblxuICBuZWlnaGJvclNwYWNlICh2YWwpIHtcbiAgICBjb25zdCBucyA9IHBhcnNlRmxvYXQodmFsKVxuICAgIGlmICghaXNOYU4obnMpICYmIG5zID49IDApIHtcbiAgICAgIHRoaXMubmVpZ2hib3JTcGFjZSA9IG5zXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbaDUtcmVuZGVyXSBpbnZhbGlkIHZhbHVlIGZvciAnbmVpZ2hib3Itc3BhY2UnIG9mIHNsaWRlci1uZWlnaGJvcjogJHt2YWx9LmApXG4gICAgfVxuICB9LFxuXG4gIG5laWdoYm9yQWxwaGEgKHZhbCkge1xuICAgIGNvbnN0IG5hID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKCFpc05hTihuYSkgJiYgbmEgPj0gMCAmJiBuYSA8PSAxKSB7XG4gICAgICB0aGlzLm5laWdoYm9yQWxwaGEgPSBuYVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gaW52YWxpZCB2YWx1ZSBmb3IgJ25laWdoYm9yLWFscGhhJyBvZiBzbGlkZXItbmVpZ2hib3I6ICR7dmFsfS5gKVxuICAgIH1cbiAgfSxcblxuICBuZWlnaGJvclNjYWxlICh2YWwpIHtcbiAgICBjb25zdCBucyA9IHBhcnNlRmxvYXQodmFsKVxuICAgIGlmICghaXNOYU4obnMpICYmIG5zID49IDAgJiYgbnMgPD0gMSkge1xuICAgICAgdGhpcy5uZWlnaGJvclNjYWxlID0gbnNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtoNS1yZW5kZXJdIGludmFsaWQgdmFsdWUgZm9yICduZWlnaGJvci1zY2FsZScgb2Ygc2xpZGVyLW5laWdoYm9yOiAke3ZhbH0uYClcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZXZlbnQgPSB7XG4gIGNoYW5nZToge1xuICAgIHVwZGF0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgaW5kZXg6IHRoaXMuY3VycmVudEluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuICBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIC8qKlxuICAgKiBkYXRhLmF0dHJcbiAgICogc3VwcG9ydCBzbGlkZXIncyBhdHRyaWJ1dGVzIGFuZCB0aHJlZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbmVpZ2hib3Itc3BhY2UgMCAtIDM3NSwgdGhlIGV4cG9zaW5nIHdpZHRoIG9mIHNsaWRlcyBvbiBib3RoIG90aGVyIHNpZGVzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmVpZ2hib3ItYWxwaGEgMCAtIDEsIG9wYWNpdHkgb2YgYm90aCBvdGhlciBzaWRlcyBvZiBzbGlkZXMsIGRlZmF1bHQgaXMgMC42LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmVpZ2hib3Itc2NhbGUgMCAtIDEsIHRoZSBzY2FsZSBvZiBib3RoIG90aGVyIHNpZGVzIG9mIHNsaWRlcywgZGVmYXVsdCBpcyAwLjguXG4gICAqL1xuICBmdW5jdGlvbiBTbGlkZXJOZWlnaGJvciAoZGF0YSkge1xuICAgIHRoaXMuYXV0b1BsYXkgPSBmYWxzZSAgLy8gZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS5cbiAgICB0aGlzLmludGVydmFsID0gREVGQVVMVF9JTlRFUlZBTFxuICAgIHRoaXMuZGlyZWN0aW9uID0gJ3JvdycgLy8gJ2NvbHVtbicgaXMgbm90IHRlbXBvcmFyaWx5IHN1cHBvcnRlZC5cbiAgICB0aGlzLnNsaWRlcyA9IFtdXG4gICAgdGhpcy5pc1BhZ2VTaG93ID0gdHJ1ZVxuICAgIHRoaXMuaXNEb21SZW5kZXJpbmcgPSB0cnVlXG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSAwXG5cbiAgICB0aGlzLm5laWdoYm9yU3BhY2UgPSBERUZBVUxUX05FSUdIQk9SX1NQQUNFXG4gICAgdGhpcy5uZWlnaGJvckFscGhhID0gREVGQVVMVF9ORUlHSEJPUl9BTFBIQVxuICAgIHRoaXMubmVpZ2hib3JTY2FsZSA9IERFRkFVTFRfTkVJR0hCT1JfU0NBTEVcblxuICAgIC8vIGJpbmQgZXZlbnQgJ3BhZ2VzaG93JywgJ3BhZ2VoaWRlJyBhbmQgJ3Zpc2liaWxpdHljaGFuZ2UnIG9uIHdpbmRvdy5cbiAgICBpZGxlV2hlblBhZ2VEaXNhcHBlYXIodGhpcylcbiAgICAvLyBiaW5kIGV2ZW50ICdyZW5kZXJCZWdpbicgYW5kICdyZW5kZXJFbmQnIG9uIHdpbmRvdy5cbiAgICBpZGxlV2hlbkRvbVJlbmRlcmluZyh0aGlzKVxuXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBTbGlkZXJOZWlnaGJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChTbGlkZXJOZWlnaGJvci5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoU2xpZGVyTmVpZ2hib3IucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKFNsaWRlck5laWdoYm9yLnByb3RvdHlwZSwgeyBldmVudCB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3NsaWRlci1uZWlnaGJvcicsIFNsaWRlck5laWdoYm9yKVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgZGlzcGxheU1hcCA9IHtcbiAgYTogJ2lubGluZScsXG4gIGltYWdlOiAnaW5saW5lLWJsb2NrJyxcbiAgc3BhbjogJ2lubGluZS1ibG9jaydcbn1cblxuY29uc3QgdHlwZU1hcCA9IHtcbiAgYTogJ2EnLFxuICBpbWFnZTogJ2ltYWdlJyxcbiAgc3BhbjogJ3RleHQnXG59XG5cbmxldCBfcmljaFRleHROb2RlUmVmID0gMFxuY29uc3QgZ2V0UmljaFRleHROb2RlUmVmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYHJ0bi0ke19yaWNoVGV4dE5vZGVSZWYrK31gXG59XG5cbmZ1bmN0aW9uIF9pc0FycmF5IChhcnIpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpLnNsaWNlKDgsIC0xKSA9PT0gJ0FycmF5J1xufVxuXG5mdW5jdGlvbiBfaXNQbGFpbk9iamVjdCAob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSkgPT09ICdPYmplY3QnXG59XG5cbmZ1bmN0aW9uIF9wYXJzZSAocGFyZW50LCBwYXJlbnROb2RlLCB2YWx1ZSkge1xuICBpZiAoX2lzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZvckVhY2goKG5vZGUpID0+IF9wYXJzZShwYXJlbnQsIHBhcmVudE5vZGUsIG5vZGUpKVxuICB9XG4gIGlmIChfaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBjb25zdCB7IHR5cGUsIGF0dHIsIHN0eWxlLCBjaGlsZHJlbiB9ID0gdmFsdWVcbiAgICAvLyBkb24ndCBwYXNzIGNoaWxkcmVuIHRvIGNvbXBvbm5lbnQncyBvd24gYGNyZWF0ZUNoaWxkcmVuYCBtZXRob2QuXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXJlJ3Mgbm8gY2hhbmNlIHRvIHNldCBjaGlsZHJlbidzIGRpc3BsYXkgdG8gYGlubGluZWAuXG4gICAgZGVsZXRlIHZhbHVlLmNoaWxkcmVuXG4gICAgY29uc3QgY29tcCA9IHBhcmVudC5nZXRDb21wb25lbnRNYW5hZ2VyKCkuY3JlYXRlRWxlbWVudCh7XG4gICAgICB0eXBlOiB0eXBlTWFwW3R5cGVdLFxuICAgICAgcmVmOiBnZXRSaWNoVGV4dE5vZGVSZWYoKSxcbiAgICAgIGF0dHIsXG4gICAgICBzdHlsZVxuICAgIH0pXG4gICAgY29tcC5ub2RlLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5TWFwW3R5cGVdXG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjb21wLm5vZGUpXG4gICAgaWYgKF9pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IF9wYXJzZShjb21wLCBjb21wLm5vZGUsIGNoaWxkKSlcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWVsZW1lbnQnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1yaWNodGV4dCcpXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcblxuICBwYXJzZSAoKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKVxuICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLm5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpKVxuICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIF9wYXJzZSh0aGlzLCB0aGlzLm5vZGUsIHRoaXMudmFsdWUpXG4gIH1cbn1cblxuLy8gdXBkYXRhYmxlIGF0dHJpYnV0ZXNcbmNvbnN0IGF0dHIgPSB7XG4gIHZhbHVlICh2YWwpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsXG4gICAgdGhpcy5wYXJzZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIC8qKlxuICAgKiBhdHRyczpcbiAgICogIC0gdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIFJpY2hUZXh0IChkYXRhKSB7XG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBSaWNoVGV4dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChSaWNoVGV4dC5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoUmljaFRleHQucHJvdG90eXBlLCB7IGF0dHIgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdyaWNodGV4dCcsIFJpY2hUZXh0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBjb25maWc6XG4gKiAgIC0gc3R5bGVzXG4gKiAgIC0gZHVyYXRpb24gW051bWJlcl0gbWlsbGlzZWNvbmRzKG1zKVxuICogICAtIHRpbWluZ0Z1bmN0aW9uIFtzdHJpbmddXG4gKiAgIC0gZGVhbHkgW051bWJlcl0gbWlsbGlzZWNvbmRzKG1zKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNpdGlvbk9uY2UgKGNvbXAsIGNvbmZpZywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc3R5bGVzID0gY29uZmlnLnN0eWxlcyB8fCB7fVxuICBjb25zdCBkdXJhdGlvbiA9IGNvbmZpZy5kdXJhdGlvbiB8fCAxMDAwIC8vIG1zXG4gIGNvbnN0IHRpbWluZ0Z1bmN0aW9uID0gY29uZmlnLnRpbWluZ0Z1bmN0aW9uIHx8ICdlYXNlJ1xuICBjb25zdCBkZWxheSA9IGNvbmZpZy5kZWxheSB8fCAwICAvLyBtc1xuICBjb25zdCB0cmFuc2l0aW9uVmFsdWUgPSAnYWxsICcgKyBkdXJhdGlvbiArICdtcyAnXG4gICAgICArIHRpbWluZ0Z1bmN0aW9uICsgJyAnICsgZGVsYXkgKyAnbXMnXG4gIGNvbnN0IGRvbSA9IGNvbXAubm9kZVxuICBjb25zdCB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgdHJhbnNpdGlvbkVuZEhhbmRsZXIpXG4gICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0cmFuc2l0aW9uRW5kSGFuZGxlcilcbiAgICBkb20uc3R5bGUudHJhbnNpdGlvbiA9ICcnXG4gICAgZG9tLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnJ1xuICAgIGNhbGxiYWNrKClcbiAgfVxuICBkb20uc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25WYWx1ZVxuICBkb20uc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9IHRyYW5zaXRpb25WYWx1ZVxuICBkb20uYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0VHJhbnNpdGlvbkVuZCcsIHRyYW5zaXRpb25FbmRIYW5kbGVyKVxuICBkb20uYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRyYW5zaXRpb25FbmRIYW5kbGVyKVxuICBjb21wLnVwZGF0ZVN0eWxlKHN0eWxlcylcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IHRyYW5zaXRpb25PbmNlIH0gZnJvbSAnLi9saWInXG5cbmNvbnN0IF9kYXRhID0ge31cblxuY29uc3QgYW5pbWF0aW9uID0ge1xuXG4gIC8qKlxuICAgKiB0cmFuc2l0aW9uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcmVmICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge29ian0gY29uZmlnICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge3N0cmluZ30gY2FsbGJhY2tJZCBbZGVzY3JpcHRpb25dXG4gICAqL1xuICB0cmFuc2l0aW9uOiBmdW5jdGlvbiAocmVmLCBjb25maWcsIGNhbGxiYWNrSWQpIHtcbiAgICBsZXQgcmVmRGF0YSA9IF9kYXRhW3JlZl1cbiAgICBjb25zdCBzdHlsZXNLZXkgPSBKU09OLnN0cmluZ2lmeShjb25maWcuc3R5bGVzKVxuICAgIGNvbnN0IHdlZXhJbnN0YW5jZSA9IHRoaXNcbiAgICAvLyBJZiB0aGUgc2FtZSBjb21wb25lbnQgcGVyZm9ybSBhIGFuaW1hdGlvbiB3aXRoIGV4YWN0bHkgdGhlIHNhbWVcbiAgICAvLyBzdHlsZXMgaW4gYSBzZXF1ZW5jZSB3aXRoIHNvIHNob3J0IGludGVydmFsIHRoYXQgdGhlIHByZXYgYW5pbWF0aW9uXG4gICAgLy8gaXMgc3RpbGwgaW4gcGxheWluZywgdGhlbiB0aGUgbmV4dCBhbmltYXRpb24gc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgaWYgKHJlZkRhdGEgJiYgcmVmRGF0YVtzdHlsZXNLZXldKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFyZWZEYXRhKSB7XG4gICAgICByZWZEYXRhID0gX2RhdGFbcmVmXSA9IHt9XG4gICAgfVxuICAgIHJlZkRhdGFbc3R5bGVzS2V5XSA9IHRydWVcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldENvbXBvbmVudChyZWYpXG4gICAgcmV0dXJuIHRyYW5zaXRpb25PbmNlKGNvbXBvbmVudCwgY29uZmlnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIHN0eWxlc0tleSBpbiByZWZEYXRhIHNvIHRoYXQgdGhlIHNhbWUgYW5pbWF0aW9uXG4gICAgICAvLyBjYW4gYmUgcGxheWVkIGFnYWluIGFmdGVyIGN1cnJlbnQgYW5pbWF0aW9uIGlzIGFscmVhZHkgZmluaXNoZWQuXG4gICAgICBkZWxldGUgcmVmRGF0YVtzdHlsZXNLZXldXG4gICAgICB3ZWV4SW5zdGFuY2Uuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkKVxuICAgIH0pXG4gIH1cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgYW5pbWF0aW9uOiBbe1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnYW5pbWF0aW9uJywgYW5pbWF0aW9uLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG4vKipcblxuQVVDVElPTjpcbnRhc2tRdWV1ZVxuQ2xpcGJvYXJkLnNldFN0cmluZygpICBOT1cgbm90IHdvcmtzLCBmYWNpbmcgdG8gdXNlci1hY3QgbG9zZSBvZiB0YXNrUXVldWUuXG5cbndvcmtzIGluIENocm9tZSBGaXJlZm94IE9wZXJhLiBidXQgbm90IGluIFNhZmFyaS5cbkBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L2V4ZWNDb21tYW5kI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuXG5DbGlwYm9hcmQuZ2V0U3RyaW5nKCkgdW5pbXBsZW1lbnRlZC4gVGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gZG8gcGFzdGUgZnJvbSBjbGlwYm9hcmQgdG8ganMgdmFyaWFibGUuXG5cblNvIGxvb2sgb3V0IHlvdXIgYXBwIGJlaGF2aW9yLCB3aGVuIGRvd25ncmFkZSB0byBodG1sNSByZW5kZXIuXG5BbnkgaWRlYSBpcyB3ZWxjb21lLlxuKiovXG5cbmNvbnN0IFdFRVhfQ0xJUEJPQVJEX0lEID0gJ19fd2VleF9jbGlwYm9hcmRfaWRfXydcblxuY29uc3QgY2xpcGJvYXJkID0ge1xuXG4gIGdldFN0cmluZzogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICAvLyBub3Qgc3VwcG9ydGVkIGluIGh0bWw1XG4gICAgY29uc29sZS5sb2coJ2NsaXBib2FyZC5nZXRTdHJpbmcoKSBpcyBub3Qgc3VwcG9ydGVkIG5vdy4nKVxuICB9LFxuXG4gIHNldFN0cmluZzogZnVuY3Rpb24gKHRleHQpIHtcbiAgICAvLyBub3Qgc3VwcG9ydCBzYWZhcmlcbiAgICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnICYmIHRleHQgIT09ICcnICYmIGRvY3VtZW50LmV4ZWNDb21tYW5kKSB7XG4gICAgICBjb25zdCB0ZW1wSW5wdXQgPSBlbGVtZW50KClcbiAgICAgIHRlbXBJbnB1dC52YWx1ZSA9IHRleHRcblxuICAgICAgdGVtcElucHV0LnNlbGVjdCgpXG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpXG4gICAgICAvLyB2YXIgb3V0ID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXhlY0NvbW1hbmQgb3V0IGlzIFwiICsgb3V0KTtcbiAgICAgIHRlbXBJbnB1dC52YWx1ZSA9ICcnXG4gICAgICB0ZW1wSW5wdXQuYmx1cigpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ29ubHkgc3VwcG9ydCBzdHJpbmcgaW5wdXQgbm93JylcbiAgICB9XG4gIH1cblxufVxuXG5mdW5jdGlvbiBlbGVtZW50ICgpIHtcbiAgbGV0IHRlbXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFdFRVhfQ0xJUEJPQVJEX0lEKVxuICBpZiAoIXRlbXBJbnB1dCkge1xuICAgIHRlbXBJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcbiAgICB0ZW1wSW5wdXQuc2V0QXR0cmlidXRlKCdpZCcsIFdFRVhfQ0xJUEJPQVJEX0lEKVxuICAgIHRlbXBJbnB1dC5zdHlsZS5jc3NUZXh0ID0gJ2hlaWdodDoxcHg7d2lkdGg6MXB4O2JvcmRlcjpub25lOydcbiAgICAvLyB0ZW1wSW5wdXQuc3R5bGUuY3NzVGV4dCA9IFwiaGVpZ2h0OjQwcHg7d2lkdGg6MzAwcHg7Ym9yZGVyOnNvbGlkO1wiXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wSW5wdXQpXG4gIH1cbiAgcmV0dXJuIHRlbXBJbnB1dFxufVxuXG5jb25zdCBtZXRhID0ge1xuICBjbGlwYm9hcmQ6IFt7XG4gICAgbmFtZTogJ2dldFN0cmluZycsXG4gICAgYXJnczogWydmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnc2V0U3RyaW5nJyxcbiAgICBhcmdzOiBbJ3N0cmluZyddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdjbGlwYm9hcmQnLCBjbGlwYm9hcmQsIG1ldGEpXG4gIH1cbn1cbiIsIlxuLyoqXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFbWl0dGVyYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufTtcblxuLyoqXG4gKiBNaXhpbiB0aGUgZW1pdHRlciBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpIHtcbiAgICBvYmpba2V5XSA9IEVtaXR0ZXIucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBMaXN0ZW4gb24gdGhlIGdpdmVuIGBldmVudGAgd2l0aCBgZm5gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9uID1cbkVtaXR0ZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gICh0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXSlcbiAgICAucHVzaChmbik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcbiAqIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIGZ1bmN0aW9uIG9uKCkge1xuICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uLmZuID0gZm47XG4gIHRoaXMub24oZXZlbnQsIG9uKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGBldmVudGAgb3IgYWxsXG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG5cbiAgLy8gYWxsXG4gIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNwZWNpZmljIGV2ZW50XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XG5cbiAgLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxuICB2YXIgY2I7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2IgPSBjYWxsYmFja3NbaV07XG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcbiAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgaWYgKGNhbGxiYWNrcykge1xuICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBjYWxsYmFja3NbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGVtaXR0ZXIgaGFzIGBldmVudGAgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xufTtcbiIsIi8qKlxuICogdG9TdHJpbmcgcmVmLlxuICovXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0eXBlIG9mIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCl7XG4gIHN3aXRjaCAodG9TdHJpbmcuY2FsbCh2YWwpKSB7XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6IHJldHVybiAnZGF0ZSc7XG4gICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzogcmV0dXJuICdyZWdleHAnO1xuICAgIGNhc2UgJ1tvYmplY3QgQXJndW1lbnRzXSc6IHJldHVybiAnYXJndW1lbnRzJztcbiAgICBjYXNlICdbb2JqZWN0IEFycmF5XSc6IHJldHVybiAnYXJyYXknO1xuICAgIGNhc2UgJ1tvYmplY3QgRXJyb3JdJzogcmV0dXJuICdlcnJvcic7XG4gIH1cblxuICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCAhPT0gdmFsKSByZXR1cm4gJ25hbic7XG4gIGlmICh2YWwgJiYgdmFsLm5vZGVUeXBlID09PSAxKSByZXR1cm4gJ2VsZW1lbnQnO1xuXG4gIHZhbCA9IHZhbC52YWx1ZU9mXG4gICAgPyB2YWwudmFsdWVPZigpXG4gICAgOiBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YuYXBwbHkodmFsKVxuXG4gIHJldHVybiB0eXBlb2YgdmFsO1xufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdHlwZTtcbnRyeSB7XG4gIHR5cGUgPSByZXF1aXJlKCdjb21wb25lbnQtdHlwZScpO1xufSBjYXRjaCAoXykge1xuICB0eXBlID0gcmVxdWlyZSgndHlwZScpO1xufVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG5cbi8qKlxuICogQ2xvbmVzIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gYW55IG9iamVjdFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZShvYmope1xuICBzd2l0Y2ggKHR5cGUob2JqKSkge1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgY29weSA9IHt9O1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBjb3B5W2tleV0gPSBjbG9uZShvYmpba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5O1xuXG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgdmFyIGNvcHkgPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29weVtpXSA9IGNsb25lKG9ialtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29weTtcblxuICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAvLyBmcm9tIG1pbGxlcm1lZGVpcm9zL2FtZC11dGlscyAtIE1JVFxuICAgICAgdmFyIGZsYWdzID0gJyc7XG4gICAgICBmbGFncyArPSBvYmoubXVsdGlsaW5lID8gJ20nIDogJyc7XG4gICAgICBmbGFncyArPSBvYmouZ2xvYmFsID8gJ2cnIDogJyc7XG4gICAgICBmbGFncyArPSBvYmouaWdub3JlQ2FzZSA/ICdpJyA6ICcnO1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAob2JqLnNvdXJjZSwgZmxhZ3MpO1xuXG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICByZXR1cm4gbmV3IERhdGUob2JqLmdldFRpbWUoKSk7XG5cbiAgICBkZWZhdWx0OiAvLyBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwg4oCmXG4gICAgICByZXR1cm4gb2JqO1xuICB9XG59XG4iLCJcbi8vIGVhc2luZyBmdW5jdGlvbnMgZnJvbSBcIlR3ZWVuLmpzXCJcblxuZXhwb3J0cy5saW5lYXIgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG47XG59O1xuXG5leHBvcnRzLmluUXVhZCA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gbiAqIG47XG59O1xuXG5leHBvcnRzLm91dFF1YWQgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG4gKiAoMiAtIG4pO1xufTtcblxuZXhwb3J0cy5pbk91dFF1YWQgPSBmdW5jdGlvbihuKXtcbiAgbiAqPSAyO1xuICBpZiAobiA8IDEpIHJldHVybiAwLjUgKiBuICogbjtcbiAgcmV0dXJuIC0gMC41ICogKC0tbiAqIChuIC0gMikgLSAxKTtcbn07XG5cbmV4cG9ydHMuaW5DdWJlID0gZnVuY3Rpb24obil7XG4gIHJldHVybiBuICogbiAqIG47XG59O1xuXG5leHBvcnRzLm91dEN1YmUgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIC0tbiAqIG4gKiBuICsgMTtcbn07XG5cbmV4cG9ydHMuaW5PdXRDdWJlID0gZnVuY3Rpb24obil7XG4gIG4gKj0gMjtcbiAgaWYgKG4gPCAxKSByZXR1cm4gMC41ICogbiAqIG4gKiBuO1xuICByZXR1cm4gMC41ICogKChuIC09IDIgKSAqIG4gKiBuICsgMik7XG59O1xuXG5leHBvcnRzLmluUXVhcnQgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG4gKiBuICogbiAqIG47XG59O1xuXG5leHBvcnRzLm91dFF1YXJ0ID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxIC0gKC0tbiAqIG4gKiBuICogbik7XG59O1xuXG5leHBvcnRzLmluT3V0UXVhcnQgPSBmdW5jdGlvbihuKXtcbiAgbiAqPSAyO1xuICBpZiAobiA8IDEpIHJldHVybiAwLjUgKiBuICogbiAqIG4gKiBuO1xuICByZXR1cm4gLTAuNSAqICgobiAtPSAyKSAqIG4gKiBuICogbiAtIDIpO1xufTtcblxuZXhwb3J0cy5pblF1aW50ID0gZnVuY3Rpb24obil7XG4gIHJldHVybiBuICogbiAqIG4gKiBuICogbjtcbn1cblxuZXhwb3J0cy5vdXRRdWludCA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gLS1uICogbiAqIG4gKiBuICogbiArIDE7XG59XG5cbmV4cG9ydHMuaW5PdXRRdWludCA9IGZ1bmN0aW9uKG4pe1xuICBuICo9IDI7XG4gIGlmIChuIDwgMSkgcmV0dXJuIDAuNSAqIG4gKiBuICogbiAqIG4gKiBuO1xuICByZXR1cm4gMC41ICogKChuIC09IDIpICogbiAqIG4gKiBuICogbiArIDIpO1xufTtcblxuZXhwb3J0cy5pblNpbmUgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIDEgLSBNYXRoLmNvcyhuICogTWF0aC5QSSAvIDIgKTtcbn07XG5cbmV4cG9ydHMub3V0U2luZSA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gTWF0aC5zaW4obiAqIE1hdGguUEkgLyAyKTtcbn07XG5cbmV4cG9ydHMuaW5PdXRTaW5lID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAuNSAqICgxIC0gTWF0aC5jb3MoTWF0aC5QSSAqIG4pKTtcbn07XG5cbmV4cG9ydHMuaW5FeHBvID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAwID09IG4gPyAwIDogTWF0aC5wb3coMTAyNCwgbiAtIDEpO1xufTtcblxuZXhwb3J0cy5vdXRFeHBvID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxID09IG4gPyBuIDogMSAtIE1hdGgucG93KDIsIC0xMCAqIG4pO1xufTtcblxuZXhwb3J0cy5pbk91dEV4cG8gPSBmdW5jdGlvbihuKXtcbiAgaWYgKDAgPT0gbikgcmV0dXJuIDA7XG4gIGlmICgxID09IG4pIHJldHVybiAxO1xuICBpZiAoKG4gKj0gMikgPCAxKSByZXR1cm4gLjUgKiBNYXRoLnBvdygxMDI0LCBuIC0gMSk7XG4gIHJldHVybiAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogKG4gLSAxKSkgKyAyKTtcbn07XG5cbmV4cG9ydHMuaW5DaXJjID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSBuICogbik7XG59O1xuXG5leHBvcnRzLm91dENpcmMgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIE1hdGguc3FydCgxIC0gKC0tbiAqIG4pKTtcbn07XG5cbmV4cG9ydHMuaW5PdXRDaXJjID0gZnVuY3Rpb24obil7XG4gIG4gKj0gMlxuICBpZiAobiA8IDEpIHJldHVybiAtMC41ICogKE1hdGguc3FydCgxIC0gbiAqIG4pIC0gMSk7XG4gIHJldHVybiAwLjUgKiAoTWF0aC5zcXJ0KDEgLSAobiAtPSAyKSAqIG4pICsgMSk7XG59O1xuXG5leHBvcnRzLmluQmFjayA9IGZ1bmN0aW9uKG4pe1xuICB2YXIgcyA9IDEuNzAxNTg7XG4gIHJldHVybiBuICogbiAqICgoIHMgKyAxICkgKiBuIC0gcyk7XG59O1xuXG5leHBvcnRzLm91dEJhY2sgPSBmdW5jdGlvbihuKXtcbiAgdmFyIHMgPSAxLjcwMTU4O1xuICByZXR1cm4gLS1uICogbiAqICgocyArIDEpICogbiArIHMpICsgMTtcbn07XG5cbmV4cG9ydHMuaW5PdXRCYWNrID0gZnVuY3Rpb24obil7XG4gIHZhciBzID0gMS43MDE1OCAqIDEuNTI1O1xuICBpZiAoICggbiAqPSAyICkgPCAxICkgcmV0dXJuIDAuNSAqICggbiAqIG4gKiAoICggcyArIDEgKSAqIG4gLSBzICkgKTtcbiAgcmV0dXJuIDAuNSAqICggKCBuIC09IDIgKSAqIG4gKiAoICggcyArIDEgKSAqIG4gKyBzICkgKyAyICk7XG59O1xuXG5leHBvcnRzLmluQm91bmNlID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxIC0gZXhwb3J0cy5vdXRCb3VuY2UoMSAtIG4pO1xufTtcblxuZXhwb3J0cy5vdXRCb3VuY2UgPSBmdW5jdGlvbihuKXtcbiAgaWYgKCBuIDwgKCAxIC8gMi43NSApICkge1xuICAgIHJldHVybiA3LjU2MjUgKiBuICogbjtcbiAgfSBlbHNlIGlmICggbiA8ICggMiAvIDIuNzUgKSApIHtcbiAgICByZXR1cm4gNy41NjI1ICogKCBuIC09ICggMS41IC8gMi43NSApICkgKiBuICsgMC43NTtcbiAgfSBlbHNlIGlmICggbiA8ICggMi41IC8gMi43NSApICkge1xuICAgIHJldHVybiA3LjU2MjUgKiAoIG4gLT0gKCAyLjI1IC8gMi43NSApICkgKiBuICsgMC45Mzc1O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiA3LjU2MjUgKiAoIG4gLT0gKCAyLjYyNSAvIDIuNzUgKSApICogbiArIDAuOTg0Mzc1O1xuICB9XG59O1xuXG5leHBvcnRzLmluT3V0Qm91bmNlID0gZnVuY3Rpb24obil7XG4gIGlmIChuIDwgLjUpIHJldHVybiBleHBvcnRzLmluQm91bmNlKG4gKiAyKSAqIC41O1xuICByZXR1cm4gZXhwb3J0cy5vdXRCb3VuY2UobiAqIDIgLSAxKSAqIC41ICsgLjU7XG59O1xuXG4vLyBhbGlhc2VzXG5cbmV4cG9ydHNbJ2luLXF1YWQnXSA9IGV4cG9ydHMuaW5RdWFkO1xuZXhwb3J0c1snb3V0LXF1YWQnXSA9IGV4cG9ydHMub3V0UXVhZDtcbmV4cG9ydHNbJ2luLW91dC1xdWFkJ10gPSBleHBvcnRzLmluT3V0UXVhZDtcbmV4cG9ydHNbJ2luLWN1YmUnXSA9IGV4cG9ydHMuaW5DdWJlO1xuZXhwb3J0c1snb3V0LWN1YmUnXSA9IGV4cG9ydHMub3V0Q3ViZTtcbmV4cG9ydHNbJ2luLW91dC1jdWJlJ10gPSBleHBvcnRzLmluT3V0Q3ViZTtcbmV4cG9ydHNbJ2luLXF1YXJ0J10gPSBleHBvcnRzLmluUXVhcnQ7XG5leHBvcnRzWydvdXQtcXVhcnQnXSA9IGV4cG9ydHMub3V0UXVhcnQ7XG5leHBvcnRzWydpbi1vdXQtcXVhcnQnXSA9IGV4cG9ydHMuaW5PdXRRdWFydDtcbmV4cG9ydHNbJ2luLXF1aW50J10gPSBleHBvcnRzLmluUXVpbnQ7XG5leHBvcnRzWydvdXQtcXVpbnQnXSA9IGV4cG9ydHMub3V0UXVpbnQ7XG5leHBvcnRzWydpbi1vdXQtcXVpbnQnXSA9IGV4cG9ydHMuaW5PdXRRdWludDtcbmV4cG9ydHNbJ2luLXNpbmUnXSA9IGV4cG9ydHMuaW5TaW5lO1xuZXhwb3J0c1snb3V0LXNpbmUnXSA9IGV4cG9ydHMub3V0U2luZTtcbmV4cG9ydHNbJ2luLW91dC1zaW5lJ10gPSBleHBvcnRzLmluT3V0U2luZTtcbmV4cG9ydHNbJ2luLWV4cG8nXSA9IGV4cG9ydHMuaW5FeHBvO1xuZXhwb3J0c1snb3V0LWV4cG8nXSA9IGV4cG9ydHMub3V0RXhwbztcbmV4cG9ydHNbJ2luLW91dC1leHBvJ10gPSBleHBvcnRzLmluT3V0RXhwbztcbmV4cG9ydHNbJ2luLWNpcmMnXSA9IGV4cG9ydHMuaW5DaXJjO1xuZXhwb3J0c1snb3V0LWNpcmMnXSA9IGV4cG9ydHMub3V0Q2lyYztcbmV4cG9ydHNbJ2luLW91dC1jaXJjJ10gPSBleHBvcnRzLmluT3V0Q2lyYztcbmV4cG9ydHNbJ2luLWJhY2snXSA9IGV4cG9ydHMuaW5CYWNrO1xuZXhwb3J0c1snb3V0LWJhY2snXSA9IGV4cG9ydHMub3V0QmFjaztcbmV4cG9ydHNbJ2luLW91dC1iYWNrJ10gPSBleHBvcnRzLmluT3V0QmFjaztcbmV4cG9ydHNbJ2luLWJvdW5jZSddID0gZXhwb3J0cy5pbkJvdW5jZTtcbmV4cG9ydHNbJ291dC1ib3VuY2UnXSA9IGV4cG9ydHMub3V0Qm91bmNlO1xuZXhwb3J0c1snaW4tb3V0LWJvdW5jZSddID0gZXhwb3J0cy5pbk91dEJvdW5jZTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBFbWl0dGVyID0gcmVxdWlyZSgnZW1pdHRlcicpO1xudmFyIGNsb25lID0gcmVxdWlyZSgnY2xvbmUnKTtcbnZhciB0eXBlID0gcmVxdWlyZSgndHlwZScpO1xudmFyIGVhc2UgPSByZXF1aXJlKCdlYXNlJyk7XG5cbi8qKlxuICogRXhwb3NlIGBUd2VlbmAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBUd2VlbjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBUd2VlbmAgd2l0aCBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFR3ZWVuKG9iaikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHdlZW4pKSByZXR1cm4gbmV3IFR3ZWVuKG9iaik7XG4gIHRoaXMuX2Zyb20gPSBvYmo7XG4gIHRoaXMuZWFzZSgnbGluZWFyJyk7XG4gIHRoaXMuZHVyYXRpb24oNTAwKTtcbn1cblxuLyoqXG4gKiBNaXhpbiBlbWl0dGVyLlxuICovXG5cbkVtaXR0ZXIoVHdlZW4ucHJvdG90eXBlKTtcblxuLyoqXG4gKiBSZXNldCB0aGUgdHdlZW4uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Ud2Vlbi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpe1xuICB0aGlzLmlzQXJyYXkgPSAnYXJyYXknID09PSB0eXBlKHRoaXMuX2Zyb20pO1xuICB0aGlzLl9jdXJyID0gY2xvbmUodGhpcy5fZnJvbSk7XG4gIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgdGhpcy5fc3RhcnQgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVHdlZW4gdG8gYG9iamAgYW5kIHJlc2V0IGludGVybmFsIHN0YXRlLlxuICpcbiAqICAgIHR3ZWVuLnRvKHsgeDogNTAsIHk6IDEwMCB9KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmpcbiAqIEByZXR1cm4ge1R3ZWVufSBzZWxmXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblR3ZWVuLnByb3RvdHlwZS50byA9IGZ1bmN0aW9uKG9iail7XG4gIHRoaXMucmVzZXQoKTtcbiAgdGhpcy5fdG8gPSBvYmo7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgZHVyYXRpb24gdG8gYG1zYCBbNTAwXS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1R3ZWVufSBzZWxmXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblR3ZWVuLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uKG1zKXtcbiAgdGhpcy5fZHVyYXRpb24gPSBtcztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBlYXNpbmcgZnVuY3Rpb24gdG8gYGZuYC5cbiAqXG4gKiAgICB0d2Vlbi5lYXNlKCdpbi1vdXQtc2luZScpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtUd2Vlbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLmVhc2UgPSBmdW5jdGlvbihmbil7XG4gIGZuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZm4gPyBmbiA6IGVhc2VbZm5dO1xuICBpZiAoIWZuKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGVhc2luZyBmdW5jdGlvbicpO1xuICB0aGlzLl9lYXNlID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSB0d2VlbiBhbmQgaW1tZWRpYXRlbHkgZW1pdCBcInN0b3BcIiBhbmQgXCJlbmRcIi5cbiAqXG4gKiBAcmV0dXJuIHtUd2Vlbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpe1xuICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgdGhpcy5lbWl0KCdzdG9wJyk7XG4gIHRoaXMuZW1pdCgnZW5kJyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtIGEgc3RlcC5cbiAqXG4gKiBAcmV0dXJuIHtUd2Vlbn0gc2VsZlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpe1xuICBpZiAodGhpcy5fZG9uZSkgcmV0dXJuO1xuXG4gIC8vIGR1cmF0aW9uXG4gIHZhciBkdXJhdGlvbiA9IHRoaXMuX2R1cmF0aW9uO1xuICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgdmFyIGRlbHRhID0gbm93IC0gdGhpcy5fc3RhcnQ7XG4gIHZhciBkb25lID0gZGVsdGEgPj0gZHVyYXRpb247XG5cbiAgLy8gY29tcGxldGVcbiAgaWYgKGRvbmUpIHtcbiAgICB0aGlzLl9mcm9tID0gdGhpcy5fdG87XG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuX3RvKTtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHdlZW5cbiAgdmFyIGZyb20gPSB0aGlzLl9mcm9tO1xuICB2YXIgdG8gPSB0aGlzLl90bztcbiAgdmFyIGN1cnIgPSB0aGlzLl9jdXJyO1xuICB2YXIgZm4gPSB0aGlzLl9lYXNlO1xuICB2YXIgcCA9IChub3cgLSB0aGlzLl9zdGFydCkgLyBkdXJhdGlvbjtcbiAgdmFyIG4gPSBmbihwKTtcblxuICAvLyBhcnJheVxuICBpZiAodGhpcy5pc0FycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcm9tLmxlbmd0aDsgKytpKSB7XG4gICAgICBjdXJyW2ldID0gZnJvbVtpXSArICh0b1tpXSAtIGZyb21baV0pICogbjtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoY3Vycik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvYmplY2hcbiAgZm9yICh2YXIgayBpbiBmcm9tKSB7XG4gICAgY3VycltrXSA9IGZyb21ba10gKyAodG9ba10gLSBmcm9tW2tdKSAqIG47XG4gIH1cblxuICB0aGlzLl91cGRhdGUoY3Vycik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdXBkYXRlIGZ1bmN0aW9uIHRvIGBmbmAgb3JcbiAqIHdoZW4gbm8gYXJndW1lbnQgaXMgZ2l2ZW4gdGhpcyBwZXJmb3Jtc1xuICogYSBcInN0ZXBcIi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7VHdlZW59IHNlbGZcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGZuKXtcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuc3RlcCgpO1xuICB0aGlzLl91cGRhdGUgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59OyIsIi8qKlxuICogRXhwb3NlIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKWAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgfHwgZmFsbGJhY2s7XG5cbi8qKlxuICogRmFsbGJhY2sgaW1wbGVtZW50YXRpb24uXG4gKi9cblxudmFyIHByZXYgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbmZ1bmN0aW9uIGZhbGxiYWNrKGZuKSB7XG4gIHZhciBjdXJyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHZhciBtcyA9IE1hdGgubWF4KDAsIDE2IC0gKGN1cnIgLSBwcmV2KSk7XG4gIHZhciByZXEgPSBzZXRUaW1lb3V0KGZuLCBtcyk7XG4gIHByZXYgPSBjdXJyO1xuICByZXR1cm4gcmVxO1xufVxuXG4vKipcbiAqIENhbmNlbC5cbiAqL1xuXG52YXIgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lXG4gIHx8IHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZVxuICB8fCB3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWVcbiAgfHwgd2luZG93LmNsZWFyVGltZW91dDtcblxuZXhwb3J0cy5jYW5jZWwgPSBmdW5jdGlvbihpZCl7XG4gIGNhbmNlbC5jYWxsKHdpbmRvdywgaWQpO1xufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgVHdlZW4gPSByZXF1aXJlKCd0d2VlbicpO1xudmFyIHJhZiA9IHJlcXVpcmUoJ3JhZicpO1xuXG4vKipcbiAqIEV4cG9zZSBgc2Nyb2xsVG9gLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsVG87XG5cbi8qKlxuICogU2Nyb2xsIHRvIGAoeCwgeSlgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzY3JvbGxUbyh4LCB5LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHN0YXJ0IHBvc2l0aW9uXG4gIHZhciBzdGFydCA9IHNjcm9sbCgpO1xuXG4gIC8vIHNldHVwIHR3ZWVuXG4gIHZhciB0d2VlbiA9IFR3ZWVuKHN0YXJ0KVxuICAgIC5lYXNlKG9wdGlvbnMuZWFzZSB8fCAnb3V0LWNpcmMnKVxuICAgIC50byh7IHRvcDogeSwgbGVmdDogeCB9KVxuICAgIC5kdXJhdGlvbihvcHRpb25zLmR1cmF0aW9uIHx8IDEwMDApO1xuXG4gIC8vIHNjcm9sbFxuICB0d2Vlbi51cGRhdGUoZnVuY3Rpb24obyl7XG4gICAgd2luZG93LnNjcm9sbFRvKG8ubGVmdCB8IDAsIG8udG9wIHwgMCk7XG4gIH0pO1xuXG4gIC8vIGhhbmRsZSBlbmRcbiAgdHdlZW4ub24oJ2VuZCcsIGZ1bmN0aW9uKCl7XG4gICAgYW5pbWF0ZSA9IGZ1bmN0aW9uKCl7fTtcbiAgfSk7XG5cbiAgLy8gYW5pbWF0ZVxuICBmdW5jdGlvbiBhbmltYXRlKCkge1xuICAgIHJhZihhbmltYXRlKTtcbiAgICB0d2Vlbi51cGRhdGUoKTtcbiAgfVxuXG4gIGFuaW1hdGUoKTtcbiAgXG4gIHJldHVybiB0d2Vlbjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gc2Nyb2xsIHBvc2l0aW9uLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNjcm9sbCgpIHtcbiAgdmFyIHkgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgdmFyIHggPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gIHJldHVybiB7IHRvcDogeSwgbGVmdDogeCB9O1xufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHNjcm9sbCBmcm9tICdzY3JvbGwtdG8nXG5cbmxldCBjYW1lbFRvS2ViYWIsIGFwcGVuZFN0eWxlXG5cbmNvbnN0IGRvbSA9IHtcblxuICAvKipcbiAgICogY3JlYXRlQm9keTogY3JlYXRlIHJvb3QgY29tcG9uZW50XG4gICAqIEBwYXJhbSAge29iamVjdH0gZWxlbWVudFxuICAgKiAgICBjb250YWluZXJ8bGlzdHZpZXd8c2Nyb2xsdmlld1xuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgY3JlYXRlQm9keTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICBlbGVtZW50Lmluc3RhbmNlSWQgPSBjb21wb25lbnRNYW5hZ2VyLmluc3RhbmNlSWRcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci5jcmVhdGVCb2R5KGVsZW1lbnQpXG4gIH0sXG5cbiAgYWRkRWxlbWVudDogZnVuY3Rpb24gKHBhcmVudFJlZiwgZWxlbWVudCwgaW5kZXgpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICBlbGVtZW50Lmluc3RhbmNlSWQgPSBjb21wb25lbnRNYW5hZ2VyLmluc3RhbmNlSWRcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci5hZGRFbGVtZW50KHBhcmVudFJlZiwgZWxlbWVudCwgaW5kZXgpXG4gIH0sXG5cbiAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24gKHJlZikge1xuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIHJldHVybiBjb21wb25lbnRNYW5hZ2VyLnJlbW92ZUVsZW1lbnQocmVmKVxuICB9LFxuXG4gIG1vdmVFbGVtZW50OiBmdW5jdGlvbiAocmVmLCBwYXJlbnRSZWYsIGluZGV4KSB7XG4gICAgY29uc3QgY29tcG9uZW50TWFuYWdlciA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpXG4gICAgcmV0dXJuIGNvbXBvbmVudE1hbmFnZXIubW92ZUVsZW1lbnQocmVmLCBwYXJlbnRSZWYsIGluZGV4KVxuICB9LFxuXG4gIGFkZEV2ZW50OiBmdW5jdGlvbiAocmVmLCB0eXBlKSB7XG4gICAgY29uc3QgY29tcG9uZW50TWFuYWdlciA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpXG4gICAgcmV0dXJuIGNvbXBvbmVudE1hbmFnZXIuYWRkRXZlbnQocmVmLCB0eXBlKVxuICB9LFxuXG4gIHJlbW92ZUV2ZW50OiBmdW5jdGlvbiAocmVmLCB0eXBlKSB7XG4gICAgY29uc3QgY29tcG9uZW50TWFuYWdlciA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpXG4gICAgcmV0dXJuIGNvbXBvbmVudE1hbmFnZXIucmVtb3ZlRXZlbnQocmVmLCB0eXBlKVxuICB9LFxuXG4gIC8qKlxuICAgKiB1cGRhdGVBdHRyczogdXBkYXRlIGF0dHJpYnV0ZXMgb2YgY29tcG9uZW50XG4gICAqIEBwYXJhbSAge3N0cmluZ30gcmVmXG4gICAqIEBwYXJhbSAge29ian0gYXR0clxuICAgKi9cbiAgdXBkYXRlQXR0cnM6IGZ1bmN0aW9uIChyZWYsIGF0dHIpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci51cGRhdGVBdHRycyhyZWYsIGF0dHIpXG4gIH0sXG5cbiAgLyoqXG4gICAqIHVwZGF0ZVN0eWxlOiB1ZHBhdGUgc3R5bGUgb2YgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZcbiAgICogQHBhcmFtIHtvYmp9IHN0eWxlXG4gICAqL1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gKHJlZiwgc3R5bGUpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci51cGRhdGVTdHlsZShyZWYsIHN0eWxlKVxuICB9LFxuXG4gIC8qKlxuICAgKiBzY3JvbGxUb0VsZW1lbnRcbiAgICogQHBhcmFtICB7c3RyaW5nfSByZWZcbiAgICogQHBhcmFtICB7b2JqfSBvcHRpb25zIHtvZmZzZXQ6TnVtYmVyfVxuICAgKiAgIHBzOiBzY3JvbGwtdG8gaGFzICdlYXNlJyBhbmQgJ2R1cmF0aW9uJyhtcykgYXMgb3B0aW9ucy5cbiAgICovXG4gIHNjcm9sbFRvRWxlbWVudDogZnVuY3Rpb24gKHJlZiwgb3B0aW9ucykge1xuICAgICFvcHRpb25zICYmIChvcHRpb25zID0ge30pXG4gICAgY29uc3Qgb2Zmc2V0ID0gTnVtYmVyKG9wdGlvbnMub2Zmc2V0KSB8fCAwXG4gICAgY29uc3QgZWxlbSA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldENvbXBvbmVudChyZWYpXG4gICAgaWYgKCFlbGVtKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihgW2g1LXJlbmRlcl0gY29tcG9uZW50IG9mIHJlZiAke3JlZn0gZG9lc24ndCBleGlzdC5gKVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnRTY3JvbGxlciA9IGVsZW0uZ2V0UGFyZW50U2Nyb2xsZXIoKVxuICAgIGlmIChwYXJlbnRTY3JvbGxlcikge1xuICAgICAgcGFyZW50U2Nyb2xsZXIuc2Nyb2xsZXIuc2Nyb2xsVG9FbGVtZW50KGVsZW0ubm9kZSwgdHJ1ZSwgb2Zmc2V0KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IG9mZnNldFRvcCA9IGVsZW0ubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgICAgICArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXG4gICAgICBjb25zdCB0d2VlbiA9IHNjcm9sbCgwLCBvZmZzZXRUb3AgKyBvZmZzZXQsIG9wdGlvbnMpXG4gICAgICB0d2Vlbi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnc2Nyb2xsIGVuZC4nKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGdldENvbXBvbmVudFJlY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRDb21wb25lbnRSZWN0OiBmdW5jdGlvbiAocmVmLCBjYWxsYmFja0lkKSB7XG4gICAgY29uc3QgaW5mbyA9IHsgcmVzdWx0OiBmYWxzZSB9XG5cbiAgICBpZiAocmVmICYmIHJlZiA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgaW5mby5yZXN1bHQgPSB0cnVlXG4gICAgICBpbmZvLnNpemUgPSB7XG4gICAgICAgIHdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIGhlaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICByaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgICBib3R0b206IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBlbGVtID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKCkuZ2V0Q29tcG9uZW50KHJlZilcbiAgICAgIGlmIChlbGVtICYmIGVsZW0ubm9kZSkge1xuICAgICAgICBpbmZvLnJlc3VsdCA9IHRydWVcbiAgICAgICAgaW5mby5zaXplID0gZWxlbS5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGluZm8ucmVzdWx0ID8gaW5mbyA6IHtcbiAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICBlcnJNc2c6ICdJbGxlZ2FsIHBhcmFtZXRlcidcbiAgICB9XG4gICAgdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIG1lc3NhZ2UpXG4gICAgcmV0dXJuIG1lc3NhZ2VcbiAgfSxcblxuICAvKipcbiAgICogZm9yIGFkZGluZyBmb250RmFjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IGZvbnRGYWNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXMgcnVsZXNcbiAgICovXG4gIGFkZFJ1bGU6IGZ1bmN0aW9uIChrZXksIHN0eWxlcykge1xuICAgIGtleSA9IGNhbWVsVG9LZWJhYihrZXkpXG4gICAgbGV0IHN0eWxlc1RleHQgPSAnJ1xuICAgIGZvciAoY29uc3QgayBpbiBzdHlsZXMpIHtcbiAgICAgIGlmIChzdHlsZXMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgc3R5bGVzVGV4dCArPSBjYW1lbFRvS2ViYWIoaykgKyAnOicgKyBzdHlsZXNba10gKyAnOydcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3R5bGVUZXh0ID0gYEAke2tleX17JHtzdHlsZXNUZXh0fX1gXG4gICAgYXBwZW5kU3R5bGUoc3R5bGVUZXh0LCAnZG9tLWFkZGVkLXJ1bGVzJylcbiAgfSxcblxuICBjcmVhdGVGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmNyZWF0ZUZpbmlzaCgpXG4gIH0sXG5cbiAgdXBkYXRlRmluaXNoIChjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKS51cGRhdGVGaW5pc2goKVxuICB9LFxuXG4gIHJlZnJlc2hGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLnJlZnJlc2hGaW5pc2goKVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGRvbTogW3tcbiAgICBuYW1lOiAnY3JlYXRlQm9keScsXG4gICAgYXJnczogWydvYmplY3QnXVxuICB9LCB7XG4gICAgbmFtZTogJ2FkZEVsZW1lbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCcsICdudW1iZXInXVxuICB9LCB7XG4gICAgbmFtZTogJ3JlbW92ZUVsZW1lbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfSwge1xuICAgIG5hbWU6ICdtb3ZlRWxlbWVudCcsXG4gICAgYXJnczogWydzdHJpbmcnLCAnc3RyaW5nJywgJ251bWJlciddXG4gIH0sIHtcbiAgICBuYW1lOiAnYWRkRXZlbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAncmVtb3ZlRXZlbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAndXBkYXRlQXR0cnMnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAndXBkYXRlU3R5bGUnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAnY3JlYXRlRmluaXNoJyxcbiAgICBhcmdzOiBbXVxuICB9LCB7XG4gICAgbmFtZTogJ3VwZGF0ZUZpbmlzaCcsXG4gICAgYXJnczogW11cbiAgfSwge1xuICAgIG5hbWU6ICdyZWZyZXNoRmluaXNoJyxcbiAgICBhcmdzOiBbXVxuICB9LCB7XG4gICAgbmFtZTogJ3Njcm9sbFRvRWxlbWVudCcsXG4gICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0J11cbiAgfSwge1xuICAgIG5hbWU6ICdnZXRDb21wb25lbnRSZWN0JyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnYWRkUnVsZScsXG4gICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0J11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIGNhbWVsVG9LZWJhYiA9IFdlZXgudXRpbHMuY2FtZWxUb0tlYmFiXG4gICAgYXBwZW5kU3R5bGUgPSBXZWV4LnV0aWxzLmFwcGVuZFN0eWxlXG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnZG9tJywgZG9tLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBldmVudCA9IHtcbiAgLyoqXG4gICAqIG9wZW5VcmxcbiAgICogQHBhcmFtICB7c3RyaW5nfSB1cmxcbiAgICovXG4gIG9wZW5VUkw6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICBsb2NhdGlvbi5ocmVmID0gdXJsXG4gIH1cblxufVxuXG5jb25zdCBtZXRhID0ge1xuICBldmVudDogW3tcbiAgICBuYW1lOiAnb3BlblVSTCcsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnZXZlbnQnLCBldmVudCwgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3Qgc3VwcG9ydEdlb2xvY2F0aW9uID0gJ2dlb2xvY2F0aW9uJyBpbiBuYXZpZ2F0b3JcbmNvbnN0IGVycm9yTXNnID0gYFtoNS1yZW5kZXJdOiBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBnZW9sb2NhdGlvbi5gXG5cbmNvbnN0IGdlb2xvY2F0aW9uID0ge1xuICAvLyBvcHRpb25zOlxuICAvLyAgIC0gZW5hYmxlSGlnaEFjY3VyYWN5IG9wdGlvbmFsLCB2YWx1ZSBpcyB0cnVlIG9yIGZhbHNlLCBmYWxzZSBieSBkZWZhdWx0LlxuICAvLyAgIC0gdGltZW91dCBbbm9uZS1uYXRpdmVdIG9wdGlvbmFsLCB2YWx1ZSBpcyBhIG51bWJlciAobWlsbGlzZWNvbmRzKSwgZGVmYXVsdCB2YXVsZSBpcyBGSU5GSU5JVFkuXG4gIC8vICAgLSBtYXhpbXVtQWdlIFtub25lLW5hdGl2ZV0gb3B0aW9uYWwsIHZhbHVlIGlzIGEgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gIGdldEN1cnJlbnRQb3NpdGlvbiAoc3VjY2Vzc0NiSWQsIGVycm9yQ2JJZCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHN1Y2Nlc3NDYiA9IHBvcyA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soc3VjY2Vzc0NiSWQsIHBvcylcbiAgICBjb25zdCBlcnJvckNiID0gZXJyID0+IHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhlcnJvckNiSWQsIGVycilcbiAgICBpZiAoc3VwcG9ydEdlb2xvY2F0aW9uKSB7XG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHN1Y2Nlc3NDYiwgZXJyb3JDYiwgb3B0aW9ucylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3JNc2cpXG4gICAgICBlcnJvckNiKG5ldyBFcnJvcihlcnJvck1zZykpXG4gICAgfVxuICB9LFxuXG4gIC8vIG9wdGlvbnM6IHRoZSBzYW1lIHdpdGggYGdldEN1cnJlbnRQb3NpdGlvbmAuXG4gIHdhdGNoUG9zaXRpb24gKHN1Y2Nlc3NDYklkLCBlcnJvckNiSWQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzdWNjZXNzQ2IgPSBwb3MgPT4gdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKHN1Y2Nlc3NDYklkLCBwb3MsIHRydWUpXG4gICAgY29uc3QgZXJyb3JDYiA9IGVyciA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soZXJyb3JDYklkLCBlcnIpXG4gICAgaWYgKHN1cHBvcnRHZW9sb2NhdGlvbikge1xuICAgICAgY29uc3QgaWQgPSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihwb3MgPT4ge1xuICAgICAgICBwb3Mud2F0Y2hJZCA9IGlkXG4gICAgICAgIHN1Y2Nlc3NDYihwb3MpXG4gICAgICB9LCBlcnJvckNiLCBvcHRpb25zKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnJvck1zZylcbiAgICAgIGVycm9yQ2IobmV3IEVycm9yKGVycm9yTXNnKSlcbiAgICB9XG4gIH0sXG5cbiAgY2xlYXJXYXRjaCAod2F0Y2hJZCkge1xuICAgIGlmIChzdXBwb3J0R2VvbG9jYXRpb24pIHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKHdhdGNoSWQpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGVycm9yTXNnKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXRhID0ge1xuICBnZW9sb2NhdGlvbjogW3tcbiAgICBuYW1lOiAnZ2V0Q3VycmVudFBvc2l0aW9uJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJywgJ2Z1bmN0aW9uJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAnd2F0Y2hQb3NpdGlvbicsXG4gICAgYXJnczogWydmdW5jdGlvbicsICdmdW5jdGlvbicsICdvYmplY3QnXVxuICB9LCB7XG4gICAgbmFtZTogJ2NsZWFyV2F0Y2gnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0IChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnZ2VvbG9jYXRpb24nLCBnZW9sb2NhdGlvbiwgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuLy8gdHJhY2sgdmFyaWVzIGtpbmRzIG9mIGV2ZW50cyBhbmQgbGlzdGVuZXJzLlxuY29uc3QgaGFuZGxlclRyYWtlciA9IHt9XG5cbmNvbnN0IGdsb2JhbEV2ZW50ID0ge1xuXG4gIC8qKlxuICAgKiBhZGRFdmVudExpc3RlbmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldnQgLSB0aGUgZXZlbnQgbmFtZSB0byBhZGQgYSBsaXN0ZW5lciBvbi5cbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIgKGV2dCwgY2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IGNiID0gZSA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgZSwgdHJ1ZSlcbiAgICBpZiAoIWhhbmRsZXJUcmFrZXJbZXZ0XSkge1xuICAgICAgaGFuZGxlclRyYWtlcltldnRdID0gW2NiXVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhhbmRsZXJUcmFrZXJbZXZ0XS5wdXNoKGNiKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2dCwgY2IpXG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2dCAtIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSBhIGxpc3RlbmVyIGZyb20uXG4gICAqL1xuICByZW1vdmVFdmVudExpc3RlbmVyIChldnQpIHtcbiAgICBoYW5kbGVyVHJha2VyW2V2dF0uZm9yRWFjaChjYiA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2dCwgY2IpKVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGdsb2JhbEV2ZW50OiBbe1xuICAgIG5hbWU6ICdhZGRFdmVudExpc3RlbmVyJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdnbG9iYWxFdmVudCcsIGdsb2JhbEV2ZW50LCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBtZXRhTW9kdWxlID0ge1xuXG4gIC8qKlxuICAgKiBzZXRWaWV3cG9ydFxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gICAqICAgICAgICAtIHdpZHRoOiBudW1iZXIgfCAnZGV2aWNlLXdpZHRoJ1xuICAgKi9cbiAgc2V0Vmlld3BvcnQ6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJykuc2V0QXR0cmlidXRlKCdjb250ZW50JywgYHdpZHRoPSR7Y29uZmlnLndpZHRofSwgdXNlci1zY2FsYWJsZT1ub2ApXG4gIH1cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgbWV0YTogW3tcbiAgICBuYW1lOiAnc2V0Vmlld3BvcnQnLFxuICAgIGFyZ3M6IFsnb2JqZWN0J11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ21ldGEnLCBtZXRhTW9kdWxlLCBtZXRhKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxucmVxdWlyZSgnLi4vc3R5bGVzL21vZGFsLmNzcycpXG5cbi8vIHRoZXJlIHdpbGwgYmUgb25seSBvbmUgaW5zdGFuY2Ugb2YgbW9kYWwuXG52YXIgTU9EQUxfV1JBUF9DTEFTUyA9ICdhbWZlLW1vZGFsLXdyYXAnXG52YXIgTU9EQUxfTk9ERV9DTEFTUyA9ICdhbWZlLW1vZGFsLW5vZGUnXG5cbmZ1bmN0aW9uIE1vZGFsKCkge1xuICB0aGlzLndyYXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1PREFMX1dSQVBfQ0xBU1MpXG4gIHRoaXMubm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoTU9EQUxfTk9ERV9DTEFTUylcbiAgaWYgKCF0aGlzLndyYXApIHtcbiAgICB0aGlzLmNyZWF0ZVdyYXAoKVxuICB9XG4gIGlmICghdGhpcy5ub2RlKSB7XG4gICAgdGhpcy5jcmVhdGVOb2RlKClcbiAgfVxuICB0aGlzLmNsZWFyTm9kZSgpXG4gIHRoaXMuY3JlYXRlTm9kZUNvbnRlbnQoKVxuICB0aGlzLmJpbmRFdmVudHMoKVxufVxuXG5Nb2RhbC5wcm90b3R5cGUgPSB7XG5cbiAgc2hvdzogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMud3JhcC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgIHRoaXMubm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJylcbiAgfSxcblxuICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLndyYXApXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUpXG4gICAgdGhpcy53cmFwID0gbnVsbFxuICAgIHRoaXMubm9kZSA9IG51bGxcbiAgfSxcblxuICBjcmVhdGVXcmFwOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy53cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLndyYXAuY2xhc3NOYW1lID0gTU9EQUxfV1JBUF9DTEFTU1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy53cmFwKVxuICB9LFxuXG4gIGNyZWF0ZU5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKE1PREFMX05PREVfQ0xBU1MsICdoaWRlJylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubm9kZSlcbiAgfSxcblxuICBjbGVhck5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm5vZGUuaW5uZXJIVE1MID0gJydcbiAgfSxcblxuICBjcmVhdGVOb2RlQ29udGVudDogZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gZG8gbm90aGluZy5cbiAgICAvLyBjaGlsZCBjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC5cbiAgfSxcblxuICBiaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy53cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2RhbFxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBNb2RhbCA9IHJlcXVpcmUoJy4vbW9kYWwnKVxucmVxdWlyZSgnLi4vc3R5bGVzL2FsZXJ0LmNzcycpXG5cbnZhciBDT05URU5UX0NMQVNTID0gJ2NvbnRlbnQnXG52YXIgTVNHX0NMQVNTID0gJ2NvbnRlbnQtbXNnJ1xudmFyIEJVVFRPTl9HUk9VUF9DTEFTUyA9ICdidG4tZ3JvdXAnXG52YXIgQlVUVE9OX0NMQVNTID0gJ2J0bidcblxuZnVuY3Rpb24gQWxlcnQoY29uZmlnKSB7XG4gIHRoaXMubXNnID0gY29uZmlnLm1lc3NhZ2UgfHwgJydcbiAgdGhpcy5jYWxsYmFjayA9IGNvbmZpZy5jYWxsYmFja1xuICB0aGlzLm9rVGl0bGUgPSBjb25maWcub2tUaXRsZSB8fCAnT0snXG4gIE1vZGFsLmNhbGwodGhpcylcbiAgdGhpcy5ub2RlLmNsYXNzTGlzdC5hZGQoJ2FtZmUtYWxlcnQnKVxufVxuXG5BbGVydC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1vZGFsLnByb3RvdHlwZSlcblxuQWxlcnQucHJvdG90eXBlLmNyZWF0ZU5vZGVDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChDT05URU5UX0NMQVNTKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY29udGVudClcblxuICB2YXIgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgbXNnLmNsYXNzTGlzdC5hZGQoTVNHX0NMQVNTKVxuICBtc2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5tc2cpKVxuICBjb250ZW50LmFwcGVuZENoaWxkKG1zZylcblxuICB2YXIgYnV0dG9uR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidXR0b25Hcm91cC5jbGFzc0xpc3QuYWRkKEJVVFRPTl9HUk9VUF9DTEFTUylcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGJ1dHRvbkdyb3VwKVxuICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0NMQVNTLCAnYWxlcnQtb2snKVxuICBidXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5va1RpdGxlKSlcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnV0dG9uKVxufVxuXG5BbGVydC5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzKVxuICB2YXIgYnV0dG9uID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3IoJy4nICsgQlVUVE9OX0NMQVNTKVxuICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2soKVxuICB9LmJpbmQodGhpcykpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWxlcnRcbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgTW9kYWwgPSByZXF1aXJlKCcuL21vZGFsJylcbnJlcXVpcmUoJy4uL3N0eWxlcy9jb25maXJtLmNzcycpXG5cbnZhciBDT05URU5UX0NMQVNTID0gJ2NvbnRlbnQnXG52YXIgTVNHX0NMQVNTID0gJ2NvbnRlbnQtbXNnJ1xudmFyIEJVVFRPTl9HUk9VUF9DTEFTUyA9ICdidG4tZ3JvdXAnXG52YXIgQlVUVE9OX0NMQVNTID0gJ2J0bidcblxuZnVuY3Rpb24gQ29uZmlybShjb25maWcpIHtcbiAgdGhpcy5tc2cgPSBjb25maWcubWVzc2FnZSB8fCAnJ1xuICB0aGlzLmNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrXG4gIHRoaXMub2tUaXRsZSA9IGNvbmZpZy5va1RpdGxlIHx8ICdPSydcbiAgdGhpcy5jYW5jZWxUaXRsZSA9IGNvbmZpZy5jYW5jZWxUaXRsZSB8fCAnQ2FuY2VsJ1xuICBNb2RhbC5jYWxsKHRoaXMpXG4gIHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCdhbWZlLWNvbmZpcm0nKVxufVxuXG5Db25maXJtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9kYWwucHJvdG90eXBlKVxuXG5Db25maXJtLnByb3RvdHlwZS5jcmVhdGVOb2RlQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb250ZW50LmNsYXNzTGlzdC5hZGQoQ09OVEVOVF9DTEFTUylcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpXG5cbiAgdmFyIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIG1zZy5jbGFzc0xpc3QuYWRkKE1TR19DTEFTUylcbiAgbXNnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMubXNnKSlcbiAgY29udGVudC5hcHBlbmRDaGlsZChtc2cpXG5cbiAgdmFyIGJ1dHRvbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uR3JvdXAuY2xhc3NMaXN0LmFkZChCVVRUT05fR1JPVVBfQ0xBU1MpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChidXR0b25Hcm91cClcbiAgdmFyIGJ0bk9rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnRuT2suYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5va1RpdGxlKSlcbiAgYnRuT2suY2xhc3NMaXN0LmFkZCgnYnRuLW9rJywgQlVUVE9OX0NMQVNTKVxuICB2YXIgYnRuQ2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnRuQ2FuY2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY2FuY2VsVGl0bGUpKVxuICBidG5DYW5jZWwuY2xhc3NMaXN0LmFkZCgnYnRuLWNhbmNlbCcsIEJVVFRPTl9DTEFTUylcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnRuT2spXG4gIGJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKGJ0bkNhbmNlbClcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGJ1dHRvbkdyb3VwKVxufVxuXG5Db25maXJtLnByb3RvdHlwZS5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICBNb2RhbC5wcm90b3R5cGUuYmluZEV2ZW50cy5jYWxsKHRoaXMpXG4gIHZhciBidG5PayA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLW9rJylcbiAgdmFyIGJ0bkNhbmNlbCA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLWNhbmNlbCcpXG4gIGJ0bk9rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGVzdHJveSgpXG4gICAgdGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrKHRoaXMub2tUaXRsZSlcbiAgfS5iaW5kKHRoaXMpKVxuICBidG5DYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2sodGhpcy5jYW5jZWxUaXRsZSlcbiAgfS5iaW5kKHRoaXMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbmZpcm1cbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgTW9kYWwgPSByZXF1aXJlKCcuL21vZGFsJylcbnJlcXVpcmUoJy4uL3N0eWxlcy9wcm9tcHQuY3NzJylcblxudmFyIENPTlRFTlRfQ0xBU1MgPSAnY29udGVudCdcbnZhciBNU0dfQ0xBU1MgPSAnY29udGVudC1tc2cnXG52YXIgQlVUVE9OX0dST1VQX0NMQVNTID0gJ2J0bi1ncm91cCdcbnZhciBCVVRUT05fQ0xBU1MgPSAnYnRuJ1xudmFyIElOUFVUX1dSQVBfQ0xBU1MgPSAnaW5wdXQtd3JhcCdcbnZhciBJTlBVVF9DTEFTUyA9ICdpbnB1dCdcblxuZnVuY3Rpb24gUHJvbXB0KGNvbmZpZykge1xuICB0aGlzLm1zZyA9IGNvbmZpZy5tZXNzYWdlIHx8ICcnXG4gIHRoaXMuZGVmYXVsdE1zZyA9IGNvbmZpZy5kZWZhdWx0IHx8ICcnXG4gIHRoaXMuY2FsbGJhY2sgPSBjb25maWcuY2FsbGJhY2tcbiAgdGhpcy5va1RpdGxlID0gY29uZmlnLm9rVGl0bGUgfHwgJ09LJ1xuICB0aGlzLmNhbmNlbFRpdGxlID0gY29uZmlnLmNhbmNlbFRpdGxlIHx8ICdDYW5jZWwnXG4gIE1vZGFsLmNhbGwodGhpcylcbiAgdGhpcy5ub2RlLmNsYXNzTGlzdC5hZGQoJ2FtZmUtcHJvbXB0Jylcbn1cblxuUHJvbXB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9kYWwucHJvdG90eXBlKVxuXG5Qcm9tcHQucHJvdG90eXBlLmNyZWF0ZU5vZGVDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgY29udGVudC5jbGFzc0xpc3QuYWRkKENPTlRFTlRfQ0xBU1MpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChjb250ZW50KVxuXG4gIHZhciBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBtc2cuY2xhc3NMaXN0LmFkZChNU0dfQ0xBU1MpXG4gIG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm1zZykpXG4gIGNvbnRlbnQuYXBwZW5kQ2hpbGQobXNnKVxuXG4gIHZhciBpbnB1dFdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBpbnB1dFdyYXAuY2xhc3NMaXN0LmFkZChJTlBVVF9XUkFQX0NMQVNTKVxuICBjb250ZW50LmFwcGVuZENoaWxkKGlucHV0V3JhcClcbiAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuICBpbnB1dC5jbGFzc0xpc3QuYWRkKElOUFVUX0NMQVNTKVxuICBpbnB1dC50eXBlID0gJ3RleHQnXG4gIGlucHV0LmF1dG9mb2N1cyA9IHRydWVcbiAgaW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLmRlZmF1bHRNc2dcbiAgaW5wdXRXcmFwLmFwcGVuZENoaWxkKGlucHV0KVxuXG4gIHZhciBidXR0b25Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ1dHRvbkdyb3VwLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0dST1VQX0NMQVNTKVxuICB2YXIgYnRuT2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidG5Pay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm9rVGl0bGUpKVxuICBidG5Pay5jbGFzc0xpc3QuYWRkKCdidG4tb2snLCBCVVRUT05fQ0xBU1MpXG4gIHZhciBidG5DYW5jZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidG5DYW5jZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jYW5jZWxUaXRsZSkpXG4gIGJ0bkNhbmNlbC5jbGFzc0xpc3QuYWRkKCdidG4tY2FuY2VsJywgQlVUVE9OX0NMQVNTKVxuICBidXR0b25Hcm91cC5hcHBlbmRDaGlsZChidG5PaylcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnRuQ2FuY2VsKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXApXG59XG5cblByb21wdC5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzKVxuICB2YXIgYnRuT2sgPSB0aGlzLm5vZGUucXVlcnlTZWxlY3RvcignLicgKyBCVVRUT05fQ0xBU1MgKyAnLmJ0bi1vaycpXG4gIHZhciBidG5DYW5jZWwgPSB0aGlzLm5vZGUucXVlcnlTZWxlY3RvcignLicgKyBCVVRUT05fQ0xBU1MgKyAnLmJ0bi1jYW5jZWwnKVxuICB2YXIgdGhhdCA9IHRoaXNcbiAgYnRuT2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykudmFsdWVcbiAgICB0aGlzLmRlc3Ryb3koKVxuICAgIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjayh7XG4gICAgICByZXN1bHQ6IHRoYXQub2tUaXRsZSxcbiAgICAgIGRhdGE6IHZhbFxuICAgIH0pXG4gIH0uYmluZCh0aGlzKSlcbiAgYnRuQ2FuY2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLnZhbHVlXG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2soe1xuICAgICAgcmVzdWx0OiB0aGF0LmNhbmNlbFRpdGxlLFxuICAgICAgZGF0YTogdmFsXG4gICAgfSlcbiAgfS5iaW5kKHRoaXMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21wdFxuIiwiJ3VzZSBzdHJpY3QnXG5cbnJlcXVpcmUoJy4uL3N0eWxlcy90b2FzdC5jc3MnKVxuXG52YXIgcXVldWUgPSBbXVxudmFyIHRpbWVyXG52YXIgaXNQcm9jZXNzaW5nID0gZmFsc2VcbnZhciB0b2FzdFdpblxudmFyIFRPQVNUX1dJTl9DTEFTU19OQU1FID0gJ2FtZmUtdG9hc3QnXG5cbnZhciBERUZBVUxUX0RVUkFUSU9OID0gMC44XG5cbmZ1bmN0aW9uIHNob3dUb2FzdFdpbmRvdyhtc2csIGNhbGxiYWNrKSB7XG4gIHZhciBoYW5kbGVUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHRvYXN0V2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICAgIHRvYXN0V2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgfVxuICBpZiAoIXRvYXN0V2luKSB7XG4gICAgdG9hc3RXaW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRvYXN0V2luLmNsYXNzTGlzdC5hZGQoVE9BU1RfV0lOX0NMQVNTX05BTUUsICdoaWRlJylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0V2luKVxuICB9XG4gIHRvYXN0V2luLnRleHRDb250ZW50ID0gbXNnXG4gIHRvYXN0V2luLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICB0b2FzdFdpbi5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdG9hc3RXaW4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGhpZGVUb2FzdFdpbmRvdyhjYWxsYmFjaykge1xuICB2YXIgaGFuZGxlVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0b2FzdFdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgICB0b2FzdFdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gIH1cbiAgaWYgKCF0b2FzdFdpbikge1xuICAgIHJldHVyblxuICB9XG4gIHRvYXN0V2luLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICB0b2FzdFdpbi5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdG9hc3RXaW4uY2xhc3NMaXN0LmFkZCgnaGlkZScpXG4gIH0sIDApXG59XG5cbnZhciB0b2FzdCA9IHtcblxuICBwdXNoOiBmdW5jdGlvbiAobXNnLCBkdXJhdGlvbikge1xuICAgIHF1ZXVlLnB1c2goe1xuICAgICAgbXNnOiBtc2csXG4gICAgICBkdXJhdGlvbjogZHVyYXRpb24gfHwgREVGQVVMVF9EVVJBVElPTlxuICAgIH0pXG4gICAgdGhpcy5zaG93KClcbiAgfSxcblxuICBzaG93OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG5cbiAgICAvLyBBbGwgbWVzc2FnZXMgaGFkIGJlZW4gdG9hc3RlZCBhbHJlYWR5LCBzbyByZW1vdmUgdGhlIHRvYXN0IHdpbmRvdyxcbiAgICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgICAgdG9hc3RXaW4gJiYgdG9hc3RXaW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2FzdFdpbilcbiAgICAgIHRvYXN0V2luID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdGhlIHByZXZpb3VzIHRvYXN0IGlzIG5vdCBlbmRlZCB5ZXQuXG4gICAgaWYgKGlzUHJvY2Vzc2luZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlzUHJvY2Vzc2luZyA9IHRydWVcblxuICAgIHZhciB0b2FzdEluZm8gPSBxdWV1ZS5zaGlmdCgpXG4gICAgc2hvd1RvYXN0V2luZG93KHRvYXN0SW5mby5tc2csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRpbWVyID0gbnVsbFxuICAgICAgICBoaWRlVG9hc3RXaW5kb3coZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IGZhbHNlXG4gICAgICAgICAgdGhhdC5zaG93KClcbiAgICAgICAgfSlcbiAgICAgIH0sIHRvYXN0SW5mby5kdXJhdGlvbiAqIDEwMDApXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcHVzaDogdG9hc3QucHVzaC5iaW5kKHRvYXN0KVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBBbGVydCA9IHJlcXVpcmUoJy4vYWxlcnQnKVxudmFyIENvbmZpcm0gPSByZXF1aXJlKCcuL2NvbmZpcm0nKVxudmFyIFByb21wdCA9IHJlcXVpcmUoJy4vcHJvbXB0JylcbnZhciB0b2FzdCA9IHJlcXVpcmUoJy4vdG9hc3QnKVxuXG52YXIgbW9kYWwgPSB7XG5cbiAgdG9hc3Q6IGZ1bmN0aW9uIChtc2csIGR1cmF0aW9uKSB7XG4gICAgdG9hc3QucHVzaChtc2csIGR1cmF0aW9uKVxuICB9LFxuXG4gIGFsZXJ0OiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgbmV3IEFsZXJ0KGNvbmZpZykuc2hvdygpXG4gIH0sXG5cbiAgcHJvbXB0OiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgbmV3IFByb21wdChjb25maWcpLnNob3coKVxuICB9LFxuXG4gIGNvbmZpcm06IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICBuZXcgQ29uZmlybShjb25maWcpLnNob3coKVxuICB9XG5cbn1cblxuIXdpbmRvdy5saWIgJiYgKHdpbmRvdy5saWIgPSB7fSlcbndpbmRvdy5saWIubW9kYWwgPSBtb2RhbFxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZGFsIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IG1vZGFsIGZyb20gJ21vZGFscydcblxuY29uc3QgbXNnID0ge1xuXG4gIC8vIGR1cmF0aW9uOiBkZWZhdWx0IGlzIDAuOCBzZWNvbmRzLlxuICB0b2FzdDogZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIG1vZGFsLnRvYXN0KGNvbmZpZy5tZXNzYWdlLCBjb25maWcuZHVyYXRpb24pXG4gIH0sXG5cbiAgLy8gY29uZmlnOlxuICAvLyAgLSBtZXNzYWdlOiBzdHJpbmdcbiAgLy8gIC0gb2tUaXRsZTogdGl0bGUgb2Ygb2sgYnV0dG9uXG4gIC8vICAtIGNhbGxiYWNrXG4gIGFsZXJ0OiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFja0lkKSB7XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBjb25maWcuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQpXG4gICAgfVxuICAgIG1vZGFsLmFsZXJ0KGNvbmZpZylcbiAgfSxcblxuICAvLyBjb25maWc6XG4gIC8vICAtIG1lc3NhZ2U6IHN0cmluZ1xuICAvLyAgLSBva1RpdGxlOiB0aXRsZSBvZiBvayBidXR0b25cbiAgLy8gIC0gY2FuY2VsVGl0bGU6IHRpdGxlIG9mIGNhbmNlbCBidXR0b25cbiAgLy8gIC0gY2FsbGJhY2tcbiAgY29uZmlybTogZnVuY3Rpb24gKGNvbmZpZywgY2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgY29uZmlnLmNhbGxiYWNrID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB2YWwpXG4gICAgfVxuICAgIG1vZGFsLmNvbmZpcm0oY29uZmlnKVxuICB9LFxuXG4gIC8vIGNvbmZpZzpcbiAgLy8gIC0gbWVzc2FnZTogc3RyaW5nXG4gIC8vICAtIG9rVGl0bGU6IHRpdGxlIG9mIG9rIGJ1dHRvblxuICAvLyAgLSBjYW5jZWxUaXRsZTogdGl0bGUgb2YgY2FuY2VsIGJ1dHRvblxuICAvLyAgLSBjYWxsYmFja1xuICBwcm9tcHQ6IGZ1bmN0aW9uIChjb25maWcsIGNhbGxiYWNrSWQpIHtcbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGNvbmZpZy5jYWxsYmFjayA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgdmFsKVxuICAgIH1cbiAgICBtb2RhbC5wcm9tcHQoY29uZmlnKVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIG1vZGFsOiBbe1xuICAgIG5hbWU6ICd0b2FzdCcsXG4gICAgYXJnczogWydvYmplY3QnXVxuICB9LCB7XG4gICAgbmFtZTogJ2FsZXJ0JyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnY29uZmlybScsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ3Byb21wdCcsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnbW9kYWwnLCBtc2csIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG5hdmlnYXRvciA9IHtcblxuICAvLyBjb25maWdcbiAgLy8gIC0gdXJsOiB0aGUgdXJsIHRvIHB1c2hcbiAgLy8gIC0gYW5pbWF0ZWQ6IHRoaXMgY29uZmlndXJhdGlvbiBpdGVtIGlzIG5hdGl2ZSBvbmx5XG4gIC8vICBjYWxsYmFjayBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZFxuICBwdXNoOiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFja0lkKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBjb25maWcudXJsXG4gICAgdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQpXG4gIH0sXG5cbiAgLy8gY29uZmlnXG4gIC8vICAtIGFuaW1hdGVkOiB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbSBpcyBuYXRpdmUgb25seVxuICAvLyAgY2FsbGJhY2sgaXMgbm90ZSBjdXJyZW50bHkgc3VwcG9ydGVkXG4gIHBvcDogZnVuY3Rpb24gKGNvbmZpZywgY2FsbGJhY2tJZCkge1xuICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKVxuICAgIHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkKVxuICB9XG5cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgbmF2aWdhdG9yOiBbe1xuICAgIG5hbWU6ICdwdXNoJyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAncG9wJyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCduYXZpZ2F0b3InLCBuYXZpZ2F0b3IsIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhZ2VJbmZvID0ge1xuXG4gIHNldFRpdGxlOiBmdW5jdGlvbiAodGl0bGUpIHtcbiAgICB0aXRsZSA9IHRpdGxlIHx8ICdXZWV4IEhUTUw1J1xuICAgIHRyeSB7XG4gICAgICB0aXRsZSA9IGRlY29kZVVSSUNvbXBvbmVudCh0aXRsZSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHt9XG4gICAgZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIHBhZ2VJbmZvOiBbe1xuICAgIG5hbWU6ICdzZXRUaXRsZScsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgncGFnZUluZm8nLCBwYWdlSW5mbywgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgbG9jYWxTdG9yYWdlICovXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBzdXBwb3J0TG9jYWxTdG9yYWdlID0gdHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCdcbmNvbnN0IFNVQ0NFU1MgPSAnc3VjY2VzcydcbmNvbnN0IEZBSUxFRCA9ICdmYWlsZWQnXG5jb25zdCBJTlZBTElEX1BBUkFNID0gJ2ludmFsaWRfcGFyYW0nXG5jb25zdCBVTkRFRklORUQgPSAndW5kZWZpbmVkJ1xuXG5jb25zdCBzdG9yYWdlID0ge1xuXG4gIC8qKlxuICAgKiBXaGVuIHBhc3NlZCBhIGtleSBuYW1lIGFuZCB2YWx1ZSwgd2lsbCBhZGQgdGhhdCBrZXkgdG8gdGhlIHN0b3JhZ2UsXG4gICAqIG9yIHVwZGF0ZSB0aGF0IGtleSdzIHZhbHVlIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBzZXRJdGVtOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgY2FsbGJhY2tJZCkge1xuICAgIGlmICghc3VwcG9ydExvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc29sZS5lcnJvcigneW91ciBicm93c2VyIGlzIG5vdCBzdXBwb3J0IGxvY2FsU3RvcmFnZSB5ZXQuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGlmICgha2V5IHx8ICF2YWx1ZSkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgIGRhdGE6IElOVkFMSURfUEFSQU1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpXG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgICAgcmVzdWx0OiBTVUNDRVNTLFxuICAgICAgICBkYXRhOiBVTkRFRklORURcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAvLyBhY2NlcHQgYW55IGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGEgc3RvcmFnZSBhdHRlbXB0IGFzIGEgcXVvdGEgZXJyb3JcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogVU5ERUZJTkVEXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogV2hlbiBwYXNzZWQgYSBrZXkgbmFtZSwgd2lsbCByZXR1cm4gdGhhdCBrZXkncyB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRJdGVtOiBmdW5jdGlvbiAoa2V5LCBjYWxsYmFja0lkKSB7XG4gICAgaWYgKCFzdXBwb3J0TG9jYWxTdG9yYWdlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd5b3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnQgbG9jYWxTdG9yYWdlIHlldC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogSU5WQUxJRF9QQVJBTVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB2YWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpXG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IHZhbCA/IFNVQ0NFU1MgOiBGQUlMRUQsXG4gICAgICBkYXRhOiB2YWwgfHwgVU5ERUZJTkVEXG4gICAgfSlcbiAgfSxcblxuICAvKipcbiAgICpXaGVuIHBhc3NlZCBhIGtleSBuYW1lLCB3aWxsIHJlbW92ZSB0aGF0IGtleSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIHJlbW92ZUl0ZW06IGZ1bmN0aW9uIChrZXksIGNhbGxiYWNrSWQpIHtcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydCBsb2NhbFN0b3JhZ2UgeWV0LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBpZiAoIWtleSkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogRkFJTEVELFxuICAgICAgICBkYXRhOiBJTlZBTElEX1BBUkFNXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSlcbiAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgIHJlc3VsdDogU1VDQ0VTUyxcbiAgICAgIGRhdGE6IFVOREVGSU5FRFxuICAgIH0pXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBkYXRhIGl0ZW1zIHN0b3JlZCBpbiB0aGUgU3RvcmFnZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIGxlbmd0aDogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydCBsb2NhbFN0b3JhZ2UgeWV0LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBjb25zdCBsZW4gPSBsb2NhbFN0b3JhZ2UubGVuZ3RoXG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICBkYXRhOiBsZW5cbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IHRoYXQgY29udGFpbnMgYWxsIGtleXMgc3RvcmVkIGluIFN0b3JhZ2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRBbGxLZXlzOiBmdW5jdGlvbiAoY2FsbGJhY2tJZCkge1xuICAgIGlmICghc3VwcG9ydExvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc29sZS5lcnJvcigneW91ciBicm93c2VyIGlzIG5vdCBzdXBwb3J0IGxvY2FsU3RvcmFnZSB5ZXQuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGNvbnN0IF9hcnIgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfYXJyLnB1c2gobG9jYWxTdG9yYWdlLmtleShpKSlcbiAgICB9XG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICBkYXRhOiBfYXJyXG4gICAgfSlcbiAgfVxufVxuXG5jb25zdCBtZXRhID0ge1xuICBzdG9yYWdlOiBbe1xuICAgIG5hbWU6ICdzZXRJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdzdHJpbmcnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ2dldEl0ZW0nLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdyZW1vdmVJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnbGVuZ3RoJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdnZXRBbGxLZXlzJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3N0b3JhZ2UnLCBzdG9yYWdlLCBtZXRhKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIpIHtcblx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24gKGMpIHtcblx0XHRyZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHR9KTtcbn07XG4iLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cmljdFVyaUVuY29kZSA9IHJlcXVpcmUoJ3N0cmljdC11cmktZW5jb2RlJyk7XG52YXIgb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG5mdW5jdGlvbiBlbmNvZGVyRm9yQXJyYXlGb3JtYXQob3B0cykge1xuXHRzd2l0Y2ggKG9wdHMuYXJyYXlGb3JtYXQpIHtcblx0XHRjYXNlICdpbmRleCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGluZGV4KSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IFtcblx0XHRcdFx0XHRlbmNvZGUoa2V5LCBvcHRzKSxcblx0XHRcdFx0XHQnWycsXG5cdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0J10nXG5cdFx0XHRcdF0uam9pbignJykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1snLFxuXHRcdFx0XHRcdGVuY29kZShpbmRleCwgb3B0cyksXG5cdFx0XHRcdFx0J109Jyxcblx0XHRcdFx0XHRlbmNvZGUodmFsdWUsIG9wdHMpXG5cdFx0XHRcdF0uam9pbignJyk7XG5cdFx0XHR9O1xuXG5cdFx0Y2FzZSAnYnJhY2tldCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBudWxsID8gZW5jb2RlKGtleSwgb3B0cykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1tdPScsXG5cdFx0XHRcdFx0ZW5jb2RlKHZhbHVlLCBvcHRzKVxuXHRcdFx0XHRdLmpvaW4oJycpO1xuXHRcdFx0fTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBudWxsID8gZW5jb2RlKGtleSwgb3B0cykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0Jz0nLFxuXHRcdFx0XHRcdGVuY29kZSh2YWx1ZSwgb3B0cylcblx0XHRcdFx0XS5qb2luKCcnKTtcblx0XHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0cykge1xuXHR2YXIgcmVzdWx0O1xuXG5cdHN3aXRjaCAob3B0cy5hcnJheUZvcm1hdCkge1xuXHRcdGNhc2UgJ2luZGV4Jzpcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcblx0XHRcdFx0cmVzdWx0ID0gL1xcWyhcXGQqKVxcXSQvLmV4ZWMoa2V5KTtcblxuXHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZSgvXFxbXFxkKlxcXSQvLCAnJyk7XG5cblx0XHRcdFx0aWYgKCFyZXN1bHQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gdmFsdWU7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGFjY3VtdWxhdG9yW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV1bcmVzdWx0WzFdXSA9IHZhbHVlO1xuXHRcdFx0fTtcblxuXHRcdGNhc2UgJ2JyYWNrZXQnOlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuXHRcdFx0XHRyZXN1bHQgPSAvKFxcW1xcXSkkLy5leGVjKGtleSk7XG5cdFx0XHRcdGtleSA9IGtleS5yZXBsYWNlKC9cXFtcXF0kLywgJycpO1xuXG5cdFx0XHRcdGlmICghcmVzdWx0KSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gW3ZhbHVlXTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gW10uY29uY2F0KGFjY3VtdWxhdG9yW2tleV0sIHZhbHVlKTtcblx0XHRcdH07XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuXHRcdFx0XHRpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xuXHRcdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIG9wdHMpIHtcblx0aWYgKG9wdHMuZW5jb2RlKSB7XG5cdFx0cmV0dXJuIG9wdHMuc3RyaWN0ID8gc3RyaWN0VXJpRW5jb2RlKHZhbHVlKSA6IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGtleXNTb3J0ZXIoaW5wdXQpIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG5cdFx0cmV0dXJuIGlucHV0LnNvcnQoKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGtleXNTb3J0ZXIoT2JqZWN0LmtleXMoaW5wdXQpKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKGEpIC0gTnVtYmVyKGIpO1xuXHRcdH0pLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gaW5wdXRba2V5XTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBpbnB1dDtcbn1cblxuZXhwb3J0cy5leHRyYWN0ID0gZnVuY3Rpb24gKHN0cikge1xuXHRyZXR1cm4gc3RyLnNwbGl0KCc/JylbMV0gfHwgJyc7XG59O1xuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuXHRvcHRzID0gb2JqZWN0QXNzaWduKHthcnJheUZvcm1hdDogJ25vbmUnfSwgb3B0cyk7XG5cblx0dmFyIGZvcm1hdHRlciA9IHBhcnNlckZvckFycmF5Rm9ybWF0KG9wdHMpO1xuXG5cdC8vIENyZWF0ZSBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGVcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmcvaXNzdWVzLzQ3XG5cdHZhciByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5cdGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiByZXQ7XG5cdH1cblxuXHRzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL14oXFw/fCN8JikvLCAnJyk7XG5cblx0aWYgKCFzdHIpIHtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0c3RyLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcblx0XHR2YXIgcGFydHMgPSBwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKS5zcGxpdCgnPScpO1xuXHRcdC8vIEZpcmVmb3ggKHByZSA0MCkgZGVjb2RlcyBgJTNEYCB0byBgPWBcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZy9wdWxsLzM3XG5cdFx0dmFyIGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0dmFyIHZhbCA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0cy5qb2luKCc9JykgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBtaXNzaW5nIGA9YCBzaG91bGQgYmUgYG51bGxgOlxuXHRcdC8vIGh0dHA6Ly93My5vcmcvVFIvMjAxMi9XRC11cmwtMjAxMjA1MjQvI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHR2YWwgPSB2YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcblxuXHRcdGZvcm1hdHRlcihkZWNvZGVVUklDb21wb25lbnQoa2V5KSwgdmFsLCByZXQpO1xuXHR9KTtcblxuXHRyZXR1cm4gT2JqZWN0LmtleXMocmV0KS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuXHRcdHZhciB2YWwgPSByZXRba2V5XTtcblx0XHRpZiAoQm9vbGVhbih2YWwpICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdC8vIFNvcnQgb2JqZWN0IGtleXMsIG5vdCB2YWx1ZXNcblx0XHRcdHJlc3VsdFtrZXldID0ga2V5c1NvcnRlcih2YWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHRba2V5XSA9IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn07XG5cbmV4cG9ydHMuc3RyaW5naWZ5ID0gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuXHR2YXIgZGVmYXVsdHMgPSB7XG5cdFx0ZW5jb2RlOiB0cnVlLFxuXHRcdHN0cmljdDogdHJ1ZSxcblx0XHRhcnJheUZvcm1hdDogJ25vbmUnXG5cdH07XG5cblx0b3B0cyA9IG9iamVjdEFzc2lnbihkZWZhdWx0cywgb3B0cyk7XG5cblx0dmFyIGZvcm1hdHRlciA9IGVuY29kZXJGb3JBcnJheUZvcm1hdChvcHRzKTtcblxuXHRyZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHR2YXIgdmFsID0gb2JqW2tleV07XG5cblx0XHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRpZiAodmFsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZW5jb2RlKGtleSwgb3B0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xuXG5cdFx0XHR2YWwuc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwyKSB7XG5cdFx0XHRcdGlmICh2YWwyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQucHVzaChmb3JtYXR0ZXIoa2V5LCB2YWwyLCByZXN1bHQubGVuZ3RoKSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5qb2luKCcmJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVuY29kZShrZXksIG9wdHMpICsgJz0nICsgZW5jb2RlKHZhbCwgb3B0cyk7XG5cdH0pLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuXHRcdHJldHVybiB4Lmxlbmd0aCA+IDA7XG5cdH0pLmpvaW4oJyYnKSA6ICcnO1xufTtcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiwgWE1MSHR0cFJlcXVlc3QgKi9cbi8qIGRlcHM6IGh0dHB1cmwgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmxldCB1dGlsc1xuXG5pbXBvcnQgJ2h0dHB1cmwnXG5pbXBvcnQgcXMgZnJvbSAncXVlcnktc3RyaW5nJ1xuXG5sZXQganNvbnBDbnQgPSAwXG5jb25zdCBFUlJPUl9TVEFURSA9IC0xXG5cbmZ1bmN0aW9uIF9qc29ucCAoY29uZmlnLCBjYWxsYmFjaywgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICBjb25zdCBjYk5hbWUgPSAnanNvbnBfJyArICgrK2pzb25wQ250KVxuICBsZXQgdXJsXG5cbiAgaWYgKCFjb25maWcudXJsKSB7XG4gICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gY29uZmlnLnVybCBzaG91bGQgYmUgc2V0IGluIF9qc29ucCBmb3IgXFwnZmV0Y2hcXCcgQVBJLicpXG4gIH1cblxuICBnbG9iYWxbY2JOYW1lXSA9IChmdW5jdGlvbiAoY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjayh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgZGF0YTogcmVzcG9uc2VcbiAgICAgIH0pXG4gICAgICBkZWxldGUgZ2xvYmFsW2NiXVxuICAgIH1cbiAgfSkoY2JOYW1lKVxuXG4gIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gIHRyeSB7XG4gICAgdXJsID0gbGliLmh0dHB1cmwoY29uZmlnLnVybClcbiAgfVxuICBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBjb25maWcudXJsIGluIF9qc29ucCBmb3IgXFwnZmV0Y2hcXCcgQVBJOiAnXG4gICAgICArIGNvbmZpZy51cmwpXG4gIH1cbiAgdXJsLnBhcmFtcy5jYWxsYmFjayA9IGNiTmFtZVxuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnXG4gIHNjcmlwdC5zcmMgPSB1cmwudG9TdHJpbmcoKVxuICAvLyBzY3JpcHQub25lcnJvciBpcyBub3Qgd29ya2luZyBvbiBJRSBvciBzYWZhcmkuXG4gIC8vIGJ1dCB0aGV5IGFyZSBub3QgY29uc2lkZXJlZCBoZXJlLlxuICBzY3JpcHQub25lcnJvciA9IChmdW5jdGlvbiAoY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gdW5leHBlY3RlZCBlcnJvciBpbiBfanNvbnAgZm9yIFxcJ2ZldGNoXFwnIEFQSScsIGVycilcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgc3RhdHVzOiBFUlJPUl9TVEFURSxcbiAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAgICAgZGF0YTogJydcbiAgICAgIH0pXG4gICAgICBkZWxldGUgZ2xvYmFsW2NiXVxuICAgIH1cbiAgfSkoY2JOYW1lKVxuICBjb25zdCBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXVxuICBoZWFkLmluc2VydEJlZm9yZShzY3JpcHQsIG51bGwpXG59XG5cbmZ1bmN0aW9uIF94aHIgKGNvbmZpZywgY2FsbGJhY2ssIHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgeGhyLnJlc3BvbnNlVHlwZSA9IGNvbmZpZy50eXBlXG4gIHhoci5vcGVuKGNvbmZpZy5tZXRob2QsIGNvbmZpZy51cmwsIHRydWUpXG5cbiAgLy8gY29ycyBjb29raWUgc3VwcG9ydFxuICBpZiAoY29uZmlnLndpdGhDcmVkZW50aWFscyA9PT0gdHJ1ZSkge1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge31cbiAgZm9yIChjb25zdCBrIGluIGhlYWRlcnMpIHtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrLCBoZWFkZXJzW2tdKVxuICB9XG5cbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgICBjYWxsYmFjayh7XG4gICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICBvazogeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCxcbiAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgZGF0YTogeGhyLnJlc3BvbnNlLFxuICAgICAgaGVhZGVyczogeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KCdcXG4nKVxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChvYmosIGhlYWRlclN0cikge1xuICAgICAgICAgIGNvbnN0IGhlYWRlckFyciA9IGhlYWRlclN0ci5tYXRjaCgvKC4rKTogKC4rKS8pXG4gICAgICAgICAgaWYgKGhlYWRlckFycikge1xuICAgICAgICAgICAgb2JqW2hlYWRlckFyclsxXV0gPSBoZWFkZXJBcnJbMl1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9LCB7fSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICB4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBwcm9ncmVzc0NhbGxiYWNrKHtcbiAgICAgICAgcmVhZHlTdGF0ZTogeGhyLnJlYWR5U3RhdGUsXG4gICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgbGVuZ3RoOiBlLmxvYWRlZCxcbiAgICAgICAgdG90YWw6IGUudG90YWwsXG4gICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAob2JqLCBoZWFkZXJTdHIpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckFyciA9IGhlYWRlclN0ci5tYXRjaCgvKC4rKTogKC4rKS8pXG4gICAgICAgICAgICBpZiAoaGVhZGVyQXJyKSB7XG4gICAgICAgICAgICAgIG9ialtoZWFkZXJBcnJbMV1dID0gaGVhZGVyQXJyWzJdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSwge30pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIHVuZXhwZWN0ZWQgZXJyb3IgaW4gX3hociBmb3IgXFwnZmV0Y2hcXCcgQVBJJywgZXJyKVxuICAgIGNhbGxiYWNrKHtcbiAgICAgIHN0YXR1czogRVJST1JfU1RBVEUsXG4gICAgICBvazogZmFsc2UsXG4gICAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAgIGRhdGE6ICcnXG4gICAgfSlcbiAgfVxuXG4gIHhoci5zZW5kKGNvbmZpZy5ib2R5IHx8IG51bGwpXG59XG5cbmNvbnN0IHN0cmVhbSA9IHtcblxuICAvKipcbiAgICogc2VuZEh0dHBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogTm90ZTogVGhpcyBBUEkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBzdHJlYW0uZmV0Y2ggaW5zdGVhZC5cbiAgICogc2VuZCBhIGh0dHAgcmVxdWVzdCB0aHJvdWdoIFhIUi5cbiAgICogQHBhcmFtICB7b2JqfSBwYXJhbXNcbiAgICogIC0gbWV0aG9kOiAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnIHwgJ0RFTEVURScgfCAnSEVBRCcgfCAnUEFUQ0gnLFxuICAgKiAgLSB1cmw6IHVybCByZXF1ZXN0ZWRcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjYWxsYmFja0lkXG4gICAqL1xuICBzZW5kSHR0cDogZnVuY3Rpb24gKHBhcmFtLCBjYWxsYmFja0lkKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcmFtID0gSlNPTi5wYXJzZShwYXJhbSlcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtICE9PSAnb2JqZWN0JyB8fCAhcGFyYW0udXJsKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1toNS1yZW5kZXJdIGludmFsaWQgY29uZmlnIG9yIGludmFsaWQgY29uZmlnLnVybCBmb3Igc2VuZEh0dHAgQVBJJylcbiAgICB9XG5cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGNvbnN0IG1ldGhvZCA9IHBhcmFtLm1ldGhvZCB8fCAnR0VUJ1xuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgeGhyLm9wZW4obWV0aG9kLCBwYXJhbS51cmwsIHRydWUpXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgdGhpcy5yZXNwb25zZVRleHQpXG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gdW5leHBlY3RlZCBlcnJvciBpbiBzZW5kSHR0cCBBUEknLCBlcnJvcilcbiAgICAgIC8vIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soXG4gICAgICAvLyAgIGNhbGxiYWNrSWQsXG4gICAgICAvLyAgIG5ldyBFcnJvcigndW5leHBlY3RlZCBlcnJvciBpbiBzZW5kSHR0cCBBUEknKVxuICAgICAgLy8gKVxuICAgIH1cbiAgICB4aHIuc2VuZCgpXG4gIH0sXG5cbiAgLyoqXG4gICAqIGZldGNoXG4gICAqIHVzZSBzdHJlYW0uZmV0Y2ggdG8gcmVxdWVzdCBmb3IgYSBqc29uIGZpbGUsIGEgcGxhaW4gdGV4dCBmaWxlIG9yXG4gICAqIGEgYXJyYXlidWZmZXIgZm9yIGEgZmlsZSBzdHJlYW0uIChZb3UgY2FuIHVzZSBCbG9iIGFuZCBGaWxlUmVhZGVyXG4gICAqIEFQSSBpbXBsZW1lbnRlZCBieSBtb3N0IG1vZGVybiBicm93c2VycyB0byByZWFkIGEgYXJyYXlidWZmZXIuKVxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgY29uZmlnIG9wdGlvbnNcbiAgICogICAtIG1ldGhvZDogJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJyB8ICdERUxFVEUnIHwgJ0hFQUQnIHwgJ1BBVENIJ1xuICAgKiAgIC0gaGVhZGVycyB7b2JqfVxuICAgKiAgIC0gdXJsIHtzdHJpbmd9XG4gICAqICAgLSBtb2RlIHtzdHJpbmd9ICdjb3JzJyB8ICduby1jb3JzJyB8ICdzYW1lLW9yaWdpbicgfCAnbmF2aWdhdGUnXG4gICAqICAgLSB3aXRoQ3JlZGVudGlhbHMge2Jvb2xlYW59XG4gICAqICAgLSBib2R5XG4gICAqICAgLSB0eXBlIHtzdHJpbmd9ICdqc29uJyB8ICdqc29ucCcgfCAndGV4dCdcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjYWxsYmFja0lkXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcHJvZ3Jlc3NDYWxsYmFja0lkXG4gICAqL1xuICBmZXRjaDogZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrSWQsIHByb2dyZXNzQ2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IERFRkFVTFRfTUVUSE9EID0gJ0dFVCdcbiAgICBjb25zdCBERUZBVUxUX01PREUgPSAnY29ycydcbiAgICBjb25zdCBERUZBVUxUX1RZUEUgPSAndGV4dCdcblxuICAgIGNvbnN0IG1ldGhvZE9wdGlvbnMgPSBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnLCAnSEVBRCcsICdQQVRDSCddXG4gICAgY29uc3QgbW9kZU9wdGlvbnMgPSBbJ2NvcnMnLCAnbm8tY29ycycsICdzYW1lLW9yaWdpbicsICduYXZpZ2F0ZSddXG4gICAgY29uc3QgdHlwZU9wdGlvbnMgPSBbJ3RleHQnLCAnanNvbicsICdqc29ucCcsICdhcnJheWJ1ZmZlciddXG5cbiAgICAvLyBjb25zdCBmYWxsYmFjayA9IGZhbHNlICAvLyBmYWxsYmFjayBmcm9tICdmZXRjaCcgQVBJIHRvIFhIUi5cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuXG4gICAgY29uc3QgY29uZmlnID0gdXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zKVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy5tZXRob2RcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5tZXRob2QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWcubWV0aG9kID0gREVGQVVMVF9NRVRIT0RcbiAgICAgIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gb3B0aW9ucy5tZXRob2QgZm9yIFxcJ2ZldGNoXFwnIEFQSSBoYXMgYmVlbiBzZXQgdG8gJ1xuICAgICAgICArICdkZWZhdWx0IHZhbHVlIFxcJycgKyBjb25maWcubWV0aG9kICsgJ1xcJycpXG4gICAgfVxuICAgIGVsc2UgaWYgKG1ldGhvZE9wdGlvbnMuaW5kZXhPZigoY29uZmlnLm1ldGhvZCArICcnKVxuICAgICAgICAudG9VcHBlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy5tZXRob2QgXFwnJ1xuICAgICAgICArIGNvbmZpZy5tZXRob2RcbiAgICAgICAgKyAnXFwnIGZvciBcXCdmZXRjaFxcJyBBUEkgc2hvdWxkIGJlIG9uZSBvZiAnXG4gICAgICAgICsgbWV0aG9kT3B0aW9ucyArICcuJylcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zLnVybFxuICAgIGlmICghY29uZmlnLnVybCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIG9wdGlvbnMudXJsIHNob3VsZCBiZSBzZXQgZm9yIFxcJ2ZldGNoXFwnIEFQSS4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGJvZHkgY29udGVudCBmb3IgbWV0aG9kICdHRVQnLlxuICAgIGlmIChjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09ICdHRVQnKSB7XG4gICAgICBsZXQgYm9keSA9IGNvbmZpZy5ib2R5XG4gICAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChib2R5KSkge1xuICAgICAgICBib2R5ID0gcXMuc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9XG4gICAgICBsZXQgdXJsID0gY29uZmlnLnVybFxuICAgICAgbGV0IGhhc2hJZHggPSB1cmwuaW5kZXhPZignIycpXG4gICAgICBoYXNoSWR4IDw9IC0xICYmIChoYXNoSWR4ID0gdXJsLmxlbmd0aClcbiAgICAgIGxldCBoYXNoID0gdXJsLnN1YnN0cihoYXNoSWR4KVxuICAgICAgaGFzaCAmJiAoaGFzaCA9ICcjJyArIGhhc2gpXG4gICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGhhc2hJZHgpXG4gICAgICB1cmwgKz0gKGNvbmZpZy51cmwuaW5kZXhPZignPycpIDw9IC0xID8gJz8nIDogJyYnKSArIGJvZHkgKyBoYXNoXG4gICAgICBjb25maWcudXJsID0gdXJsXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy5tb2RlXG4gICAgaWYgKHR5cGVvZiBjb25maWcubW9kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy5tb2RlID0gREVGQVVMVF9NT0RFXG4gICAgfVxuICAgIGVsc2UgaWYgKG1vZGVPcHRpb25zLmluZGV4T2YoKGNvbmZpZy5tb2RlICsgJycpLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIG9wdGlvbnMubW9kZSBcXCcnXG4gICAgICAgICsgY29uZmlnLm1vZGVcbiAgICAgICAgKyAnXFwnIGZvciBcXCdmZXRjaFxcJyBBUEkgc2hvdWxkIGJlIG9uZSBvZiAnXG4gICAgICAgICsgbW9kZU9wdGlvbnMgKyAnLicpXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy50eXBlXG4gICAgaWYgKHR5cGVvZiBjb25maWcudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy50eXBlID0gREVGQVVMVF9UWVBFXG4gICAgICBjb25zb2xlLndhcm4oJ1toNS1yZW5kZXJdIG9wdGlvbnMudHlwZSBmb3IgXFwnZmV0Y2hcXCcgQVBJIGhhcyBiZWVuIHNldCB0byAnXG4gICAgICAgICsgJ2RlZmF1bHQgdmFsdWUgXFwnJyArIGNvbmZpZy50eXBlICsgJ1xcJy4nKVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlT3B0aW9ucy5pbmRleE9mKChjb25maWcudHlwZSArICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBvcHRpb25zLnR5cGUgXFwnJ1xuICAgICAgICAgICsgY29uZmlnLnR5cGVcbiAgICAgICAgICArICdcXCcgZm9yIFxcJ2ZldGNoXFwnIEFQSSBzaG91bGQgYmUgb25lIG9mICdcbiAgICAgICAgICArIHR5cGVPcHRpb25zICsgJy4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnMuaGVhZGVyc1xuICAgIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge31cbiAgICBpZiAoIXV0aWxzLmlzUGxhaW5PYmplY3QoY29uZmlnLmhlYWRlcnMpKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy5oZWFkZXJzIHNob3VsZCBiZSBhIHBsYWluIG9iamVjdCcpXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy50aW1lb3V0XG4gICAgY29uZmlnLnRpbWVvdXQgPSBwYXJzZUludChjb25maWcudGltZW91dCwgMTApIHx8IDI1MDBcblxuICAgIGNvbnN0IF9jYWxsQXJncyA9IFtjb25maWcsIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgcmVzKVxuICAgIH1dXG4gICAgaWYgKHByb2dyZXNzQ2FsbGJhY2tJZCkge1xuICAgICAgX2NhbGxBcmdzLnB1c2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAvLyBTZXQgJ2tlZXBBbGl2ZScgdG8gdHJ1ZSBmb3Igc2VuZGluZyBjb250aW51b3VzIGNhbGxiYWNrc1xuICAgICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKHByb2dyZXNzQ2FsbGJhY2tJZCwgcmVzLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnR5cGUgPT09ICdqc29ucCcpIHtcbiAgICAgIF9qc29ucC5hcHBseSh0aGlzLCBfY2FsbEFyZ3MpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgX3hoci5hcHBseSh0aGlzLCBfY2FsbEFyZ3MpXG4gICAgfVxuICB9XG5cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgc3RyZWFtOiBbe1xuICAgIG5hbWU6ICdzZW5kSHR0cCcsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ2ZldGNoJyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbicsICdmdW5jdGlvbiddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICB1dGlscyA9IFdlZXgudXRpbHNcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdzdHJlYW0nLCBzdHJlYW0sIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHdlYnZpZXcgPSB7XG5cbiAgLy8gcmVmOiByZWYgb2YgdGhlIHdlYiBjb21wb25lbnQuXG4gIGdvQmFjazogZnVuY3Rpb24gKHJlZikge1xuICAgIGNvbnN0IHdlYkNvbXAgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKS5nZXRDb21wb25lbnQocmVmKVxuICAgIGlmICghd2ViQ29tcC5nb0JhY2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yOiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBoYXMgbm8gbWV0aG9kIG9mJ1xuICAgICAgICAgICsgJyBnb0JhY2suIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgYSB3ZWJ2aWV3IGNvbXBvbmVudC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdlYkNvbXAuZ29CYWNrKClcbiAgfSxcblxuICAvLyByZWY6IHJlZiBvZiB0aGUgd2ViIGNvbXBvbmVudC5cbiAgZ29Gb3J3YXJkOiBmdW5jdGlvbiAocmVmKSB7XG4gICAgY29uc3Qgd2ViQ29tcCA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldENvbXBvbmVudChyZWYpXG4gICAgaWYgKCF3ZWJDb21wLmdvRm9yd2FyZCkge1xuICAgICAgY29uc29sZS5lcnJvcignZXJyb3I6IHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGhhcyBubyBtZXRob2Qgb2YnXG4gICAgICAgICAgKyAnIGdvRm9yd2FyZC4gUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBhIHdlYnZpZXcgY29tcG9uZW50LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgd2ViQ29tcC5nb0ZvcndhcmQoKVxuICB9LFxuXG4gIC8vIHJlZjogcmVmIG9mIHRoZSB3ZWIgY29tcG9uZW50LlxuICByZWxvYWQ6IGZ1bmN0aW9uIChyZWYpIHtcbiAgICBjb25zdCB3ZWJDb21wID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKCkuZ2V0Q29tcG9uZW50KHJlZilcbiAgICBpZiAoIXdlYkNvbXAucmVsb2FkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjogdGhlIHNwZWNpZmllZCBjb21wb25lbnQgaGFzIG5vIG1ldGhvZCBvZidcbiAgICAgICAgICArICcgcmVsb2FkLiBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGEgd2VidmlldyBjb21wb25lbnQuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB3ZWJDb21wLnJlbG9hZCgpXG4gIH1cblxufVxuXG5jb25zdCBtZXRhID0ge1xuICB3ZWJ2aWV3OiBbe1xuICAgIG5hbWU6ICdnb0JhY2snLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfSwge1xuICAgIG5hbWU6ICdnb0ZvcndhcmQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfSwge1xuICAgIG5hbWU6ICdyZWxvYWQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3dlYnZpZXcnLCB3ZWJ2aWV3LCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBXZWJTb2NrZXQgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmxldCBpbnN0YW5jZVxubGV0IGNhbGxiYWNrID0geyB9XG5cbmNvbnN0IHdlYlNvY2tldElucyA9IHtcblxuICBXZWJTb2NrZXQ6IGZ1bmN0aW9uICh1cmwsIHByb3RvY29sKSB7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5jbG9zZSgpXG4gICAgICBpbnN0YW5jZSA9IHVuZGVmaW5lZFxuICAgICAgY2FsbGJhY2sgPSB7IH1cbiAgICB9XG4gICAgaWYgKHByb3RvY29sID09PSAnJykge1xuICAgICAgcHJvdG9jb2wgPSB1bmRlZmluZWRcbiAgICB9XG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBpbnN0YW5jZSA9IG5ldyBXZWJTb2NrZXQodXJsLCBwcm90b2NvbClcbiAgICBpbnN0YW5jZS5vbm9wZW4gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGNhbGxiYWNrLm9ub3Blbikge1xuICAgICAgICBzZWxmLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2sub25vcGVuLCB7IHR5cGU6IGUudHlwZSB9LCB0cnVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoY2FsbGJhY2sub25tZXNzYWdlKSB7XG4gICAgICAgIHNlbGYuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFjay5vbm1lc3NhZ2UsIHsgb3JpZ2luOiBlLm9yaWdpbiwgZGF0YTogZS5kYXRhLCBzb3VyY2U6IGUuZGF0YSB9LCB0cnVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGNhbGxiYWNrLm9uZXJyb3IpIHtcbiAgICAgICAgc2VsZi5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrLm9uZXJyb3IsIHsgY29kZTogZS5jb2RlLCBkYXRhOiBlLmRhdGEgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZS5vbmNsb3NlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChjYWxsYmFjay5vbmNsb3NlKSB7XG4gICAgICAgIHNlbGYuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFjay5vbmNsb3NlLCB7IGRhdGE6IGUuZGF0YSwgY29kZTogZS5jb2RlLCByZWFzb246IGUucmVhc29uIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNsb3NlOiBmdW5jdGlvbiAoY29kZSwgc2lnbmFsKSB7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5jbG9zZShjb2RlLCBzaWduYWwpXG4gICAgICBpbnN0YW5jZSA9IHVuZGVmaW5lZFxuICAgICAgY2FsbGJhY2sgPSB7IH1cbiAgICB9XG4gIH0sXG5cbiAgc2VuZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLnNlbmQoZGF0YSlcbiAgICB9XG4gIH0sXG5cbiAgb25vcGVuOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25vcGVuID0gZnVuY1xuICAgIH1cbiAgfSxcblxuICBvbmVycm9yOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25lcnJvciA9IGZ1bmNcbiAgICB9XG4gIH0sXG5cbiAgb25tZXNzYWdlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25tZXNzYWdlID0gZnVuY1xuICAgIH1cbiAgfSxcblxuICBvbmNsb3NlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25jbG9zZSA9IGZ1bmNcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgd2ViU29ja2V0OiBbe1xuICAgIG5hbWU6ICdXZWJTb2NrZXQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAnY2xvc2UnLFxuICAgIGFyZ3M6IFsnbnVtYmxlJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VuZCcsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9LCB7XG4gICAgbmFtZTogJ29ub3BlbicsXG4gICAgYXJnczogWydmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnb25tZXNzYWdlJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdvbmNsb3NlJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdvbmVycm9yJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3dlYlNvY2tldCcsIHdlYlNvY2tldElucywgbWV0YSlcbiAgfVxufVxuIiwiLy8gaW1wb3J0IGNvbXBvbmVudHMuXG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi9jb21wb25lbnRzL2ltYWdlJ1xuaW1wb3J0IFRleHQgZnJvbSAnLi9jb21wb25lbnRzL3RleHQnXG5pbXBvcnQgU2Nyb2xsYWJsZSBmcm9tICcuL2NvbXBvbmVudHMvc2Nyb2xsYWJsZSdcbmltcG9ydCBTbGlkZXIgZnJvbSAnLi9jb21wb25lbnRzL3NsaWRlcidcbmltcG9ydCBJbmRpY2F0b3IgZnJvbSAnLi9jb21wb25lbnRzL2luZGljYXRvcidcbmltcG9ydCBUYWJoZWFkZXIgZnJvbSAnLi9jb21wb25lbnRzL3RhYmhlYWRlcidcbmltcG9ydCBJbnB1dCBmcm9tICcuL2NvbXBvbmVudHMvaW5wdXQnXG5pbXBvcnQgVGV4dGFyZWEgZnJvbSAnLi9jb21wb25lbnRzL3RleHRhcmVhJ1xuaW1wb3J0IFZpZGVvIGZyb20gJy4vY29tcG9uZW50cy92aWRlbydcbmltcG9ydCBTd2l0Y2ggZnJvbSAnLi9jb21wb25lbnRzL3N3aXRjaCdcbmltcG9ydCBBIGZyb20gJy4vY29tcG9uZW50cy9hJ1xuaW1wb3J0IEVtYmVkIGZyb20gJy4vY29tcG9uZW50cy9lbWJlZCdcbmltcG9ydCBTcGlubmVyIGZyb20gJy4vY29tcG9uZW50cy9zcGlubmVyJ1xuaW1wb3J0IFdlYiBmcm9tICcuL2NvbXBvbmVudHMvd2ViJ1xuaW1wb3J0IE5laWdoYm9yIGZyb20gJy4vY29tcG9uZW50cy9uZWlnaGJvcidcbmltcG9ydCBSaWNodGV4dCBmcm9tICcuL2NvbXBvbmVudHMvcmljaHRleHQnXG5cbi8vIGltcG9ydCBhcGlzLlxuaW1wb3J0IEFuaW1hdGlvbiBmcm9tICcuL2FwaS9hbmltYXRpb24nXG5pbXBvcnQgQ2xpcGJvYXJkIGZyb20gJy4vYXBpL2NsaXBib2FyZCdcbmltcG9ydCBEb20gZnJvbSAnLi9hcGkvZG9tJ1xuaW1wb3J0IEV2ZW50IGZyb20gJy4vYXBpL2V2ZW50J1xuaW1wb3J0IEdlb2xvY2F0aW9uIGZyb20gJy4vYXBpL2dlb2xvY2F0aW9uJ1xuaW1wb3J0IEdsb2JhbEV2ZW50IGZyb20gJy4vYXBpL2dsb2JhbEV2ZW50J1xuaW1wb3J0IE1ldGEgZnJvbSAnLi9hcGkvbWV0YSdcbmltcG9ydCBNb2RhbCBmcm9tICcuL2FwaS9tb2RhbCdcbmltcG9ydCBOYXZpZ2F0b3IgZnJvbSAnLi9hcGkvbmF2aWdhdG9yJ1xuaW1wb3J0IFBhZ2VJbmZvIGZyb20gJy4vYXBpL3BhZ2VJbmZvJ1xuaW1wb3J0IFN0b3JhZ2UgZnJvbSAnLi9hcGkvc3RvcmFnZSdcbmltcG9ydCBTdHJlYW0gZnJvbSAnLi9hcGkvc3RyZWFtJ1xuaW1wb3J0IFdlYnZpZXcgZnJvbSAnLi9hcGkvd2VidmlldydcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnLi9hcGkvd2ViU29ja2V0J1xuXG5leHBvcnQgZGVmYXVsdCB7IEltYWdlLCBUZXh0LCBTY3JvbGxhYmxlLCBTbGlkZXIsIEluZGljYXRvciwgVGFiaGVhZGVyLCBJbnB1dCwgVGV4dGFyZWEsIFZpZGVvLCBTd2l0Y2gsIEEsIEVtYmVkLCBTcGlubmVyLCBXZWIsIE5laWdoYm9yLCBSaWNodGV4dCwgQW5pbWF0aW9uLCBDbGlwYm9hcmQsIERvbSwgRXZlbnQsIEdlb2xvY2F0aW9uLCBHbG9iYWxFdmVudCwgTWV0YSwgTW9kYWwsIE5hdmlnYXRvciwgUGFnZUluZm8sIFN0b3JhZ2UsIFN0cmVhbSwgV2VidmlldywgV2ViU29ja2V0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHBhY2thZ2VzIGZyb20gJy4vcGFja2VyJ1xuXG4vLyBpbnN0YWxsIHRoZSBhcGlzIGFuZCBjb21wb25lbnRzIGFzIHBhY2thZ2VzLlxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0IChXZWV4KSB7XG4gICAgaWYgKHR5cGVvZiBwYWNrYWdlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgaW4gcGFja2FnZXMpIHtcbiAgICAgIFdlZXguaW5zdGFsbChwYWNrYWdlc1trXSlcbiAgICB9XG4gICAgLy8gcGFja2FnZXMuZm9yRWFjaChwa2cgPT4gV2VleC5pbnN0YWxsKHBrZykpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBXZWV4IGZyb20gJy4vcmVuZGVyL2luZGV4J1xuXG5pbXBvcnQgcm9vdCBmcm9tICcuL2Jhc2Uvcm9vdCdcbmltcG9ydCBkaXYgZnJvbSAnLi9iYXNlL2RpdidcbmltcG9ydCBkcm9vdCBmcm9tICcuL2Jhc2UvZHJvb3QnXG5cbi8vIGluc3RhbGwgdGhlIGV4dGVuZGVkIGFwaXMgYW5kIGNvbXBvbmVudHMuXG5pbXBvcnQgZXh0ZW5zaW9ucyBmcm9tICcuL2V4dGVuZCdcblxuV2VleC5pbnN0YWxsKHJvb3QpXG5XZWV4Lmluc3RhbGwoZGl2KVxuV2VleC5pbnN0YWxsKGRyb290KVxuXG5XZWV4Lmluc3RhbGwoZXh0ZW5zaW9ucylcblxuZ2xvYmFsLnJlZ2lzdGVyQ29tcG9uZW50cyhbXG4gIHsgdHlwZTogJ2lucHV0JywgbWV0aG9kczogWydmb2N1cycsICdibHVyJ10gfVxuXSlcblxuZXhwb3J0IGRlZmF1bHQgV2VleFxuIl0sIm5hbWVzIjpbInJlcXVpcmUkJDAiLCJpc09iamVjdCIsInJlcXVpcmUkJDEiLCJkb2N1bWVudCIsInJlcXVpcmUkJDIiLCJyZXF1aXJlJCQzIiwiZFAiLCJyZXF1aXJlJCQ0IiwiZ2xvYmFsIiwiJGV4cG9ydCIsInRvU3RyaW5nIiwiSU9iamVjdCIsInRvSW50ZWdlciIsIm1pbiIsInRvSU9iamVjdCIsImhhcyIsImRlZmluZWQiLCJyZXF1aXJlJCQ1IiwiYXJndW1lbnRzIiwiV1hFbnZpcm9ubWVudCIsImNvZiIsImFuT2JqZWN0IiwiZ2V0S2V5cyIsImVudW1CdWdLZXlzIiwiSUVfUFJPVE8iLCJQUk9UT1RZUEUiLCJUQUciLCJjcmVhdGUiLCJzZXRUb1N0cmluZ1RhZyIsInRvT2JqZWN0IiwicmVxdWlyZSQkOSIsInJlcXVpcmUkJDgiLCJyZWRlZmluZSIsInJlcXVpcmUkJDciLCJoaWRlIiwicmVxdWlyZSQkNiIsIkl0ZXJhdG9ycyIsIklURVJBVE9SIiwiQXJyYXlQcm90byIsImNsYXNzb2YiLCJhRnVuY3Rpb24iLCJjdHgiLCJwcm9jZXNzIiwicnVuIiwiUHJvbWlzZSIsImlzTm9kZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiU1BFQ0lFUyIsIkxJQlJBUlkiLCJyZXF1aXJlJCQyMCIsInJlcXVpcmUkJDE5IiwicmVxdWlyZSQkMTgiLCJyZXF1aXJlJCQxNyIsInJlcXVpcmUkJDE2IiwicmVxdWlyZSQkMTUiLCJyZXF1aXJlJCQxNCIsInJlcXVpcmUkJDEzIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxMSIsInJlcXVpcmUkJDEwIiwiVHlwZUVycm9yIiwibm90aWZ5IiwiY29uc3QiLCJsZXQiLCJmcmVlemVQcm90b3R5cGUiLCJFbGVtZW50Iiwic3VwZXIiLCJ0YXNrQ2VudGVyIiwicHVyZUJlZm9yZSIsImluZGV4IiwidGhpcyIsImluaXQiLCJyZWdpc3RlciIsImluaXRUYXNrSGFuZGxlciIsIm5hbWUiLCJzaGFyZWQuZnJlZXplUHJvdG90eXBlIiwic2hhcmVkLnNldE5hdGl2ZUNvbnNvbGUiLCJzaGFyZWQucmVzZXROYXRpdmVDb25zb2xlIiwic2hhcmVkLnNldE5hdGl2ZVRpbWVyIiwic2hhcmVkLnJlc2V0TmF0aXZlVGltZXIiLCJjb25maWciLCJpbnN0YW5jZU1hcCIsImNyZWF0ZUluc3RhbmNlIiwiZGVmIiwicmVtb3ZlIiwiaGFzT3duUHJvcGVydHkiLCJ0eXBvZiIsInVpZCIsIk9ic2VydmVyIiwic2V0Iiwibm9vcCIsInNldEF0dHIiLCJzZXRTdHlsZSIsImJpbmRFdmVudHMiLCJzZXRDbGFzc1N0eWxlIiwiaSIsImNyZWF0ZUJvZHkiLCJjcmVhdGVFbGVtZW50IiwibW92ZUVsZW1lbnQiLCJyZW1vdmVFbGVtZW50IiwidHlwZSIsImluaXRNZXRob2RzIiwiZG93bmdyYWRlLmNoZWNrIiwiY2xlYW5OYW1lIiwicmVmcmVzaCIsImRlc3Ryb3kiLCJmaXJlRXZlbnQiLCJjYWxsYmFjayIsIkFwcCIsInJlbmRlcmVyIiwiaW5pdEFwcCIsInJlZnJlc2hJbnN0YW5jZSIsImRlc3Ryb3lJbnN0YW5jZSIsIm5hdGl2ZUNvbXBvbmVudE1hcCIsInJlZ2lzdGVyQ29tcG9uZW50cyIsInJlZ2lzdGVyTW9kdWxlcyIsInJlY2VpdmVUYXNrcyIsImdldFJvb3QiLCJtZXRob2RzIiwiV2VleCIsImsiLCJjYWxsTmF0aXZlIiwiY3JlYXRlQ2hpbGRyZW4iLCJhcHBlbmRDaGlsZCIsImluc2VydEJlZm9yZSIsInJlbW92ZUNoaWxkIiwidXBkYXRlQXR0cnMiLCJ1cGRhdGVTdHlsZSIsInNldFN0aWNreSIsInVuc2V0U3RpY2t5IiwicG9zaXRpb24iLCJoYW5kbGVyTWFwIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzIiwiYmluZCIsInNsaWNlIiwiZnJhbWV3b3JrcyIsIkxpc3RlbmVyIiwibG9vcCIsInV0aWxzLmdldFJhbmRvbSIsInV0aWxzLmlzQXJyYXkiLCJ1dGlscy5nZXRUeXBlIiwiYmluZFJlZ2lzdGVyIiwidXRpbHMuZXh0ZW5kIiwiQ29tcG9uZW50IiwicHJvdG8iLCJBdG9taWMiLCJhdHRyIiwic3R5bGUiLCJkb2MiLCJ1YSIsImNzc1ByZWZpeCIsInN0eWxlUHJlZml4IiwiREVGQVVMVF9MT0FEX01PUkVfT0ZGU0VUIiwiZ2V0UHJvdG8iLCJwYXJlbnRzIiwiREVGQVVMVF9DTEFNUCIsIkRFRkFVTFRfQUxJR05fSVRFTVMiLCJERUZBVUxUX0pVU1RJRllfQ09OVEVOVCIsImFkanVzdEhlaWdodCIsInNob3ciLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiRmlyZWZveCIsIklFTW9iaWxlIiwidGltZXIuc2V0VGltZW91dCIsInRpbWVyLmNsZWFyVGltZW91dCIsImdldFRyYW5zZm9ybU9mZnNldCIsIkNTU01hdHJpeCIsImhhczNkIiwiZ2V0VHJhbnNsYXRlIiwiZXh0ZW5kIiwiZXZlbnQiLCJkb1Njcm9sbCIsImFwcGVuZFN0eWxlIiwidmVuZG9ycyIsImdldFJhbmRvbSIsImxvb3BBcnJheSIsImdldFJnYiIsImlzQXJyYXkiLCJERUZBVUxUX0lOVEVSVkFMIiwiaWRsZVdoZW5QYWdlRGlzYXBwZWFyIiwiaWRsZVdoZW5Eb21SZW5kZXJpbmciLCJ1cGRhdGVJbmRpY2F0b3JzIiwiZG9SZW5kZXIiLCJhdXRvUGxheSIsInR5cGVNYXAiLCJ0cmFuc2l0aW9uT25jZSIsIm1ldGEiLCJFbWl0dGVyIiwiY2xvbmUiLCJUd2VlbiIsInJhZiIsImNhbWVsVG9LZWJhYiIsInNjcm9sbCIsIk1vZGFsIiwiQWxlcnQiLCJDT05URU5UX0NMQVNTIiwiTVNHX0NMQVNTIiwiQlVUVE9OX0dST1VQX0NMQVNTIiwiQlVUVE9OX0NMQVNTIiwiQ29uZmlybSIsIlByb21wdCIsInF1ZXVlIiwidG9hc3QiLCJtb2RhbCIsIm5hdmlnYXRvciIsInV0aWxzIiwicXMiLCJJbWFnZSIsIkV2ZW50IiwiV2ViU29ja2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7RUFDZixLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVztJQUN2QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUN0QyxJQUFJLFVBQVUsR0FBRyxTQUFTLEVBQUUsRUFBRTtNQUM1QixPQUFPLE9BQU8sRUFBRSxLQUFLLFVBQVUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLG1CQUFtQixDQUFDO0tBQzNFLENBQUM7SUFDRixJQUFJLFNBQVMsR0FBRyxTQUFT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QUFJLENBQUMsTUFBTTtJQUNqQixLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0JBQ0osRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNYLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFB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QUFDLENBQUM7SUFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDNUI7R0FDRixNQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO0lBQ2xDLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDM0I7R0FDRixNQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ3hCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDdkMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNuQztHQUNGO0VBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDZCxDQUFDLEdBQUcsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDO0dBQ3ZCO0VBQ0QsT0FB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TSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDdEIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7OztBQUkxRSxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDOztBQUUzQixJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDcEQsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoRCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7QUFFN0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMzRCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNyQixHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLENBQUM7Ozs7QUFJckUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDcEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQzs7QUFFM0IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFD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QzVCLE1BQU07SUFDUixLQUFLLFVBQVU7Ozs7TUFJYixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7TUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7TUFDNUIsTUFBTTs7O0lBR1IsS0FBSyxZQUFZO01BQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQzlCLEVBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBQTtNQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztNQUM1QixNQUFNOztJQUVSLEtBQUssT0FBTzs7Ozs7TUFLVixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDdEUsRUFBQSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBQTtNQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO01BQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7TUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztNQUNyQixNQUFNO0lBQ1IsS0FBSyxPQUFPOzs7OztNQUtWLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUNsRCxFQUFBLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFBO01BQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7TUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztNQUNyQixNQUFNO0lBQ1IsS0FBSyxPQUFPOzs7OztNQUtWLElBQUksSUFB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RUFBRSxDQUFDLEVBQUEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQSxNQUFNLEVBQUUsQ0FBQyxFQUFBLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7QUFFeHBCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksVUFBVSxNQUFNLEVBQUU7O0NBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLE1BQU0sR0FBR3BELFdBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQzs7QUFFalEsSUFBSSxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDOztBQUU3USxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUNsQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNwQixPQUFPLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDMUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDMUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7QUFDeEMsT0FBTyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDMUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDMUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDMUIsT0FBTyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7O0FBRXBDLElBQUksUUFBUSxHQUFHLG1CQUFtQixrQkFBa0IsQ0FBQyxDQUFDLENBQUM7O0FBRXZELElBQUksUUFBUSxHQUFHLG1CQUFtQixrQkFBa0IsQ0FBQyxDQUFDLENBQUM7O0FBRXZELElBQUksU0FBUyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUVqRCxTQUFTLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7O0FBRS9GLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzFCLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQzs7QUFFdkIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDdEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7O0FBRXJCLElBQUksa0JBQWtCLEdBQUcsZUFBZSxDQUFDO0FBQ3pDLElBQUksWUFBWSxHQUFHLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztBQUNoRCxJQUFJLGdCQUFnQixHQUFHLGtCQUFrQixHQUFHLFdBQVcsQ0FBQzs7QUFFeEQsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDOztBQUVuQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDakIsSUFBSSxJQUFJLEdBQUcsU0FBUyxJQUFJLEdBQUcsRUFBRSxDQUFDOztBQUU5QixTQUFTLHVCQUF1QixDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUU7RUFDcEQsSUFBSSxRQUFRLENBQUM7RUFDYixLQUFLLElBQUksQ0FBQyxJQUFJLFNBQVMsRUFBRTtJQUN2QixJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDL0IsUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN4QixJQUFJLFlBQVksS0FBSyxHQUFHLElBQUksWUFBWSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDNUQsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDOztRQUUvQixRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztPQUN0QztLQUNGO0dBQ0Y7Q0FDRjs7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFHLEVBQUU7RUFDekIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQzVEOztBQUVELFNBQVMsV0FBVyxDQUFDLFVBQVUsRUFBRTtFQUMvQixJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7RUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRTtJQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0dBQzdEO0VBQ0QsT0FBTyxRQUFRLENBQUM7Q0FDakI7O0FBRUQsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFO0VBQ3BCLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0VBQzNCLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0VBQ3pCLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0NBQzFCOzs7Ozs7QUFNRCxTQUFTLGtCQUFrQixDQUFDLFVBQVUsRUFBRTtFQUN0QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7SUFDN0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7O01BRXpDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxPQUFPO09BQ1I7TUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM1QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7T0FDL0IsTUFBTSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDcEgsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztPQUNwQztLQUNGLENBQUMsQ0FBQztHQUNKO0NBQ0Y7Ozs7OztBQU1ELFNBQVMsZUFBZSxDQUFDLElBQUksRUFBRSxFQUFFOzs7Ozs7OztBQVFqQyxTQUFTLGVBQWUsQ0FBQyxVQUFVLEVBQUU7RUFDbkMsSUFBSSxDQUFDLE9BQU8sVUFBVSxLQUFLLFdBQVcsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFFBQVEsRUFBRTtJQUN4RixLQUFLLElBQUksSUFBSSxJQUFJLFVBQVUsRUFBRTtNQUMzQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFDMUQsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN4QztLQUNGO0dBQ0Y7Q0FDRjs7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFO0VBQzVELEtBQUssSUFBSSxVQUFVLElBQUksZUFBZSxFQUFFO0lBQ3RDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRztNQUNwQixPQUFPLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7TUFDbEQsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtNQUN2QixhQUFhLEVBQUUsS0FBSztLQUNyQixDQUFDO0dBQ0g7RUFDRCxPQUFPLE9BQU8sQ0FBQztDQUNoQjs7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUU7RUFDM0MsSUFBSSxDQUFDLE9BQU8sYUFBYSxLQUFLLFdBQVcsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLFFBQVEsRUFBRTtJQUM5RixJQUFJLEtBQUssR0FBRyxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUU7TUFDL0IsSUFBSSxVQUFVLEdBQUcsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO01BQzNDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRztRQUNwQixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1FBQ3ZCLGFBQWEsRUFBRSxJQUFJO09BQ3BCLENBQUM7O01BRUYsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLE1BQU0sRUFBRTtRQUM1QyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtVQUM5QixNQUFNLEdBQUc7WUFDUCxJQUFJLEVBQUUsTUFBTTtXQUNiLENBQUM7U0FDSDtRQUNELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7O1FBRTdCLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFlBQVk7OztVQUMzRCxLQUFLLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDbkYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHQSxXQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7V0FDOUI7O1VBRUQsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1VBQ2pCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1VBQ3BDLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxPQUFPLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sUUFBUSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6SCxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDOztZQUVuQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7V0FDWjs7VUFFRCxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN4QyxNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxVQUFVO1dBQ25CLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ25CLENBQUM7T0FDSCxDQUFDLENBQUM7S0FDSixDQUFDOztJQUVGLEtBQUssSUFBSSxJQUFJLElBQUksYUFBYSxFQUFFO01BQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNiO0dBQ0Y7O0VBRUQsT0FBTyxPQUFPLENBQUM7Q0FDaEI7Ozs7Ozs7OztBQVNELFNBQVMsY0FBYyxDQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRTtFQUNuRyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7RUFDckMsSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFOztJQUV6QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDN0IsSUFBSSxZQUFZLEdBQUcsQ0FBQyxPQUFPLGFBQWEsS0FBSyxXQUFXLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxRQUFRLElBQUksYUFBYSxJQUFJLEVBQUUsQ0FBQzs7SUFFckksSUFBSSxNQUFNLEdBQUcsbUJBQW1CLDRDQUE0QyxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUVqRixJQUFJLFFBQVEsR0FBRyxPQUFPLFFBQVEsS0FBSyxVQUFVLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDMUUsSUFBSSxPQUFPLEdBQUcsT0FBTyxPQUFPLEtBQUssVUFBVSxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RFLElBQUksSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLFVBQVUsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUMxRCxJQUFJLElBQUksR0FBRyxPQUFPLElBQUksS0FBSyxVQUFVLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDMUQsSUFBSSxRQUFRLEdBQUcsT0FBTyxRQUFRLEtBQUssVUFBVSxHQUFHLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQzFFLElBQUksUUFBUSxHQUFHLE9BQU8sUUFBUSxLQUFLLFVBQVUsR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUMxRSxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRztRQUNoQixlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWU7UUFDeEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRO1FBQzFCLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDOztJQUVuQyxJQUFJLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDOztJQUU1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFO01BQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQztLQUNyRzs7SUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDOztJQUVqQixRQUFRLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHO01BQ2pDLFFBQVEsRUFBRSxRQUFRO01BQ2xCLFVBQVUsRUFBRSxVQUFVO01BQ3RCLFNBQVMsRUFBRSxTQUFTO01BQ3BCLFVBQVUsRUFBRSxhQUFhO01BQ3pCLE9BQU8sRUFBRSxPQUFPO01BQ2hCLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtNQUMxQixHQUFHLEVBQUUsQ0FBQztLQUNQLENBQUM7OztJQUdGLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwQyxJQUFJLGVBQWUsR0FBRyxtQkFBbUIsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLElBQUksZ0JBQWdCLEdBQUcsbUJBQW1CLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RSxJQUFJLGtCQUFrQixHQUFHLG1CQUFtQix5QkFBeUIsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7SUFFMUYsbUJBQW1CLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQzs7SUFFM0UsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQzs7SUFFN0YsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUM7UUFDbEYsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLO1FBQ3RCLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTztRQUMxQixPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU87UUFDMUIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0lBRWpDLElBQUksY0FBYyxHQUFHLG1CQUFtQiw4QkFBOEIsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1RixJQUFJLFNBQVMsR0FBRyxtQkFBbUIseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O0lBRWxGLElBQUksU0FBUyxHQUFHLG1CQUFtQixxQkFBcUIsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDO1FBQ25GLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVTtRQUNqQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFlBQVk7UUFDckMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXO1FBQ25DLGFBQWEsR0FBRyxTQUFTLENBQUMsYUFBYTtRQUN2QyxxQkFBcUIsR0FBRyxTQUFTLENBQUMscUJBQXFCO1FBQ3ZELG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQzs7SUFFMUQsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLHNCQUFzQixFQUFFLENBQUMsRUFBRTtRQUMxRCxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUk7UUFDckIsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7O0lBRTFCLElBQUksV0FBVyxHQUFHLG1CQUFtQiwyQkFBMkIsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7O0lBRWpGLElBQUksU0FBUyxHQUFHLG1CQUFtQixxQkFBcUIsRUFBRSxDQUFDLEVBQUU7UUFDekQsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLO1FBQ3ZCLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDOztJQUV4QyxJQUFJLGFBQWEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7SUFFNUMsSUFBSSxNQUFNLEdBQUc7O01BRVgsT0FBTyxFQUFFLFFBQVE7TUFDakIsTUFBTSxFQUFFLE9BQU87TUFDZixHQUFHLEVBQUUsSUFBSTtNQUNULEdBQUcsRUFBRSxJQUFJO01BQ1QsT0FBTyxFQUFFLFFBQVE7TUFDakIsT0FBTyxFQUFFLFFBQVE7O01BRWpCLElBQUksRUFBRSxFQUFFOztNQUVSLE1BQU0sRUFBRSxLQUFLO01BQ2IsSUFBSSxFQUFFLElBQUk7TUFDVixJQUFJLEVBQUUsSUFBSTtNQUNWLFdBQVcsRUFBRSxXQUFXOztNQUV4QixRQUFRLEVBQUUsUUFBUTtNQUNsQixRQUFRLEVBQUUsUUFBUTs7TUFFbEIsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLE1BQU07UUFDZixRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVE7UUFDL0IsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPO1FBQzdCLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVTs7UUFFbkMsU0FBUyxFQUFFLE9BQU8sR0FBRyxZQUFZLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsVUFBVTtPQUMzTTs7TUFFRCxNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsWUFBWSxDQUFDLFdBQVc7UUFDL0IsTUFBTSxFQUFFLFlBQVksQ0FBQyxZQUFZO1FBQ2pDLFVBQVUsRUFBRSxZQUFZLENBQUMsV0FBVztRQUNwQyxXQUFXLEVBQUUsWUFBWSxDQUFDLFlBQVk7UUFDdEMsVUFBVSxFQUFFLEVBQUU7UUFDZCxVQUFVLEVBQUUsRUFBRTtPQUNmO01BQ0QsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLEtBQUs7TUFDcEMsS0FBSyxFQUFFLEtBQUs7TUFDWixPQUFPLEVBQUUsT0FBTztNQUNoQixRQUFRLEVBQUUsUUFBUTtNQUNsQixPQUFPLEVBQUUsT0FBTztNQUNoQixjQUFjLEVBQUUsY0FBYztNQUM5QixHQUFHLEVBQUUsR0FBRztNQUNSLGVBQWUsRUFBRSxlQUFlO01BQ2hDLFFBQVEsRUFBRSxRQUFRO01BQ2xCLFNBQVMsRUFBRSxTQUFTO01BQ3BCLEtBQUssRUFBRSxLQUFLO01BQ1osV0FBVyxFQUFFLFdBQVc7TUFDeEIsVUFBVSxFQUFFLFVBQVU7TUFDdEIsVUFBVSxFQUFFLFVBQVU7TUFDdEIsWUFBWSxFQUFFLFlBQVk7TUFDMUIsV0FBVyxFQUFFLFdBQVc7TUFDeEIsYUFBYSxFQUFFLGFBQWE7TUFDNUIscUJBQXFCLEVBQUUscUJBQXFCO01BQzVDLG9CQUFvQixFQUFFLG9CQUFvQjtNQUMxQyxLQUFLLEVBQUUsU0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQzdCLElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNDLEtBQUssQ0FBQyxLQUFLLENBQUM7VUFDVixPQUFPLEVBQUUsT0FBTztTQUNqQixFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7T0FDcEI7TUFDRCxJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ3ZCLElBQUksYUFBYSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkQsYUFBYSxDQUFDLElBQUksQ0FBQztVQUNqQixHQUFHLEVBQUUsR0FBRztVQUNSLFFBQVEsRUFBRSxJQUFJO1NBQ2YsRUFBRSxJQUFJLENBQUMsQ0FBQztPQUNWO01BQ0QsS0FBSyxFQUFFLFNBQVMsS0FBSyxHQUFHO1FBQ3RCLElBQUksYUFBYSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkQsYUFBYSxDQUFDLEtBQUssQ0FBQztVQUNsQixRQUFRLEVBQUUsSUFBSTtTQUNmLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ2hCO01BQ0QsV0FBVyxFQUFFLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7UUFDdkQsSUFBSSxLQUFLLEdBQUc7VUFDVixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07VUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztVQUN6QyxJQUFJLEVBQUUsU0FBUztVQUNmLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUNGLHVCQUF1QixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztPQUM5QztNQUNELGdCQUFnQixFQUFFLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtRQUMxRCxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztPQUNsQztNQUNELG1CQUFtQixFQUFFLFNBQVMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtRQUNoRSxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztPQUNuQztNQUNELGFBQWEsRUFBRSxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUU7UUFDdkMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO09BQy9COztNQUVELE1BQU0sRUFBRSxlQUFlO01BQ3ZCLE9BQU8sRUFBRSxnQkFBZ0I7O01BRXpCLGlCQUFpQixFQUFFLFFBQVE7TUFDM0IsZUFBZSxFQUFFLGVBQWU7TUFDaEMsZ0JBQWdCLEVBQUUsZ0JBQWdCO01BQ2xDLGtCQUFrQixFQUFFLGtCQUFrQjtNQUN0QyxZQUFZLEVBQUUsWUFBWTtNQUMxQixhQUFhLEVBQUUsYUFBYTtNQUM1QixnQkFBZ0IsRUFBRSxnQkFBZ0I7TUFDbEMsYUFBYSxFQUFFLGFBQWE7S0FDN0IsQ0FBQzs7SUFFRixRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O0lBRXZELElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUN4QixJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDeEIsSUFBSTtNQUNGLGNBQWMsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQzs7TUFFekQsY0FBYyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO0tBQzFELENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTs7SUFFZCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQzs7SUFFdEMsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzdFLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7O0lBRXBELElBQUksWUFBWSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7TUFDbkMsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztNQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7O01BRy9CLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsd0NBQXdDLEdBQUcsYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUM7O01BRTFKLEtBQUssQ0FBQyxJQUFJOztNQUVWLE1BQU0sQ0FBQyxDQUFDOztNQUVSLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7O01BR2hGLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7S0FDaEMsTUFBTTs7TUFFTCxJQUFJLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUMsQ0FBQzs7TUFFN0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNyQjtHQUNGLE1BQU07SUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxVQUFVLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQztHQUNsRjtDQUNGOzs7Ozs7OztBQVFELFNBQVMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUU7RUFDekMsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0VBQ3ZDLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7RUFDakMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO0lBQzVDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ3JCLElBQUksRUFBRSxJQUFJO0dBQ1gsQ0FBQyxDQUFDO0VBQ0gsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQ2xFOzs7Ozs7QUFNRCxTQUFTLGVBQWUsQ0FBQyxVQUFVLEVBQUU7RUFDbkMsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0VBQ3ZDLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7RUFDckMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOztFQUU5QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO0VBQ2pDLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtJQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtHQUN0QixDQUFDLENBQUM7O0VBRUgsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO0lBQ3BCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztHQUNwQjs7RUFFRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7SUFDOUQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztHQUN2Qzs7RUFFRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztFQUM3QixPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztDQUM1Qjs7Ozs7Ozs7QUFRRCxTQUFTLE9BQU8sQ0FBQyxVQUFVLEVBQUU7RUFDM0IsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0VBQ3ZDLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7RUFDakMsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDakQ7O0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRTtFQUNoRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDdEIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRTtNQUN0QixPQUFPLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7S0FDL0MsQ0FBQyxDQUFDO0lBQ0gsT0FBTztHQUNSOztFQUVELElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXpCLElBQUksRUFBRSxFQUFFO0lBQ04sSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRCxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsT0FBTyxNQUFNLENBQUM7R0FDZjs7RUFFRCxPQUFPLElBQUksS0FBSyxDQUFDLDZCQUE2QixHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUM3RDs7Ozs7Ozs7QUFRRCxTQUFTLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFO0VBQ3ZDLElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztFQUN2QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDeEIsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQzs7SUFFakMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7TUFDNUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7TUFDcEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUMvQixJQUFJLFVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDcEIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7UUFFL0IsTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7T0FDOUQsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1FBQ3JDLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxQyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNwQixLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN0QixXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUVqQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvRCxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7T0FDeEI7TUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3RCLENBQUMsQ0FBQztJQUNILE9BQU8sT0FBTyxDQUFDO0dBQ2hCO0NBQ0Y7OztBQUdELE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOztPQUVuQjs7Ozs7OztPQU9BLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7RUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7QUFDSCxJQUFJLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxHQUFHO0VBQzlDLEtBQUssRUFBRSxtQkFBbUIsNkJBQTZCLENBQUMsQ0FBQztDQUMxRCxDQUFDOztPQUVLOzs7Ozs7O09BT0EsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFOztBQUVqQyxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7RUFDbEQsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNwRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7RUFDOUIsTUFBTSxDQUFDLE9BQU8sWUFBWSxDQUFDLFNBQVMsT0FBTyxFQUFFOztVQUVyQyxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzs7O1VBRzFCLFNBQVMsbUJBQW1CLENBQUMsUUFBUSxFQUFFOzs7V0FHdEMsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM5QixPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMxQzs7V0FFRCxJQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRztZQUN6QyxDQUFDLEVBQUUsUUFBUTtZQUNYLENBQUMsRUFBRSxLQUFLO1lBQ1IsT0FBTyxFQUFFLEVBQUU7WUFDWCxDQUFDOzs7V0FHRixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzs7O1dBR3BGLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDOzs7V0FHaEIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO1dBQ3RCOzs7O1VBSUQsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQzs7O1VBR2hDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQzs7O1VBR3pDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxTQUFTLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1dBQ3ZELEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTthQUNwQyxZQUFZLEVBQUUsS0FBSzthQUNuQixVQUFVLEVBQUUsSUFBSTthQUNoQixHQUFHLEVBQUUsTUFBTTthQUNYLENBQUMsQ0FBQztZQUNIO1dBQ0QsQ0FBQzs7O1VBR0YsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLFNBQVMsTUFBTSxFQUFFO1dBQ3hDLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVTtZQUN2QyxTQUFTLFVBQVUsR0FBRyxFQUFFLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7WUFDbkQsU0FBUyxnQkFBZ0IsR0FBRyxFQUFFLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQztXQUNoRCxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztXQUMzQyxPQUFPLE1BQU0sQ0FBQztXQUNkLENBQUM7OztVQUdGLG1CQUFtQixDQUFDLENBQUMsR0FBRyxTQUFTLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDOzs7VUFHdEgsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7O1VBRzNCLE9BQU8sbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1VBQ3ZEOztVQUVBOztPQUVILFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7RUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7Ozs7QUFJSCxPQUFPLENBQUMsT0FBTyxHQUFHO0VBQ2hCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsT0FBTyxFQUFFLENBQUM7RUFDVixPQUFPLEVBQUUsSUFBSTs7RUFFYixjQUFjLEVBQUUsRUFBRTtFQUNsQixhQUFhLEVBQUUsRUFBRTs7RUFFakIsSUFBSSxFQUFFLElBQUk7RUFDVixNQUFNLEVBQUUsSUFBSTtFQUNaLE9BQU8sRUFBRSxJQUFJO0NBQ2QsQ0FBQztBQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOztPQUU3Qjs7T0FFQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0VBQzNDLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDOztBQUVILElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVuQyxJQUFJLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7QUFFM0MsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXRDLElBQUksdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXJELElBQUksd0JBQXdCLEdBQUcsc0JBQXNCLENBQUMsdUJBQXVCLENBQUMsQ0FBQzs7QUFFL0UsSUFBSSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbkQsSUFBSSxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDOztBQUUzRSxJQUFJLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVwRCxJQUFJLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLENBQUM7O0FBRTdFLElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUVwQyxJQUFJLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7QUFFM0MsSUFBSSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRTNDLFNBQVMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTs7QUFFL0YsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUU7Ozs7O0FBS25NLElBQUksR0FBRyxHQUFHLFlBQVksQ0FBQzs7QUFFdkIsT0FBTyxDQUFDLE9BQU8sR0FBRztFQUNoQixHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQzs7TUFFckIsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO1FBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDekQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7T0FDckU7S0FDRjtHQUNGO0VBQ0QsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRTtJQUN0QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNsQjtFQUNELE1BQU0sRUFBRSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUU7SUFDNUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLFFBQVEsRUFBRTtNQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7TUFDakIsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO1FBQ25CLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO09BQ3REO0tBQ0Y7R0FDRjtFQUNELE1BQU0sRUFBRSxTQUFTLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFO0lBQzFDLEFBQUksQUFBSyxBQUtULE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7O0lBRzNFLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtNQUNyQixTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDaEQ7O0lBRUQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNDLElBQUksbUJBQW1CLEdBQUcsZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsZUFBZSxDQUFDOztJQUUvRSxJQUFJLG1CQUFtQixFQUFFO01BQ3ZCLElBQUkscUJBQXFCLEdBQUcsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztNQUNwRSxJQUFJLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxlQUFlLENBQUM7TUFDeEQsSUFBSSxDQUFDLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQzlELElBQUksbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDO1FBQ3pELHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLENBQUM7O1FBRXRHLE9BQU8sZ0JBQWdCLENBQUM7T0FDekIsTUFBTTtRQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztPQUNsRDtLQUNGOzs7SUFHRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRTs7TUFFL0MsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzs7TUFFckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksYUFBYSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1VBQzdFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDN0Q7T0FDRjtLQUNGOztJQUVELElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEYsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUUsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLElBQUksWUFBWSxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7OztJQUdsQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDOzs7SUFHckYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7SUFFMUUsQUFBSSxBQUFLLEFBSVQsT0FBTyxZQUFZLENBQUM7R0FDckI7Q0FDRixDQUFDO0FBQ0YsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7O09BRTdCOztPQUVBLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7RUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7O0FBRUgsSUFBSSxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDOztBQUU3USxJQUFJLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbkMsSUFBSSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7O0FBRTNDLFNBQVMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTs7QUFFL0YsU0FBUyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7RUFDckMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7O0VBRXRCLElBQUksT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtJQUN0RixRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO0dBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQ2pDLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7R0FDMUQsTUFBTSxJQUFJLENBQUMsT0FBTyxPQUFPLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sUUFBUSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7O0lBRXpHLElBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUNwQyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN4RCxNQUFNO01BQ0wsUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUMzRDtHQUNGLE1BQU0sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0lBQ3JFLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0dBQ3RELE1BQU07SUFDTCxNQUFNLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7R0FDaEU7O0VBRUQsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7O0VBRXpCLE9BQU8sUUFBUSxDQUFDO0NBQ2pCOztBQUVELE9BQU8sQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLENBQUM7QUFDdkMsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7O09BRTdCOztPQUVBLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixJQUFJLFFBQVEsR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLFVBQVUsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0FBRTlRLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUU7RUFDcEcsT0FBTyxPQUFPLEdBQUcsS0FBSyxXQUFXLEdBQUcsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNqRSxHQUFHLFVBQVUsR0FBRyxFQUFFO0VBQ2pCLE9BQU8sR0FBRyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsT0FBTyxHQUFHLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDNUssQ0FBQzs7O0FBR0YsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sU0FBUyxLQUFLLFdBQVcsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLFFBQVEsS0FBSyxTQUFTLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ3pMLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUcsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLFVBQVUsS0FBSyxVQUFVLENBQUM7QUFDL0QsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLHVCQUF1QixLQUFLLFdBQVcsQ0FBQzs7T0FFcEY7O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLFVBQVUsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0FBRTdRLFNBQVMscUJBQXFCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRTs7RUFFdkQsSUFBSSxTQUFTLEdBQUcsV0FBVyxLQUFLLElBQUksQ0FBQztFQUNyQyxJQUFJLFNBQVMsR0FBRyxXQUFXLEtBQUssSUFBSSxDQUFDO0VBQ3JDLElBQUksU0FBUyxJQUFJLFNBQVMsRUFBRTtJQUMxQixPQUFPLFNBQVMsS0FBSyxTQUFTLENBQUM7R0FDaEM7O0VBRUQsSUFBSSxRQUFRLEdBQUcsT0FBTyxXQUFXLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7RUFDdkYsSUFBSSxRQUFRLEdBQUcsT0FBTyxXQUFXLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7RUFDdkYsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7SUFDbEQsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUM7R0FDdkQsTUFBTTtJQUNMLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQUM7R0FDdkk7Q0FDRjs7QUFFRCxPQUFPLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOztPQUU3Qjs7T0FFQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0VBQzNDLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDOztBQUVILElBQUksWUFBWSxHQUFHLFlBQVksRUFBRSxTQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxFQUFBLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sVUFBVSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksVUFBVSxFQUFFLEVBQUEsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFBLENBQUMsSUFBSSxXQUFXLEVBQUUsRUFBQSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBQSxDQUFDLE9BQU8sV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7QUFFcGpCLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxZQUFZLFdBQVcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTs7Ozs7QUFLekosSUFBSSxTQUFTLEdBQUcsWUFBWTtFQUMxQixTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTtJQUMxQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDOztJQUVqQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0dBQ3hCOztFQUVELFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QixHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEtBQUssRUFBRSxTQUFTLGdCQUFnQixHQUFHLEVBQUU7R0FDdEMsRUFBRTtJQUNELEdBQUcsRUFBRSxVQUFVO0lBQ2YsS0FBSyxFQUFFLFNBQVMsUUFBUSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUU7TUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUNyRDtHQUNGLEVBQUU7SUFDRCxHQUFHLEVBQUUsYUFBYTtJQUNsQixLQUFLLEVBQUUsU0FBUyxXQUFXLENBQUMsUUFBUSxFQUFFO01BQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUMxQztHQUNGLENBQUMsQ0FBQyxDQUFDOztFQUVKLE9BQU8sU0FBUyxDQUFDO0NBQ2xCLEVBQUUsQ0FBQzs7QUFFSixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7T0FFN0I7O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdkMsSUFBSSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7O0FBRW5ELElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVuQyxJQUFJLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7QUFFM0MsU0FBUyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFOztBQUUvRixPQUFPLENBQUMsT0FBTyxHQUFHO0VBQ2hCLGFBQWEsRUFBRTtJQUNiLDBCQUEwQixFQUFFLFNBQVMsMEJBQTBCLENBQUMsSUFBSSxFQUFFO01BQ3BFLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDckM7SUFDRCxtQkFBbUIsRUFBRSxTQUFTLG1CQUFtQixDQUFDLElBQUksRUFBRTs7TUFFdEQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7UUFDOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztPQUNoQzs7TUFFRCxJQUFJLElBQUksRUFBRTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztPQUN6QixNQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUM7T0FDYjtLQUNGO0dBQ0Y7RUFDRCxLQUFLLEVBQUU7SUFDTCx1QkFBdUIsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWM7Ozs7SUFJdEQsdUJBQXVCLEVBQUUsU0FBUyx1QkFBdUIsR0FBRyxFQUFFO0dBQy9EO0VBQ0QsVUFBVSxFQUFFOzs7O0lBSVYsY0FBYyxFQUFFLFNBQVMsY0FBYyxHQUFHLEVBQUU7SUFDNUMsZ0JBQWdCLEVBQUUsU0FBUyxnQkFBZ0IsR0FBRyxFQUFFO0lBQ2hELGdCQUFnQixFQUFFLFNBQVMsZ0JBQWdCLEdBQUcsRUFBRTtHQUNqRDs7RUFFRCxPQUFPLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFDRixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7T0FFN0I7O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLFVBQVUsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0FBRTdRLE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ3RDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ3RDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ3BDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDOztBQUV4QyxJQUFJLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbkMsSUFBSSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7O0FBRTNDLElBQUksZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7O0FBRS9DLElBQUksaUJBQWlCLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7QUFFakUsSUFBSSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRTNDLFNBQVMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTs7QUFFL0YsSUFBSSxjQUFjLEdBQUc7RUFDbkIsR0FBRyxFQUFFLElBQUk7RUFDVCxHQUFHLEVBQUUsSUFBSTtDQUNWLENBQUM7O0FBRUYsU0FBUyxrQkFBa0IsR0FBRztFQUM1QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO0lBQzVCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlDLElBQUksSUFBSSxFQUFFO01BQ1IsT0FBTywrQkFBK0IsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ3REO0dBQ0Y7RUFDRCxPQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksT0FBTyxHQUFHLFNBQVMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7RUFDM0QsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7O0VBRWpDLE9BQU87O0lBRUwsSUFBSSxFQUFFLElBQUk7SUFDVixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsS0FBSyxFQUFFLEtBQUs7O0lBRVosTUFBTSxFQUFFLEtBQUs7R0FDZCxDQUFDO0NBQ0gsQ0FBQzs7QUFFRixPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs7O0FBRzFCLFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRTtFQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFO0lBQ1YsT0FBTyxTQUFTLENBQUM7R0FDbEI7O0VBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDekIsT0FBTyxLQUFLLENBQUM7R0FDZCxNQUFNO0lBQ0wsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO01BQ3JDLElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMzQyxJQUFJLGFBQWEsRUFBRTtRQUNqQixLQUFLLElBQUksR0FBRyxJQUFJLGFBQWEsRUFBRTtVQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xDO09BQ0Y7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0dBQ2Y7Q0FDRjs7O0FBR0QsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTs7RUFFaEMsSUFBSSxhQUFhLENBQUMsTUFBTSxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7SUFDM0MsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUM5QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOzs7SUFHeEIsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7TUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzNCLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFO1VBQ3JDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUN0RCxPQUFPLEdBQUcsQ0FBQztXQUNaLE1BQU07WUFDTCxPQUFPLEVBQUUsQ0FBQztXQUNYO1NBQ0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztPQUNiLE1BQU0sSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQ3ZFLFFBQVEsR0FBRyxFQUFFLENBQUM7T0FDZjs7TUFFRCxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNoQzs7SUFFRCxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztHQUN2Qjs7RUFFRCxPQUFPLEtBQUssQ0FBQztDQUNkOztBQUVELFNBQVMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7OztFQUNuQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7SUFDaEIsTUFBTSxLQUFLLENBQUMsc0RBQXNELEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0dBQzVGOztFQUVELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUNmLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO0VBQ3RCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQzs7RUFFZixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7SUFDbEIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ25ELEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFM0QsS0FBSyxRQUFRLElBQUksTUFBTSxFQUFFO01BQ3ZCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDL0UsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztPQUNwQztLQUNGO0dBQ0Y7O0VBRUQsS0FBSyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtJQUMxRyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHQSxXQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDdEM7O0VBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ25CLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0dBQzNEOzs7RUFHRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO0lBQzdCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDckMsS0FBSyxRQUFRLElBQUksWUFBWSxFQUFFO01BQzdCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtRQUNqQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO09BQzFDO0tBQ0Y7R0FDRjs7RUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRTtJQUNwRixLQUFLLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDekM7O0VBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUNyRTs7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUU7RUFDM0IsSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Ozs7O0VBSzdDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0VBQ3BCLE9BQU8sT0FBTyxDQUFDO0NBQ2hCOztBQUVELFNBQVMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7OztFQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQzVCLE1BQU0sS0FBSyxDQUFDLG9DQUFvQyxHQUFHLGtCQUFrQixFQUFFLENBQUMsQ0FBQztHQUMxRTs7O0VBR0QsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7RUFHN0MsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztFQUN0QixJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDOzs7RUFHdEIsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7RUFFM0IsSUFBSSxNQUFNLEVBQUU7O0lBRVYsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtNQUM1QixHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztNQUNqQixLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDbEM7O0lBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtNQUM1QixHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMxQjs7O0lBR0QsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDMUIsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO01BQzdDLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztLQUMxQzs7SUFFRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN0QixLQUFLLFFBQVEsSUFBSSxNQUFNLEVBQUU7TUFDdkIsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMvRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTs7VUFFaEUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMxQyxNQUFNO1VBQ0wsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwQztPQUNGO0tBQ0Y7R0FDRjs7RUFFRCxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQ2pILFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUdBLFdBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUN4Qzs7RUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDbkIsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7R0FDM0Q7O0VBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQzFELEFBQUM7O0FBRUYsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFO0VBQzlCLE9BQU8sQ0FBQyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDdkk7O09BRU07O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQztBQUNILE9BQU8sQ0FBQyxPQUFPLEdBQUcsc0JBQXNCLENBQUM7O0FBRXpDLElBQUksU0FBUyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUV2QyxJQUFJLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7QUFFbkQsU0FBUyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFOztBQUUvRixTQUFTLHNCQUFzQixDQUFDLElBQUksRUFBRTtFQUNwQyxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7RUFFN0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtJQUNkLE9BQU8sS0FBSyxDQUFDO0dBQ2Q7O0VBRUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDaEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztFQUV2QyxPQUFPLElBQUksQ0FBQztDQUNiLEFBQUM7QUFDRixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7T0FFN0I7O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLFlBQVksR0FBRyxZQUFZLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsRUFBQSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFBLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLFVBQVUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLFVBQVUsRUFBRSxFQUFBLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBQSxDQUFDLElBQUksV0FBVyxFQUFFLEVBQUEsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUEsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0FBRXBqQixJQUFJLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbkMsSUFBSSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7O0FBRTNDLElBQUksSUFBSSxHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUVuQyxJQUFJLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFekMsSUFBSSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbkQsSUFBSSxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDOztBQUUzRSxJQUFJLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVwRCxJQUFJLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLENBQUM7O0FBRTdFLElBQUksa0JBQWtCLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7O0FBRWpELElBQUksbUJBQW1CLEdBQUcsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FBQzs7QUFFckUsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXZDLElBQUksVUFBVSxHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDOztBQUVuRCxTQUFTLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7O0FBRS9GLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxZQUFZLFdBQVcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTs7QUFFekosSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBQ3BCLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUMxQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUM7QUFDbEIsSUFBSSxtQkFBbUIsR0FBRyxTQUFTLENBQUM7Ozs7OztBQU1wQyxJQUFJLGVBQWUsR0FBRyxZQUFZO0VBQ2hDLFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRTtJQUNoQyxlQUFlLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDOztJQUV2QyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztHQUNoQzs7RUFFRCxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDN0IsR0FBRyxFQUFFLGdCQUFnQjtJQUNyQixLQUFLLEVBQUUsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUU7O01BRTVELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO01BQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO01BQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7TUFFekMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7TUFDdkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7TUFDckMsSUFBSSxRQUFRLEdBQUc7UUFDYixTQUFTLEVBQUUsSUFBSTtRQUNmLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEtBQUs7T0FDYixDQUFDO01BQ0YsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7TUFFOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7OztNQUcxQixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzs7TUFFckQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztNQUV0QyxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7UUFDdkIsSUFBSSxZQUFZLEVBQUU7VUFDaEIsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNsQyxNQUFNO1VBQ0wsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN2RDtPQUNGOztNQUVELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRTtRQUNwRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztPQUNuRjs7O01BR0QsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztNQUM5QixJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7T0FDdkM7O01BRUQsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO1FBQ3ZCLElBQUksWUFBWSxFQUFFO1VBQ2hCLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDbEMsTUFBTTtVQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdkQ7T0FDRjs7TUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOztNQUVwRCxPQUFPLFFBQVEsQ0FBQztLQUNqQjtHQUNGLEVBQUU7SUFDRCxHQUFHLEVBQUUsZUFBZTtJQUNwQixLQUFLLEVBQUUsU0FBUyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRTtNQUMvQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7O01BRWpCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzVCLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO09BQ3ZCOztNQUVELElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQzs7TUFFbkQsSUFBSSxxQkFBcUIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsT0FBTyxFQUFFLEtBQUssRUFBRTtRQUNqRSxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5RSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdkMsYUFBYSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O1FBRWxDLElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlFLE9BQU8sVUFBVSxDQUFDO09BQ25CLENBQUMsQ0FBQzs7TUFFSCxPQUFPLHFCQUFxQixDQUFDO0tBQzlCO0dBQ0YsRUFBRTtJQUNELEdBQUcsRUFBRSxpQkFBaUI7SUFDdEIsS0FBSyxFQUFFLFNBQVMsZUFBZSxDQUFDLGNBQWMsRUFBRTtNQUM5QyxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzs7TUFFOUMsSUFBSSxnQkFBZ0IsRUFBRTtRQUNwQixLQUFLLElBQUksSUFBSSxJQUFJLGdCQUFnQixFQUFFO1VBQ2pDLElBQUksYUFBYSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1VBQzNDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNoRDtRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7T0FDL0I7S0FDRjtHQUNGLEVBQUU7SUFDRCxHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEtBQUssRUFBRSxTQUFTLGdCQUFnQixDQUFDLGNBQWMsRUFBRTtNQUMvQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDcEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUM7UUFDbkMsSUFBSSxHQUFHLEVBQUU7VUFDUCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDOUQ7O1FBRUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxjQUFjLEVBQUU7VUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO09BQ2pFOztNQUVELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7O01BRXJDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7TUFFdEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7TUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7TUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7TUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7TUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7TUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7S0FDNUI7R0FDRixFQUFFO0lBQ0QsR0FBRyxFQUFFLGlCQUFpQjtJQUN0QixLQUFLLEVBQUUsU0FBUyxlQUFlLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFOztNQUVsRixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQzs7TUFFbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQzs7TUFFckQsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztNQUNsQyxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDOztNQUVsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO01BQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQzs7TUFFckQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3ZEO0dBQ0YsRUFBRTtJQUNELEdBQUcsRUFBRSxrQkFBa0I7SUFDdkIsS0FBSyxFQUFFLFNBQVMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRTs7O01BQ3JELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDO01BQ3JCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO01BQ3ZCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDO01BQzFCLEtBQUssT0FBTyxJQUFJLFNBQVMsRUFBRTtRQUN6QixJQUFJLE9BQU8sS0FBSyxRQUFRLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRTtVQUNqSSxTQUFTO1NBQ1Y7UUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7VUFDckIsSUFBSSxTQUFTLEdBQUdvRCxNQUFJLENBQUMsY0FBYyxDQUFDO1VBQ3BDLEtBQUssU0FBUyxJQUFJLFNBQVMsRUFBRTtZQUMzQixJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7Y0FDdkMsWUFBWSxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7Y0FDbEMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUM5QjtXQUNGO1VBQ0RBLE1BQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQzVCLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7VUFDNUMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxVQUFVLEVBQUU7WUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUNBLE1BQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1dBQ3JIO1NBQ0YsTUFBTTtVQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQ0EsTUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUMxRjtPQUNGOztNQUVELEtBQUssT0FBTyxJQUFJLFNBQVMsRUFBRTtRQUN6QixJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxRQUFRLEdBQUcsT0FBTyxLQUFLLEtBQUssR0FBR0EsTUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDNUcsSUFBSSxPQUFPLEtBQUssUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtVQUMvSCxTQUFTO1NBQ1Y7O1FBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFO1VBQ3JCLElBQUksUUFBUSxFQUFFOztZQUVaLFFBQVEsR0FBR0EsTUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztXQUM5RCxNQUFNO1lBQ0xBLE1BQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1dBQzVCOztVQUVELElBQUksUUFBUSxJQUFJLElBQUksRUFBRTs7WUFFcEIsS0FBSyxTQUFTLElBQUksUUFBUSxFQUFFO2NBQzFCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtnQkFDNUYsWUFBWSxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7ZUFDOUI7YUFDRjs7WUFFRCxLQUFLLFNBQVMsSUFBSSxRQUFRLEVBQUU7Y0FDMUIsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JGLFlBQVksR0FBRyxZQUFZLElBQUksRUFBRSxDQUFDO2dCQUNsQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2VBQy9DO2FBQ0Y7V0FDRixNQUFNOztZQUVMLFlBQVksR0FBRyxRQUFRLENBQUM7V0FDekI7OztTQUdGLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7VUFDNUMsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUNBLE1BQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1dBQzNHOztVQUVELElBQUksT0FBTyxRQUFRLEtBQUssVUFBVSxFQUFFO1lBQ2xDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDQSxNQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztXQUN4Rzs7U0FFRixNQUFNO1VBQ0wsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1VBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUM7VUFDNUIsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQ0EsTUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztXQUM3RSxNQUFNO1lBQ0wsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDQSxNQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1dBQzFGO1VBQ0QsQUFBSSxBQUFLLEFBTVI7U0FDRjtPQUNGOztNQUVELElBQUksWUFBWSxFQUFFO1FBQ2hCLEFBQUksQUFBSyxBQU9ULE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7T0FDckU7S0FDRjtHQUNGLEVBQUU7SUFDRCxHQUFHLEVBQUUsZ0JBQWdCO0lBQ3JCLEtBQUssRUFBRSxTQUFTLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLEVBQUU7TUFDNUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOzs7TUFHbEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDOztNQUUxQyxJQUFJLG9CQUFvQixJQUFJLElBQUksSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hELE9BQU87T0FDUjs7TUFFRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7TUFDdEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztNQUVsQixJQUFJLG9CQUFvQixJQUFJLElBQUksRUFBRTtRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1VBQ3hDLG9CQUFvQixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUMvQzs7O1FBR0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1VBQ2pGLElBQUksV0FBVyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1VBQzlDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1VBQzlFLElBQUksU0FBUyxHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7VUFDbkQsSUFBSSxXQUFXLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxlQUFlLENBQUM7O1VBRXpELElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFOztZQUV2RixTQUFTLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7V0FDaEMsTUFBTTs7WUFFTCxJQUFJLFNBQVMsRUFBRTtjQUNiLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Y0FFOUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2NBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7YUFDaEM7O1lBRUQsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztXQUN2RTtTQUNGO09BQ0Y7O01BRUQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUM7TUFDNUIsSUFBSSx5QkFBeUIsR0FBRyxLQUFLLENBQUMsQ0FBQzs7TUFFdkMsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLEtBQUssSUFBSSxLQUFLLElBQUksWUFBWSxFQUFFO1VBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLFNBQVM7V0FDVjs7VUFFRCxJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7VUFDckMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7OztVQUd4QyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLGNBQWMsR0FBRyxVQUFVLENBQUM7WUFDNUIseUJBQXlCLEdBQUcsWUFBWSxDQUFDO1dBQzFDLE1BQU0sSUFBSSxZQUFZLEVBQUU7WUFDdkIsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7V0FDL0I7U0FDRjtPQUNGOztNQUVELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixDQUFDLFlBQVk7OztVQUdYLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztVQUNsQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7VUFDbEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDO1VBQzFCLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQzs7VUFFeEIsSUFBSSxLQUFLLEdBQUcsU0FBUyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2NBQ3hDLE9BQU8sVUFBVSxDQUFDO2FBQ25COztZQUVELElBQUksU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxJQUFJLFNBQVMsR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztZQUVyRCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7Y0FDM0IsSUFBSSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7O2NBRXBELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7Z0JBQ3ZDLG1CQUFtQixHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztlQUM3Qzs7Ozs7Y0FLRCxJQUFJLFNBQVMsQ0FBQyxXQUFXLEdBQUcsU0FBUyxFQUFFOztnQkFFckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2tCQUNqQyxjQUFjLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzVEOztnQkFFRCxLQUFLLElBQUksRUFBRSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtrQkFDM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2lCQUM1RTtlQUNGOztjQUVELGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7O2NBRTVELFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Y0FDdkQsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7YUFDbkMsTUFBTTtjQUNMLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTs7Z0JBRXJCLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7ZUFDeEQ7O2NBRUQsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDOztjQUVwQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO2VBQ3pCOztjQUVELFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUU7O2dCQUVwRSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2tCQUM1QixRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDdkI7O2dCQUVELElBQUksUUFBUSxFQUFFOztrQkFFWixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDNUIsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7bUJBQ3ZCOzs7a0JBR0QsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUM7a0JBQzFCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUM5QyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzFCLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3NCQUNqQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUMxRCxNQUFNO3NCQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7cUJBQ3hEO29CQUNELFlBQVksR0FBRyxLQUFLLENBQUM7bUJBQ3RCOzs7a0JBR0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQ3JDLEtBQUssSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtzQkFDNUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNsRDttQkFDRjtpQkFDRixNQUFNOzs7O2tCQUlMLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDakMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO21CQUM1RDs7a0JBRUQsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQzs7a0JBRWpDLElBQUksY0FBYyxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUNyQyxtQkFBbUIsR0FBRyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO3NCQUN0QyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDOUM7bUJBQ0Y7O2tCQUVELEtBQUssSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDbkQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMzQixJQUFJLGNBQWMsRUFBRTtzQkFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztxQkFDM0QsTUFBTSxJQUFJLG1CQUFtQixFQUFFO3NCQUM5QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7cUJBQ2pFLE1BQU07c0JBQ0wsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztxQkFDbkQ7bUJBQ0Y7aUJBQ0Y7O2dCQUVELGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2VBQ2xELENBQUMsQ0FBQztjQUNILFNBQVMsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO2FBQ25DOztZQUVELFNBQVMsRUFBRSxDQUFDO1lBQ1osY0FBYyxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztXQUM1QyxDQUFDOztVQUVGLEtBQUssSUFBSSxNQUFNLElBQUksWUFBWSxFQUFFO1lBQy9CLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFFMUIsSUFBSSxLQUFLLEtBQUssVUFBVSxFQUFFLEVBQUEsU0FBUyxFQUFBO1dBQ3BDOzs7VUFHRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFOztZQUVyQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtjQUM5QyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM1QztXQUNGO1NBQ0YsR0FBRyxDQUFDO09BQ047O01BRUQsSUFBSSx5QkFBeUIsRUFBRTtRQUM3QixjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztPQUNuQzs7TUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO0tBQ3ZDO0dBQ0YsRUFBRTtJQUNELEdBQUcsRUFBRSxlQUFlO0lBQ3BCLEtBQUssRUFBRSxTQUFTLGFBQWEsR0FBRztNQUM5QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztPQUMxRDs7TUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7S0FDekI7R0FDRixFQUFFO0lBQ0QsR0FBRyxFQUFFLG1CQUFtQjtJQUN4QixLQUFLLEVBQUUsU0FBUyxpQkFBaUIsR0FBRztNQUNsQyxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztLQUM3QjtHQUNGLEVBQUU7SUFDRCxHQUFHLEVBQUUsU0FBUztJQUNkLEtBQUssRUFBRSxTQUFTLE9BQU8sR0FBRztNQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0tBQ2xDO0dBQ0YsQ0FBQyxDQUFDLENBQUM7O0VBRUosT0FBTyxlQUFlLENBQUM7Q0FDeEIsRUFBRSxDQUFDOztBQUVKLE9BQU8sQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOztPQUU3Qjs7T0FFQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0VBQzNDLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDOzs7OztBQUtILE9BQU8sQ0FBQyxPQUFPLEdBQUc7RUFDaEIsTUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFO0lBQzNELElBQUksT0FBTyxHQUFHLFdBQVcsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQztJQUNyRCxJQUFJLE9BQU8sR0FBRyxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUM7OztJQUdyRCxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7O01BRXZCLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQzs7TUFFdkUsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3hFO0dBQ0Y7RUFDRCxNQUFNLEVBQUUsU0FBUyxNQUFNLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7SUFDdEQsSUFBSSxDQUFDLGNBQWMsRUFBRTtNQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHNGQUFzRixHQUFHLDZEQUE2RCxDQUFDLENBQUM7S0FDeks7O0lBRUQsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0MsSUFBSSxPQUFPLEdBQUcsS0FBSyxVQUFVLEVBQUU7TUFDN0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2YsTUFBTTtNQUNMLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztLQUMvQztHQUNGO0VBQ0QsTUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO0lBQ3RELElBQUksT0FBTyxHQUFHLEtBQUssVUFBVSxFQUFFOztNQUU3QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDWCxNQUFNOztNQUVMLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO01BQzdDLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFO1FBQ25ELE9BQU8sY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7T0FDM0M7S0FDRjtHQUNGO0NBQ0YsQ0FBQztBQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOztPQUU3Qjs7T0FFQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0VBQzNDLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDOztBQUVILE9BQU8sQ0FBQyxPQUFPLEdBQUcsVUFBVSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtFQUNwRCxJQUFJLFVBQVUsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQztFQUN4QyxJQUFJLE1BQU0sR0FBRyxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUM7RUFDNUMsSUFBSSxXQUFXLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7O0VBRTNDLElBQUksTUFBTSxFQUFFO0lBQ1YsSUFBSSxPQUFPLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQzs7SUFFL0IsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQzs7SUFFaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsOENBQThDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUE7O0lBRWpHLE9BQU8sU0FBUyxHQUFHLE9BQU8sR0FBRyxXQUFXLENBQUM7R0FDMUMsTUFBTTtJQUNMLE9BQU8sV0FBVyxDQUFDO0dBQ3BCO0NBQ0YsQ0FBQzs7QUFFRixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7T0FFN0I7O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQztBQUNILE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzFCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ3BDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDOzs7O0FBSWxDLElBQUkscUJBQXFCLEdBQUc7RUFDMUIsdUJBQXVCLEVBQUUsSUFBSTtFQUM3QixpQkFBaUIsRUFBRSxJQUFJO0VBQ3ZCLGdCQUFnQixFQUFFLElBQUk7RUFDdEIsZ0JBQWdCLEVBQUUsSUFBSTtFQUN0QixPQUFPLEVBQUUsSUFBSTtFQUNiLFlBQVksRUFBRSxJQUFJO0VBQ2xCLGVBQWUsRUFBRSxJQUFJO0VBQ3JCLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLElBQUksRUFBRSxJQUFJO0VBQ1YsUUFBUSxFQUFFLElBQUk7RUFDZCxZQUFZLEVBQUUsSUFBSTtFQUNsQixVQUFVLEVBQUUsSUFBSTtFQUNoQixZQUFZLEVBQUUsSUFBSTtFQUNsQixTQUFTLEVBQUUsSUFBSTtFQUNmLE9BQU8sRUFBRSxJQUFJO0VBQ2IsVUFBVSxFQUFFLElBQUk7RUFDaEIsVUFBVSxFQUFFLElBQUk7RUFDaEIsU0FBUyxFQUFFLElBQUk7OztFQUdmLE9BQU8sRUFBRSxJQUFJO0VBQ2IsS0FBSyxFQUFFLElBQUk7RUFDWCxPQUFPLEVBQUUsSUFBSTtFQUNiLE9BQU8sRUFBRSxJQUFJO0VBQ2IsTUFBTSxFQUFFLElBQUk7RUFDWixNQUFNLEVBQUUsSUFBSTtFQUNaLElBQUksRUFBRSxJQUFJOztFQUVWLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUNGLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixJQUFJLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQzs7QUFFbkMsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUM7Ozs7Ozs7QUFPeEIsU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFO0VBQ2xCLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDOUQ7Ozs7Ozs7O0FBUUQsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFO0VBQ3BCLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQzs7RUFFekYsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLFFBQVEsRUFBRTtJQUM5QyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0dBQzFDLENBQUMsQ0FBQztDQUNKOztBQUVELFNBQVMsTUFBTSxHQUFHO0VBQ2hCLE9BQU8sVUFBVSxDQUFDO0NBQ25COztBQUVELFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRTtFQUNuQixVQUFVLEdBQUcsR0FBRyxDQUFDO0NBQ2xCOztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7RUFDL0IsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNoRTs7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0VBQzlCLElBQUksSUFBSSxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUU7SUFDbkMsT0FBTyxHQUFHLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQztHQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ3JCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3JCOztFQUVELE9BQU8sR0FBRyxDQUFDO0NBQ1o7O09BRU07O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQztBQUNILE9BQU8sQ0FBQywwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQzs7Ozs7OztBQU8xQyxTQUFTLDBCQUEwQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7RUFDaEQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQzs7RUFFaEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRTtJQUM1QixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDckMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDaEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDcEI7R0FDRixDQUFDLENBQUM7O0VBRUgsT0FBTyxLQUFLLENBQUM7Q0FDZCxBQUFDOzs7Ozs7Ozs7QUFTRixTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFO0VBQzdELElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUU7SUFDbEQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7R0FDaEM7O0VBRUQsT0FBTyxLQUFLLENBQUM7Q0FDZDs7T0FFTTs7T0FFQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0VBQzNDLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDOztBQUVILElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVuQyxJQUFJLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7QUFFM0MsU0FBUyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFOztBQUUvRixTQUFTLFdBQVcsQ0FBQyxRQUFRLEVBQUU7RUFDN0IsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO0lBQ3BCLE9BQU8sSUFBSSxDQUFDO0dBQ2I7OztFQUdELElBQUksUUFBUSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO0lBQy9DLE9BQU8sUUFBUSxDQUFDO0dBQ2pCOzs7RUFHRCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7SUFDeEIsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDO0dBQzdCOztFQUVELElBQUksT0FBTyxRQUFRLElBQUksUUFBUSxFQUFFO0lBQy9CLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0dBQ3ZEOztFQUVELElBQUksT0FBTyxRQUFRLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtJQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7R0FDakU7OztFQUdELElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7O0VBRWxDLElBQUksUUFBUSxFQUFFO0lBQ1osT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7TUFDNUIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQzs7TUFFdkMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO09BQ2I7S0FDRjtJQUNELE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQztHQUM3QixNQUFNO0lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0dBQ3RFO0NBQ0Y7O0FBRUQsT0FBTyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUM7QUFDOUIsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7O09BRTdCOztPQUVBLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7RUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7QUFDSCxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7O0FBRTdULG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUV4QixJQUFJLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdEMsSUFBSSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXhDLElBQUksV0FBVyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVyRCxJQUFJLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7QUFFN0MsSUFBSSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7O0FBRTdELElBQUksVUFBVSxHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUV6QyxJQUFJLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFckQsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7O0FBRXZDLElBQUksUUFBUSxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUVoRCxJQUFJLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7QUFFNUMsSUFBSSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRTFELElBQUksd0JBQXdCLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXRELElBQUksd0JBQXdCLEdBQUcsc0JBQXNCLENBQUMsd0JBQXdCLENBQUMsQ0FBQzs7QUFFaEYsSUFBSSx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7QUFFdEQsSUFBSSx1QkFBdUIsR0FBRyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDOztBQUU5RSxJQUFJLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUUvQyxJQUFJLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLENBQUM7O0FBRWhFLElBQUksU0FBUyxHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUV4QyxJQUFJLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7QUFFbEQsU0FBUyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFOztBQUUvRixPQUFPLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7QUFDL0MsT0FBTyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO0FBQzdDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUNqRCxPQUFPLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7QUFDL0MsT0FBTyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO0FBQ3hDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztBQUNoRCxPQUFPLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7QUFDeEMsT0FBTyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0FBQ2xDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztBQUM1QyxPQUFPLENBQUMsc0JBQXNCLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDO0FBQ2xFLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUM7QUFDaEUsT0FBTyxDQUFDLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7QUFDbEQsT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDOztPQUU3Qjs7T0FFQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsSUFBSSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRW5DLElBQUksTUFBTSxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUUzQyxTQUFTLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7OztBQUcvRixJQUFJLE9BQU8sOEJBQThCLEtBQUssV0FBVyxJQUFJLE9BQU8sOEJBQThCLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtFQUN4SCw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3ZEOztPQUVNOztPQUVBLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7RUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7QUFDSCxPQUFPLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztBQUNsQyxTQUFTLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7RUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDL0MsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3ZDO0dBQ0YsTUFBTTtJQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7R0FDdkI7Q0FDRjs7QUFFRCxTQUFTLGVBQWUsQ0FBQyxRQUFRLEVBQUU7RUFDakMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO0lBQ3BCLE9BQU8sUUFBUSxDQUFDO0dBQ2pCO0VBQ0QsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQzs7RUFFbkMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUN2QixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ3BCOztFQUVELE9BQU8sTUFBTSxDQUFDO0NBQ2Y7QUFDRCxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7T0FFN0I7O09BRUEsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtFQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLFlBQVksR0FBRyxZQUFZLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsRUFBQSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFBLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLFVBQVUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLFVBQVUsRUFBRSxFQUFBLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBQSxDQUFDLElBQUksV0FBVyxFQUFFLEVBQUEsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUEsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0FBRXBqQixJQUFJLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFeEMsSUFBSSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7O0FBRXJELFNBQVMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTs7QUFFL0YsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxFQUFFOztBQUV6SixTQUFTLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLGNBQWMsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFOztBQUVoUCxTQUFTLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxFQUFFLEVBQUEsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxFQUFBLEVBQUU7O0FBRTllLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQzs7QUFFcEIsSUFBSSxJQUFJLEdBQUcsVUFBVSxVQUFVLEVBQUU7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QUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDOztBQUUvQixJQUFJLE9BQU8sR0FBRyxTQUFTLE9BQU8sQ0FBQyxJQUFJLEVBQUU7RUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztFQUN0RSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDdEQsQ0FBQzs7QUFFRixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRTtFQUNyQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUE7RUFDbEYsT0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOztBQUVGLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFO0VBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUEsT0FBTyxLQUFLLENBQUMsRUFBQTtFQUNsQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztFQUMzQixPQUFPLElBQUksQ0FBQztDQUNiLENBQUM7O0FBRUYsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLEVBQUU7RUFDckMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztD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QzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtFQUNqQyxNQUFNLENBQUMsSUFBSSxFQUFFaEIsU0FBTyxDQUFDLENBQUE7Q0FDdEI7O0FDaEhELENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBLENBQUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFBLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLE9BQU8sQ0FBQyxFQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFBLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxLQUFLLEVBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFBLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEFBQUM7O0FDQXpzSSxDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxFQUFBLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUEsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFBLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUEsS0FBSyxFQUFBLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFBLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLHdIQUF3SCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFD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QU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDaUMsU0FBTyxDQUFDLENBQUE7SUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtHQUN0QjtDQUNGOzs7Q0FHQTs7O0FDbkNELENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsTUFBTSxFQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsT0FBTyxDQUFDLENBQUMsRUFBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEFBQUM7O0FDQWx6QixDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBLENBQUMsS0FBSyxFQUFBLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUks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QUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM3QyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM3QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFD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 |