weex-vue-render
Version:
Web renderer for weex project written in Vue DSL.
10,763 lines • 1.11 MB
JavaScript
console.log('START WEEX VUE RENDER: 1.0.36, Build 2018-12-29 17:52.');
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.WeexVueRender = 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 * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n.weex-root,\n.weex-root * {\n color: initial;\n cursor: initial;\n direction: inherit;\n /* In chrome, there's a chance that user set the miximum font-size to \n a abnormal smaller size. But actually the smaller size is never working\n if this font / font-size default value is set to initial. Perhaps a bug\n for chrome. */\n font: initial;\n font-size: initial;\n font-family: initial;\n font-style: initial;\n font-variant: initial;\n font-weight: initial;\n line-height: initial;\n text-align: initial;\n text-indent: initial;\n visibility: initial;\n white-space: initial;\n word-spacing: initial;\n font-family: BlinkMacSystemFont, 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\n.weex-root,\n.weex-root *,\n.weex-root *::before,\n.weex-root *::after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-text-size-adjust: none;\n -moz-text-size-adjust: none;\n -ms-text-size-adjust: none;\n text-size-adjust: none;\n}\n\n.weex-root a,\n.weex-root button,\n.weex-root [role=\"button\"],\n.weex-root input,\n.weex-root label,\n.weex-root select,\n.weex-root textarea {\n touch-action: manipulation;\n}\n\n.weex-root p,\n.weex-root ol,\n.weex-root ul,\n.weex-root dl,\n.weex-root figure {\n margin: 0;\n padding: 0;\n}\n\n.weex-root li {\n list-style: none;\n}\n\n.weex-root figure {\n margin: 0;\n}\n\n.weex-root textarea {\n resize: none;\n}\n\n/* show no scroll bar. */\n::-webkit-scrollbar {\n display: none;\n}\n",undefined);
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n \n.weex-root * {\n border-width: 0;\n border-color: inherit;\n border-style: solid;\n}\n\ndiv.weex-root {\n min-height: 100%;\n}\n\n/**\n * slider will overflow in horizontal axis, which will cause container\n * horizontally expanding. below styles will prevent this from happening.\n */\n.weex-root {\n width: 100%;\n overflow-x: hidden;\n}\n\n.weex-root figure {\n background-repeat: no-repeat;\n background-position: 50% 50%;\n}\n\n.weex-flex-ct {\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n}\n\n.weex-ct {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n position: relative;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -webkit-flex-direction: column;\n flex-direction: column;\n -webkit-flex-shrink: 0;\n flex-shrink: 0;\n -webkit-box-flex: 0;\n -webkit-flex-grow: 0;\n flex-grow: 0;\n -webkit-flex-basis: auto;\n flex-basis: auto;\n -webkit-box-align: stretch;\n -webkit-align-items: stretch;\n align-items: stretch;\n -webkit-align-content: flex-start;\n align-content: flex-start;\n border: 0 solid black;\n margin: 0;\n padding: 0;\n min-width: 0;\n}\n\n.weex-ct.horizontal {\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n flex-direction: row;\n}\n\n.weex-el {\n display: block;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n position: relative;\n -webkit-flex-shrink: 0;\n flex-shrink: 0;\n -webkit-box-flex: 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\n.weex-text {\n display: -webkit-box;\n display: -moz-box;\n -webkit-box-orient: vertical;\n position: relative;\n white-space: pre-wrap; /* not using 'pre': support auto line feed. */\n font-size: 0.4266666666666667rem;\n word-wrap: break-word;\n overflow: hidden; /* it'll be clipped if the height is not high enough. */\n}\n\n.weex-image {\n background-repeat: no-repeat;\n background-position: 50% 50%;\n background-size: 100% 100%;\n}\n\n.weex-a {\n text-decoration: none;\n}\n\n.weex-ios-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n z-index: 9999;\n top: 0;\n}\n\n.weex-fixed {\n position: fixed;\n z-index: 1;\n}\n\n.weex-sticky {\n position: fixed;\n top: 0;\n z-index: 9999;\n}\n",undefined);
// 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.2.1 RequireObjectCoercible(argument)
var _defined = function (it) {
if (it == undefined) { throw TypeError("Can't call method on " + it); }
return it;
};
// true -> String#at
// false -> String#codePointAt
var _stringAt = function (TO_STRING) {
return function (that, pos) {
var s = String(_defined(that));
var i = _toInteger(pos);
var l = s.length;
var a, b;
if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
a = s.charCodeAt(i);
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
? TO_STRING ? s.charAt(i) : a
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
};
};
var _library = false;
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.2' };
if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
});
var _core_1 = _core.version;
var _isObject = function (it) {
return typeof it === 'object' ? it !== null : typeof it === 'function';
};
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 document$1 = _global.document;
// typeof document.createElement is 'object' in old IE
var is = _isObject(document$1) && _isObject(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])
// 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(it)) { return it; }
var fn, val;
if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) { return val; }
if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
throw TypeError("Can't convert object to primitive value");
};
var dP = Object.defineProperty;
var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
_anObject(O);
P = _toPrimitive(P, true);
_anObject(Attributes);
if (_ie8DomDefine) { try {
return dP(O, P, Attributes);
} catch (e) { /* empty */ } }
if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
if ('value' in Attributes) { O[P] = Attributes.value; }
return O;
};
var _objectDp = {
f: f
};
var _propertyDesc = function (bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value: value
};
};
var _hide = _descriptors ? function (object, key, value) {
return _objectDp.f(object, key, _propertyDesc(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 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 _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 PROTOTYPE = 'prototype';
var $export = function (type, name, source) {
var IS_FORCED = type & $export.F;
var IS_GLOBAL = type & $export.G;
var IS_STATIC = type & $export.S;
var IS_PROTO = type & $export.P;
var IS_BIND = type & $export.B;
var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[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) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
// extend global
if (target) { _redefine(target, key, out, type & $export.U); }
// export
if (exports[key] != out) { _hide(exports, key, exp); }
if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
}
};
_global.core = _core;
// type bitmap
$export.F = 1; // forced
$export.G = 2; // global
$export.S = 4; // static
$export.P = 8; // proto
$export.B = 16; // bind
$export.W = 32; // wrap
$export.U = 64; // safe
$export.R = 128; // real proto method for `library`
var _export = $export;
var _iterators = {};
var toString = {}.toString;
var _cof = function (it) {
return toString.call(it).slice(8, -1);
};
// fallback for non-array-like ES3 and non-enumerable old V8 strings
// eslint-disable-next-line no-prototype-builtins
var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
return _cof(it) == 'String' ? it.split('') : Object(it);
};
// to indexed object, toObject with fallback for non-array-like ES3 strings
var _toIobject = function (it) {
return _iobject(_defined(it));
};
// 7.1.15 ToLength
var min = Math.min;
var _toLength = function (it) {
return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};
var max = Math.max;
var min$1 = Math.min;
var _toAbsoluteIndex = function (index, length) {
index = _toInteger(index);
return index < 0 ? max(index + length, 0) : min$1(index, length);
};
// false -> Array#indexOf
// true -> Array#includes
var _arrayIncludes = function (IS_INCLUDES) {
return function ($this, el, fromIndex) {
var O = _toIobject($this);
var length = _toLength(O.length);
var index = _toAbsoluteIndex(fromIndex, length);
var value;
// Array#includes uses SameValueZero equality algorithm
// eslint-disable-next-line no-self-compare
if (IS_INCLUDES && el != el) { while (length > index) {
value = O[index++];
// eslint-disable-next-line no-self-compare
if (value != value) { return true; }
// Array#indexOf ignores holes, Array#includes - not
} } else { for (;length > index; index++) { if (IS_INCLUDES || index in O) {
if (O[index] === el) { return IS_INCLUDES || index || 0; }
} } } return !IS_INCLUDES && -1;
};
};
var SHARED = '__core-js_shared__';
var store = _global[SHARED] || (_global[SHARED] = {});
var _shared = function (key) {
return store[key] || (store[key] = {});
};
var shared = _shared('keys');
var _sharedKey = function (key) {
return shared[key] || (shared[key] = _uid(key));
};
var arrayIndexOf = _arrayIncludes(false);
var IE_PROTO$1 = _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$1) { _has(O, key) && result.push(key); } }
// Don't enum bug & hidden keys
while (names.length > i) { if (_has(O, key = names[i++])) {
~arrayIndexOf(result, key) || result.push(key);
} }
return result;
};
// 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 _objectKeys = Object.keys || function keys(O) {
return _objectKeysInternal(O, _enumBugKeys);
};
var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
_anObject(O);
var keys = _objectKeys(Properties);
var length = keys.length;
var i = 0;
var P;
while (length > i) { _objectDp.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 IE_PROTO = _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.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[i]]; }
return createDict();
};
var _objectCreate = Object.create || function create(O, Properties) {
var result;
if (O !== null) {
Empty[PROTOTYPE$1] = _anObject(O);
result = new Empty();
Empty[PROTOTYPE$1] = null;
// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO] = O;
} else { result = createDict(); }
return Properties === undefined ? result : _objectDps(result, Properties);
};
var _wks = createCommonjsModule(function (module) {
var store = _shared('wks');
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;
});
var def = _objectDp.f;
var TAG = _wks('toStringTag');
var _setToStringTag = function (it, tag, stat) {
if (it && !_has(it = stat ? it : it.prototype, TAG)) { def(it, TAG, { configurable: true, value: tag }); }
};
var IteratorPrototype = {};
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
_hide(IteratorPrototype, _wks('iterator'), function () { return this; });
var _iterCreate = function (Constructor, NAME, next) {
Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });
_setToStringTag(Constructor, NAME + ' Iterator');
};
// 7.1.13 ToObject(argument)
var _toObject = function (it) {
return Object(_defined(it));
};
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var IE_PROTO$2 = _sharedKey('IE_PROTO');
var ObjectProto = Object.prototype;
var _objectGpo = Object.getPrototypeOf || function (O) {
O = _toObject(O);
if (_has(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 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 = _objectGpo($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(IteratorPrototype, ITERATOR)) { _hide(IteratorPrototype, ITERATOR, returnThis); }
}
}
// fix Array#{values, @@iterator}.name in V8 / FF
if (DEF_VALUES && $native && $native.name !== VALUES) {
VALUES_BUG = true;
$default = function values() { return $native.call(this); };
}
// Define iterator
if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
_hide(proto, ITERATOR, $default);
}
// Plug for library
_iterators[NAME] = $default;
_iterators[TAG] = returnThis;
if (DEFAULT) {
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if (FORCED) { for (key in methods) {
if (!(key in proto)) { _redefine(proto, key, methods[key]); }
} } else { _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods); }
}
return methods;
};
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 };
});
// call something on iterator step with safe closing on error
var _iterCall = function (iterator, fn, value, entries) {
try {
return entries ? fn(_anObject(value)[0], value[1]) : fn(value);
// 7.4.6 IteratorClose(iterator, completion)
} catch (e) {
var ret = iterator['return'];
if (ret !== undefined) { _anObject(ret.call(iterator)); }
throw e;
}
};
// check on default Array iterator
var ITERATOR$1 = _wks('iterator');
var ArrayProto = Array.prototype;
var _isArrayIter = function (it) {
return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR$1] === it);
};
var _createProperty = function (object, index, value) {
if (index in object) { _objectDp.f(object, index, _propertyDesc(0, value)); }
else { object[index] = value; }
};
// getting tag from 19.1.3.6 Object.prototype.toString()
var TAG$1 = _wks('toStringTag');
// ES3 wrong here
var ARG = _cof(function () { return arguments; }()) == 'Arguments';
// fallback for IE11 Script Access Denied error
var tryGet = function (it, key) {
try {
return it[key];
} catch (e) { /* empty */ }
};
var _classof = function (it) {
var O, T, B;
return it === undefined ? 'Undefined' : it === null ? 'Null'
// @@toStringTag case
: typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T
// builtinTag case
: ARG ? _cof(O)
// ES3 arguments fallback
: (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};
var ITERATOR$2 = _wks('iterator');
var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
if (it != undefined) { return it[ITERATOR$2]
|| it['@@iterator']
|| _iterators[_classof(it)]; }
};
var ITERATOR$3 = _wks('iterator');
var SAFE_CLOSING = false;
try {
var riter = [7][ITERATOR$3]();
riter['return'] = function () { SAFE_CLOSING = true; };
// eslint-disable-next-line no-throw-literal
} 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$3]();
iter.next = function () { return { done: safe = true }; };
arr[ITERATOR$3] = function () { return iter; };
exec(arr);
} catch (e) { /* empty */ }
return safe;
};
_export(_export.S + _export.F * !_iterDetect(function (iter) { }), 'Array', {
// 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
from: function from(arrayLike /* mapfn = undefined, thisArg = undefined */) {
var O = _toObject(arrayLike);
var C = typeof this == 'function' ? this : Array;
var aLen = arguments.length;
var mapfn = aLen > 1 ? arguments[1] : undefined;
var mapping = mapfn !== undefined;
var index = 0;
var iterFn = core_getIteratorMethod(O);
var length, result, step, iterator;
if (mapping) { mapfn = _ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); }
// if object isn't iterable or it's array with default iterator - use simple case
if (iterFn != undefined && !(C == Array && _isArrayIter(iterFn))) {
for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
_createProperty(result, index, mapping ? _iterCall(iterator, mapfn, [step.value, index], true) : step.value);
}
} else {
length = _toLength(O.length);
for (result = new C(length); length > index; index++) {
_createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
}
}
result.length = index;
return result;
}
});
var from = _core.Array.from;
var f$1 = Object.getOwnPropertySymbols;
var _objectGops = {
f: f$1
};
var f$2 = {}.propertyIsEnumerable;
var _objectPie = {
f: f$2
};
// 19.1.2.1 Object.assign(target, source, ...)
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 = _objectGops.f;
var isEnum = _objectPie.f;
while (aLen > index) {
var S = _iobject(arguments$1[index++]);
var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(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)
_export(_export.S + _export.F, 'Object', { assign: _objectAssign });
var assign = _core.Object.assign;
var gOPD = Object.getOwnPropertyDescriptor;
var f$3 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {
O = _toIobject(O);
P = _toPrimitive(P, true);
if (_ie8DomDefine) { try {
return gOPD(O, P);
} catch (e) { /* empty */ } }
if (_has(O, P)) { return _propertyDesc(!_objectPie.f.call(O, P), O[P]); }
};
var _objectGopd = {
f: f$3
};
// Works with __proto__ only. Old v8 can't work with null proto objects.
/* eslint-disable no-proto */
var check = function (O, proto) {
_anObject(O);
if (!_isObject(proto) && proto !== null) { throw TypeError(proto + ": can't set as prototype!"); }
};
var _setProto = {
set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
function (test, buggy, set) {
try {
set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
set(test, []);
buggy = !(test instanceof Array);
} catch (e) { buggy = true; }
return function setPrototypeOf(O, proto) {
check(O, proto);
if (buggy) { O.__proto__ = proto; }
else { set(O, proto); }
return O;
};
}({}, false) : undefined),
check: check
};
// 19.1.3.19 Object.setPrototypeOf(O, proto)
_export(_export.S, 'Object', { setPrototypeOf: _setProto.set });
var setPrototypeOf = _core.Object.setPrototypeOf;
// 19.1.3.6 Object.prototype.toString()
var test = {};
test[_wks('toStringTag')] = 'z';
if (test + '' != '[object z]') {
_redefine(Object.prototype, 'toString', function toString() {
return '[object ' + _classof(this) + ']';
}, true);
}
// 22.1.3.31 Array.prototype[@@unscopables]
var UNSCOPABLES = _wks('unscopables');
var ArrayProto$1 = Array.prototype;
if (ArrayProto$1[UNSCOPABLES] == undefined) { _hide(ArrayProto$1, UNSCOPABLES, {}); }
var _addToUnscopables = function (key) {
ArrayProto$1[UNSCOPABLES][key] = true;
};
var _iterStep = function (done, value) {
return { value: value, done: !!done };
};
// 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(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 _iterStep(1);
}
if (kind == 'keys') { return _iterStep(0, index); }
if (kind == 'values') { return _iterStep(0, O[index]); }
return _iterStep(0, [index, O[index]]);
}, 'values');
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
_iterators.Arguments = _iterators.Array;
_addToUnscopables('keys');
_addToUnscopables('values');
_addToUnscopables('entries');
var ITERATOR$4 = _wks('iterator');
var TO_STRING_TAG = _wks('toStringTag');
var ArrayValues = _iterators.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 = _objectKeys(DOMIterables), i = 0; i < collections.length; i++) {
var NAME = collections[i];
var explicit = DOMIterables[NAME];
var Collection = _global[NAME];
var proto = Collection && Collection.prototype;
var key;
if (proto) {
if (!proto[ITERATOR$4]) { _hide(proto, ITERATOR$4, ArrayValues); }
if (!proto[TO_STRING_TAG]) { _hide(proto, TO_STRING_TAG, NAME); }
_iterators[NAME] = ArrayValues;
if (explicit) { for (key in es6_array_iterator) { if (!proto[key]) { _redefine(proto, key, es6_array_iterator[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;
};
var _forOf = createCommonjsModule(function (module) {
var BREAK = {};
var RETURN = {};
var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(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 = _iterCall(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 SPECIES = _wks('species');
var _speciesConstructor = function (O, D) {
var C = _anObject(O).constructor;
var S;
return C === undefined || (S = _anObject(C)[SPECIES]) == undefined ? D : _aFunction(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 process$1 = _global.process;
var setTask = _global.setImmediate;
var clearTask = _global.clearImmediate;
var MessageChannel = _global.MessageChannel;
var Dispatch = _global.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer;
var channel;
var port;
var run = function () {
var id = +this;
// eslint-disable-next-line no-prototype-builtins
if (queue.hasOwnProperty(id)) {
var fn = queue[id];
delete queue[id];
fn();
}
};
var listener = function (event) {
run.call(event.data);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!setTask || !clearTask) {
setTask = function setImmediate(fn) {
var 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$1) == 'process') {
defer = function (id) {
process$1.nextTick(_ctx(run, id, 1));
};
// Sphere (JS game engine) Dispatch API
} else if (Dispatch && Dispatch.now) {
defer = function (id) {
Dispatch.now(_ctx(run, id, 1));
};
// Browsers with MessageChannel, includes WebWorkers
} else if (MessageChannel) {
channel = new MessageChannel();
port = channel.port2;
channel.port1.onmessage = listener;
defer = _ctx(port.postMessage, port, 1);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
defer = function (id) {
_global.postMessage(id + '', '*');
};
_global.addEventListener('message', listener, false);
// IE8-
} else if (ONREADYSTATECHANGE in _domCreate('script')) {
defer = function (id) {
_html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
_html.removeChild(this);
run.call(id);
};
};
// Rest old browsers
} else {
defer = function (id) {
setTimeout(_ctx(run, id, 1), 0);
};
}
}
var _task = {
set: setTask,
clear: clearTask
};
var macrotask = _task.set;
var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
var process$2 = _global.process;
var Promise = _global.Promise;
var isNode$1 = _cof(process$2) == 'process';
var _microtask = function () {
var head, last, notify;
var flush = function () {
var parent, fn;
if (isNode$1 && (parent = process$2.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$2.nextTick(flush);
};
// browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
} else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
var toggle = true;
var node = document.createTextNode('');
new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
notify = function () {
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if (Promise && Promise.resolve) {
var promise = Promise.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, 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)
function PromiseCapability(C) {
var resolve, reject;
this.promise = new C(function ($$resolve, $$reject) {
if (resolve !== undefined || reject !== undefined) { throw TypeError('Bad Promise constructor'); }
resolve = $$resolve;
reject = $$reject;
});
this.resolve = _aFunction(resolve);
this.reject = _aFunction(reject);
}
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 _promiseResolve = function (C, x) {
_anObject(C);
if (_isObject(x) && x.constructor === C) { return x; }
var promiseCapability = _newPromiseCapability.f(C);
var resolve = promiseCapability.resolve;
resolve(x);
return promiseCapability.promise;
};
var _redefineAll = function (target, src, safe) {
for (var key in src) { _redefine(target, key, src[key], safe); }
return target;
};
var SPECIES$1 = _wks('species');
var _setSpecies = function (KEY) {
var C = _global[KEY];
if (_descriptors && C && !C[SPECIES$1]) { _objectDp.f(C, SPECIES$1, {
configurable: true,
get: function () { return this; }
}); }
};
var task = _task.set;
var microtask = _microtask();
var PROMISE = 'Promise';
var TypeError$1 = _global.TypeError;
var process = _global.process;
var $Promise = _global[PROMISE];
var isNode = _classof(process) == 'process';
var empty = function () { /* empty */ };
var Internal;
var newGenericPromiseCapability;
var OwnPromiseCapability;
var Wrapper;
var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.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 isThenable = function (it) {
var then;
return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};
var notify = function (promise, isReject) {
if (promise._n) { return; }
promise._n = true;
var chain = promise._c;
microtask(function () {
var value = promise._v;
var ok = promise._s == 1;
var i = 0;
var run = function (reaction) {
var handler = ok ? reaction.ok : reaction.fail;
var resolve = reaction.resolve;
var reject = reaction.reject;
var domain = reaction.domain;
var result, then;
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, function () {
var value = promise._v;
var unhandled = isUnhandled(promise);
var result, handler, console;
if (unhandled) {
result = _perform(function () {
if (isNode) {
process.emit('unhandledRejection', value, promise);
} else if (handler = _global.onunhandledrejection) {
handler({ promise: promise, reason: value });
} else if ((console = _global.console) && console.error) {
console.error('Unhandled promise rejection', value);
}
});
// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
promise._h = isNode || isUnhandled(promise) ? 2 : 1;
} promise._a = undefined;
if (unhandled && result.e) { throw result.v; }
});
};
var isUnhandled = function (promise) {
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, function () {
var handler;
if (isNode) {
process.emit('rejectionHandled', promise);
} else if (handler = _global.onrejectionhandled) {
handler({ promise: promise, reason: promise._v });
}
});
};
var $reject = function (value) {
var promise = this;
if (promise._d) { return; }
promise._d = true;
promise = promise._w || promise; // unwrap
promise._v = value;
promise._s = 2;
if (!promise._a) { promise._a = promise._c.slice(); }
notify(promise, true);
};
var $resolve = function (value) {
var promise = this;
var then;
if (promise._d) { return; }
promise._d = true;
promise = promise._w || promise; // unwrap
try {
if (promise === value) { throw TypeError$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($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
} catch (e) {
$reject.call(wrapper, e);
}
});
} else {
promise._v = value;
promise._s = 1;
notify(promise, false);
}
} catch (e) {
$reject.call({ _w: promise, _d: false }, e); // wrap
}
};
// constructor polyfill
if (!USE_NATIVE) {
// 25.4.3.1 Promise(executor)
$Promise = function Promise(executor) {
_anInstance(this, $Promise, PROMISE, '_h');
_aFunction(executor);
Internal.call(this);
try {
executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
} catch (err) {
$reject.call(this, err);
}
};
// eslint-disable-next-line no-unused-vars
Internal = function Promise(executor) {
this._c = []; // <- awaiting reactions
this._a = undefined; // <- checked in isUnhandled reactions
this._s = 0; // <- state
this._d = false; // <- done
this._v = undefined; // <- value
this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
this._n = false; // <- notify
};
Internal.prototype = _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.domain : undefined;
this._c.push(reaction);
if (this._a) { this._a.push(reaction); }
if (this._s) { notify(this, false); }
return reaction.promise;
},
// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch': function (onRejected) {
return this.then(undefined, onRejected);
}
});
OwnPromiseCapability = function () {
var promise = new Internal();
this.promise = promise;
this.resolve = _ctx($resolve, promise, 1);
this.reject = _ctx($reject, promise, 1);
};
_newPromiseCapability.f = newPromiseCapability = function (C) {
return C === $Promise || C === Wrapper
? new OwnPromiseCapability(C)
: newGenericPromiseCapability(C);
};
}
_export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise });
_setToStringTag($Promise, PROMISE);
_setSpecies(PROMISE);
Wrapper = _core[PROMISE];
// statics
_export(_export.S + _export.F * !USE_NATIVE, PROMISE, {
// 25.4.4.5 Promise.reject(r)
reject: function reject(r) {
var capability = newPromiseCapability(this);
var $$reject = capability.reject;
$$reject(r);
return capability.promise;
}
});
_export(_export.S + _export.F * (_library || !USE_NATIVE), PROMISE, {
// 25.4.4.6 Promise.resolve(x)
resolve: function resolve(x) {
return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);
}
});
_export(_export.S + _export.F * !(USE_NATIVE && _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.
*/
/* 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 = 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(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];
}
}
/**
* A flag to distinguish with other events with the same name generated
* by another library in the same page.
*/
event._for = 'weex';
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, true);
docEl.addEventListener('touchend', touchendHandler, true);
docEl.addEventListener('touchcancel', touchcancelHandler, true);
}
// 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(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(getCommonAncestor(elements[0], elements[1]), 'dualtouchstart', {
touches: slice.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(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(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(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(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', {
touches: slice.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();
// fire click, not tap.
fireEvent(gesture.element, 'weex$tap', {
touch: touch,
touchEvent: event
});
if (lastTap && gesture.timestamp - lastTap.timestamp < 300) {
fireEvent(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(gesture.element, 'panend', extra);
if (isSwipe) {
fireEvent(gesture.element, 'swipe', extra);
}
}
if (gesture.status === 'pressing') {
fireEvent(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(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', {
touches: slice.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(gesture.element, 'panend', {
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event
});
}
if (gesture.status === 'pressing') {
fireEvent(gesture.element, 'pressend', {
touch: touch,
touchEvent: event
});
}
delete gestures[id];
}
if (Object.keys(gestures).length === 0) {
docEl.removeEventListener('touchmove', touchmoveHandler, true);
docEl.removeEventListener('touchend', touchendHandler, true);
docEl.removeEventListener('touchcancel', touchcancelHandler, true);
}
}
if (!isInitialized) {
docEl.addEventListener('touchstart', touchstartHandler, true);
isInitialized = true;
}
var lib$2 = window.lib || (window.lib = {});
/**
* Version class.
* @class lib.env~Version
* @param {String} v - version number.
*/
function Version (v) {
Object.defineProperty(this, 'val', {
value: v.toString(),
enumerable: true
});
/**
* larger than
* @method gt
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.gt = function (v) {
return Version.compare(this, v) > 0
};
/**
* larger than or equal to.
* @method gte
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.gte = function (v) {
return Version.compare(this, v) >= 0
};
/**
* less than.
* @method lt
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.lt = function (v) {
return Version.compare(this, v) < 0
};
/**
* less than or equal to.
* @method lte
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.lte = function (v) {
return Version.compare(this, v) <= 0
};
/**
* equal to.
* @method eq
* @param {String} v - version
* @return {Boolean} equal to
* @instance
* @memberof Version
*/
this.eq = function (v) {
return Version.compare(this, v) === 0
};
}
/**
* version number string.
* @method toString
* @return {String} current version number string.
* @instance
* @memberof Version
*/
Version.prototype.toString = function () {
return this.val
};
/**
* return current version number.
* @method valueOf
* @return {Boolean} version number
* @instance
* @memberof Version
*/
Version.prototype.valueOf = function () {
var v = this.val.split('.');
var r = [];
for (var i = 0; i < v.length; i++) {
var n = parseInt(v[i], 10);
if (isNaN(n)) {
n = 0;
}
var s = n.toString();
if (s.length < 5) {
s = Array(6 - s.length).join('0') + s;
}
r.push(s);
if (r.length === 1) {
r.push('.');
}
}
return parseFloat(r.join(''))
};
/**
* compare two versions.
* @method compare
* @param {String} v1 - version1
* @param {String} v2 - version2
* @return {Number} 0 for equality,-1 for less than,1 for larger than.
* @memberof Version
*/
Version.compare = function (v1, v2) {
v1 = v1.toString().split('.');
v2 = v2.toString().split('.');
for (var i = 0; i < v1.length || i < v2.length; i++) {
var n1 = parseInt(v1[i], 10);
var n2 = parseInt(v2[i], 10);
if (window.isNaN(n1)) {
n1 = 0;
}
if (window.isNaN(n2)) {
n2 = 0;
}
if (n1 < n2) {
return -1
}
else if (n1 > n2) {
return 1
}
}
return 0
};
/**
* 解析和操作版本号
* @method version
* @param {string} v - 需要解析的版本号
* @return {lib.env~Version} Verson实例
* @memberof lib
*/
lib$2.version = function (v) {
return new Version(v)
};
var lib$3 = window.lib || (window.lib = {});
var env$1 = lib$3.env || (lib$3.env = {});
var search = window.location.search.replace(/^\?/, '');
env$1.params = {};
if (search) {
var params = search.split('&');
for (var i$1 = 0; i$1 < params.length; i$1++) {
params[i$1] = params[i$1].split('=');
try {
env$1.params[params[i$1][0]] = decodeURIComponent(params[i$1][1]);
}
catch (e) {
env$1.params[params[i$1][0]] = params[i$1][1];
}
}
}
var lib$1 = window.lib || (window.lib = {});
var env = lib$1.env || (lib$1.env = {});
var ua = window.navigator.userAgent;
var match;
/**
* os
*/
match = ua.match(/Windows\sPhone\s(?:OS\s)?([\d.]+)/);
if (match) {
/**
* @type {Object}
* @memberof lib.env
* @property {String} name - os name, e.g. Android/AndroidPad/iPhone/iPod/iPad/Windows Phone/unknown, etc.
* @property {lib.env~Version} version - os version.
* @property {Boolean} isWindowsPhone
* @property {Boolean} isIPhone - is iPhone/iTouch
* @property {Boolean} isIPad
* @property {Boolean} isIOS
* @property {Boolean} isAndroid
* @property {Boolean} isAndroidPad
*/
env.os = {
name: 'Windows Phone',
isWindowsPhone: true,
version: match[1]
};
}
else if (!!ua.match(/Safari/) && (match = ua.match(/Android[\s/]([\d.]+)/))) {
env.os = {
version: match[1]
};
if ((ua.match(/Mobile\s+Safari/))) {
env.os.name = 'Android';
env.os.isAndroid = true;
}
else {
env.os.name = 'AndroidPad';
env.os.isAndroidPad = true;
}
}
else if ((match = ua.match(/(iPhone|iPad|iPod)/))) {
var name = match[1];
match = ua.match(/OS ([\d_.]+) like Mac OS X/);
env.os = {
name: name,
isIPhone: (name === 'iPhone' || name === 'iPod'),
isIPad: name === 'iPad',
isIOS: true,
version: match && match[1].split('_').join('.') || ''
};
}
else {
env.os = {
name: 'unknown',
version: '0.0.0'
};
}
if (lib$1.version) {
env.os.version = lib$1.version(env.os.version);
}
/**
* browser
*/
match = ua.match(/(?:UCWEB|UCBrowser\/)([\d.]+)/);
if (match) {
/**
* @type {Object}
* @memberof env
* @property {String} name - browser name,e.g. UC/QQ/Firefox/Chrome/Android/Safari/iOS Webview/Chrome Webview/IE/IEMobile/unknown, etc.
* @property {env~Version} version - browser version.
* @property {Boolean} isUC
* @property {Boolean} isQQ
* @property {Boolean} isIE
* @property {Boolean} isIEMobile
* @property {Boolean} isIELikeWebkit
* @property {Boolean} isChrome
* @property {Boolean} isAndroid
* @property {Boolean} isSafari
* @property {Boolean} isWebview
*/
env.browser = {
name: 'UC',
isUC: true,
version: match[1]
};
}
else if ((match = ua.match(/MQQBrowser\/([\d.]+)/))) {
env.browser = {
name: 'QQ',
isQQ: true,
version: match[1]
};
}
else if ((match = ua.match(/Firefox\/([\d.]+)/))) {
env.browser = {
name: 'Firefox',
isFirefox: true,
version: match[1]
};
}
else if ((match = ua.match(/MSIE\s([\d.]+)/))
|| (match = ua.match(/IEMobile\/([\d.]+)/))) {
env.browser = {
version: match[1]
};
if (ua.match(/IEMobile/)) {
env.browser.name = 'IEMobile';
env.browser.isIEMobile = true;
}
else {
env.browser.name = 'IE';
env.browser.isIE = true;
}
if (ua.match(/Android|iPhone/)) {
env.browser.isIELikeWebkit = true;
}
}
else if ((match = ua.match(/(?:Chrome|CriOS)\/([\d.]+)/))) {
env.browser = {
name: 'Chrome',
isChrome: true,
version: match[1]
};
if (ua.match(/Version\/[\d+.]+\s*Chrome/)) {
env.browser.name = 'Chrome Webview';
env.browser.isWebview = true;
}
}
else if (!!ua.match(/Safari/) && (match = ua.match(/Android[\s/]([\d.]+)/))) {
env.browser = {
name: 'Android',
isAndroid: true,
version: match[1]
};
}
else if (ua.match(/iPhone|iPad|iPod/)) {
if (ua.match(/Safari/)) {
match = ua.match(/Version\/([\d.]+)/);
env.browser = {
name: 'Safari',
isSafari: true,
version: match && match[1] || ''
};
}
else {
match = ua.match(/OS ([\d_.]+) like Mac OS X/);
env.browser = {
name: 'iOS Webview',
isWebview: true,
version: match && match[1].replace(/_/g, '.') || ''
};
}
}
else {
env.browser = {
name: 'unknown',
version: '0.0.0'
};
}
if (lib$1.version) {
env.browser.version = lib$1.version(env.browser.version);
}
/*
* 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 toString$1 = Object.prototype.toString;
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*
* @param {*} obj
* @return {Boolean}
*/
var OBJECT_STRING = '[object Object]';
function isPlainObject (obj) {
return toString$1.call(obj) === OBJECT_STRING
}
var ARRAY_STRING = '[object Array]';
function isArray (arr) {
return toString$1.call(arr) === ARRAY_STRING
}
function isPrimitive (val) {
return typeof value === 'string'
|| typeof value === 'number'
|| typeof value === 'symbol'
|| typeof value === 'boolean'
}
function isDef (val) {
return val !== undefined && val !== 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.
*/
/**
* Mix properties into target object.
* the rightest object's value has the highest priority.
*/
function extend (to) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
if (!args || args.length <= 0) {
return to
}
args.forEach(function (from) {
if (typeof from !== 'object') {
return
}
for (var key in from) {
to[key] = from[key];
}
});
return to
}
/**
* Mix truthy or '' property values into target object.
* mostly for merging styles. (that's why '' is falsy but still should be counted in.)
* the rightest object's value has the highest priority.
*/
function extendTruthy (to) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
if (!args || args.length <= 0) {
return to
}
args.forEach(function (from) {
if (typeof from !== 'object') {
return
}
var i;
for (var key in from) {
if (((i = from[key]) || i === '' || i === 0) && i !== 'undefined') {
to[key] = i;
}
}
});
return to
}
/**
* Mix specified properties into target object.
*/
function extendKeys (to, from, keys) {
if ( from === void 0 ) from = {};
(keys || []).forEach(function (key) {
from && (to[key] = from[key]);
});
return to
}
/**
* Extract specified properties from src to target object.
*/
function extractKeys (to, from, keys) {
if ( from === void 0 ) from = {};
if (!from) {
return to
}
(keys || []).forEach(function (key) {
from && (to[key] = from[key]);
from && (delete from[key]);
});
return to
}
/**
* 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)
}
}
/**
* Only call the func the last time before it's not that frequently called.
*/
function debounce (func, wait) {
var timerId;
return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
clearTimeout(timerId);
timerId = setTimeout(function later () {
timerId = null;
func.apply(null, args);
}, wait);
}
}
/**
* Only call the func the first time before a series frequently function calls happen.
*/
function depress (func, wait) {
var timerId;
function later () {
timerId = null;
}
return function () {
if (!timerId) {
func.apply();
}
clearTimeout(timerId);
timerId = setTimeout(later, wait);
}
}
/**
* Only call the func every time after a wait milliseconds if it's too frequently called.
*/
function throttle (func, wait, callLastTime) {
var last = 0;
var lastTimer = null;
var lastTimeDuration = wait + (wait > 25 ? wait : 25); // plus half wait time.
return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var context = this;
var time = new Date().getTime();
if (time - last > wait) {
if (callLastTime) {
lastTimer && clearTimeout(lastTimer);
lastTimer = setTimeout(function () {
lastTimer = null;
func.apply(context, args);
}, lastTimeDuration);
}
func.apply(context, args);
last = time;
}
}
}
// 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)
}
/**
* 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-delmited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) { return c.toUpperCase(); })
});
function camelizeKeys (obj) {
var res = {};
for (var key in obj) {
res[camelize(key)] = obj[key];
}
return res
}
/**
* 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()
});
function hyphenateKeys (obj) {
var res = {};
for (var key in obj) {
res[hyphenate(key)] = obj[key];
}
return res
}
var vendorsReg = /webkit-|moz-|o-|ms-/;
function hyphenateStyleKeys (obj) {
var res = {};
for (var key in obj) {
var hk = hyphenate(key).replace(vendorsReg, function ($0) {
return '-' + $0
});
res[hk] = obj[key];
}
return res
}
function camelToKebab (name) {
if (!name) {
return ''
}
return name.replace(/([A-Z])/g, function (g, g1) {
return ("-" + (g1.toLowerCase()))
})
}
function appendCss (css, cssId, replace) {
var style = document.getElementById(cssId);
if (style && replace) {
style.parentNode.removeChild(style);
style = null;
}
if (!style) {
style = document.createElement('style');
style.type = 'text/css';
cssId && (style.id = cssId);
document.getElementsByTagName('head')[0].appendChild(style);
}
style.appendChild(document.createTextNode(css));
}
function nextFrame (callback) {
var runner = window.requestAnimationFrame
|| window.webkitRequestAnimationFrame
|| window.mozRequestAnimationFrame
|| (function (cb) { return setTimeout(cb, 16); });
runner(callback);
}
function toCSSText (object) {
if (!object) {
return
}
var obj = hyphenateStyleKeys(object);
var cssText = '';
for (var key in obj) {
cssText += key + ":" + (obj[key]) + ";";
}
return cssText
}
/*
* 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.
*/
/**
* viewport priority:
*
* 1. meta weex-viewport (developer custom)
* 2. setViewport(config) := config.width (private code) @deprecated
* 3. 750 (buid time)
*
*/
var isInited = false;
var DEFAULT_VIEWPORT_WIDTH = 750;
/**
* get viewport width from weex-viewport meta.
*/
var envViewportWidth = parseInt(750);
var width = !isNaN(envViewportWidth) && envViewportWidth > 0
? envViewportWidth
: DEFAULT_VIEWPORT_WIDTH;
var wxViewportMeta = document.querySelector('meta[name="weex-viewport"]');
var metaWidth = wxViewportMeta && parseInt(wxViewportMeta.getAttribute('content'));
if (metaWidth && !isNaN(metaWidth) && metaWidth > 0) {
width = metaWidth;
}
var dpr = 0;
var screenWidth = 0;
var screenHeight = 0;
var info = {
dpr: dpr,
scale: 0,
rootValue: 0,
rem: 0,
deviceWidth: 0,
deviceHeight: 0
};
/**
* set root font-size for rem units. If already been set, just skip this.
*/
function setRootFont (width, viewportWidth, force) {
var doc = window.document;
var rem = width * 750 / viewportWidth / 10;
if (!doc.documentElement) { return }
var rootFontSize = doc.documentElement.style.fontSize;
if (!rootFontSize || force) {
doc.documentElement.style.fontSize = rem + 'px';
}
info.rem = rem;
info.rootValue = viewportWidth / 10;
}
function setMetaViewport (width) {
if (!wxViewportMeta) {
wxViewportMeta = document.createElement('meta');
wxViewportMeta.setAttribute('name', 'weex-viewport');
var firstMeta = document.querySelector('meta');
var head = firstMeta && firstMeta.parentElement
|| document.documentElement.children[0];
firstMeta
? head.insertBefore(wxViewportMeta, firstMeta)
: head.appendChild(wxViewportMeta);
}
else {
var metaWidth = parseInt(wxViewportMeta.getAttribute('content'));
if (metaWidth === width) {
return
}
}
wxViewportMeta.setAttribute('content', width + '');
}
/**
* export viewport info.
*/
function init$1 (viewportWidth) {
if ( viewportWidth === void 0 ) viewportWidth = width;
if (!isInited) {
isInited = true;
var doc = window.document;
if (!doc) {
console.error('[vue-render] window.document is undfined.');
return
}
if (!doc.documentElement) {
console.error('[vue-render] document.documentElement is undfined.');
return
}
dpr = info.dpr = window.devicePixelRatio;
screenWidth = doc.documentElement.clientWidth;
screenHeight = doc.documentElement.clientHeight;
var resetDeviceHeight = function () {
screenHeight = doc.documentElement.clientHeight;
var env = window.weex && window.weex.config.env;
info.deviceHeight = env.deviceHeight = screenHeight * dpr;
};
// set root font for rem.
setRootFont(screenWidth, viewportWidth);
setMetaViewport(viewportWidth);
window.addEventListener('resize', resetDeviceHeight);
/**
* why not to use window.screen.width to get screenWidth ? Because in some
* old webkit browser on android system it get the device pixel width, which
* is the screenWidth multiply by the device pixel ratio.
* e.g. ip6 -> get 375 for virtual screen width.
*/
var scale = screenWidth / viewportWidth;
/**
* 1. if set initial/maximum/mimimum-scale some how the page will have a bounce
* effect when user drag the page towards horizontal axis.
* 2. Due to compatibility reasons, not to use viewport meta anymore.
* 3. viewport meta should always be:
* <meta name="viewport"
* content="width=device-width,
* initial-scale=1,
* maximum-scale=1,
* user-scalable=no" />
*/
extend(info, {
scale: scale,
rootValue: viewportWidth / 10,
deviceWidth: screenWidth * dpr,
deviceHeight: screenHeight * dpr
});
}
return info
}
/**
* reset viewport width and scale.
* @return new scale.
*/
function resetViewport (viewportWidth) {
setRootFont(screenWidth, viewportWidth, true);
setMetaViewport(viewportWidth);
var newScale = screenWidth / viewportWidth;
info.scale = newScale;
return newScale
}
/*
* 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 extend$1 (to) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
if (!args || args.length <= 0) { return to }
args.forEach(function (from) {
if (typeof from !== 'object') { return }
for (var key in from) {
to[key] = from[key];
}
});
return to
}
// if support passive event listeners.
var _supportsPassive = false;
try {
document.createElement('div').addEventListener('test', function (_) {}, {
get passive () {
_supportsPassive = true;
}
});
}
catch (e) {
// do nothing.
}
function supportsPassive () {
return _supportsPassive
}
/**
* Create Event.
* @param {DOMString} type
* @param {Object} props
*/
function createEvent (target, type, props) {
var event = new Event(type, { bubbles: false });
extend$1(event, props);
// phantomjs don't support customer event
if (window.navigator.userAgent.toLowerCase().indexOf('phantomjs') !== -1) {
return event
}
try {
Object.defineProperty(event, 'target', {
enumerable: true,
value: target
});
}
catch (err) {
return extend$1({}, event, { target: target })
}
return event
}
/**
* Create a bubbable Event.
* @param {DOMString} type
* @param {Object} props
*/
function createBubblesEvent (target, type, props) {
var event = new Event(type, { bubbles: true });
extend$1(event, props);
// phantomjs don't support customer event
if (window.navigator.userAgent.toLowerCase().indexOf('phantomjs') !== -1) {
return event
}
try {
Object.defineProperty(event, 'target', {
enumerable: true,
value: target
});
}
catch (err) {
return extend$1({}, event, { target: target })
}
return event
}
/**
* Create Custom Event.
* @param {DOMString} type
* @param {Object} props
*/
function createCustomEvent (target, type, props) {
// compatibility: http://caniuse.com/#search=customevent
// const event = new CustomEvent(type)
var event = document.createEvent('CustomEvent');
event.initCustomEvent(type, false, true, {});
// event.preventDefault()
// event.stopPropagation()
extend$1(event, props);
// event.target is readonly
try {
Object.defineProperty(event, 'target', {
enumerable: true,
value: target || null
});
}
catch (err) {
return extend$1({}, event, { target: target || null })
}
return event
}
/**
* dispatch a event on a HTML element.
* @param {HTMLElement} elm
* @param {Event} type event name.
* @param {Object} data extra data.
*/
function dispatchNativeEvent (elm, type, data) {
elm.dispatchEvent(createEvent(elm, type, data));
}
function mapFormEvents (context) {
var eventMap = {};['input', 'change', 'focus', 'blur', 'return'].forEach(function (type) {
eventMap[type] = function (event) {
if (context.$el) {
event.value = context.$el.value;
// for the sake of v-model, a input event must be emitted.
if (type === 'input') {
context.$emit(type, event);
}
}
};
});
return eventMap
}
/*
* 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 scaleStyles = [
'width',
'height',
'left',
'right',
'top',
'bottom',
'border',
'borderRadius',
'borderWidth',
'borderLeft',
'borderRight',
'borderTop',
'borderBottom',
'borderLeftWidth',
'borderRightWidth',
'borderTopWidth',
'borderBottomWidth',
'margin',
'marginLeft',
'marginRight',
'marginTop',
'marginBottom',
'padding',
'paddingLeft',
'paddingRight',
'paddingTop',
'paddingBottom',
'fontSize',
'lineHeight',
'transform',
'webkitTransform',
'WebkitTransform',
'mozTransform',
'MozTransform',
'itemSize'
];
var vendorReg = /webkit|moz/i;
function hyphen (key) {
return hyphenate(key.replace(vendorReg, function ($0) {
return ("-" + ($0.toLowerCase()) + "-")
}))
}
function getAllStyles () {
return Object.keys(scaleStyles.reduce(function (pre, key) {
pre[key] = 1;
pre[hyphen(key)] = 1;
return pre
}, {}))
}
var allStyles = getAllStyles();
var config = {
scrollableTypes: ['scroller', 'list', 'waterfall', 'recycle-list'],
gestureEvents: [
'panstart',
'panmove',
'panend',
'swipe',
'longpress',
'tap'
],
// these components should not bind events with .native.
weexBuiltInComponents: [
'div',
'container',
'text',
'image',
'gif',
'img',
'cell',
'a'
],
bindingStyleNamesForPx2Rem: allStyles
};
/*
* 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.
*/
/**
* whether ct contains el.
* @param {HTMLElement} container
* @param {HTMLElement} target
*/
function contains (container, target, includeSelf) {
if (includeSelf && container === target) {
return true
}
return container.contains
? container.contains(target) && (container !== target)
: container.compareDocumentPosition(target) & 16 !== 0
}
function insideA (el) {
if (typeof el._insideA === 'boolean') {
return el._insideA
}
var parent = el.parentElement;
var parents = [];
var checkParents = function (inside) {
for (var i = 0, l = parents.length; i < l; i++) {
parents[i]._insideA = inside;
}
};
var check = function (inside) {
el._insideA = inside;
checkParents(inside);
return inside
};
while (parent !== document.body) {
if (parent.tagName.toLowerCase() === 'a') {
return check(true)
}
if (typeof parent._insideA === 'boolean') {
return check(parent._insideA)
}
parents.push(parent);
parent = parent.parentElement;
}
return check(false)
}
/**
* get parent scroller vComponent.
* return a VueComponent or null.
*/
function getParentScroller (vm) {
if (!vm) { return null }
if (vm._parentScroller) {
return vm._parentScroller
}
function _getParentScroller (parent) {
if (!parent) { return }
if (config.scrollableTypes.indexOf(parent.weexType) > -1) {
vm._parentScroller = parent;
return parent
}
return _getParentScroller(parent.$parent)
}
return _getParentScroller(vm.$parent)
}
/**
* get scroller's element.
* @param vm {HTMLElement | VueCOmponent} vm or element.
* return the element or document.body.
*/
function getParentScrollerElement (vm) {
if (!vm) { return null }
var el = vm instanceof HTMLElement ? vm : vm.$el;
if (!el || el.nodeType !== 1) { return }
if (vm._parentScroller) {
return vm._parentScroller
}
function _getParentScroller (parent) {
if (!parent) { return }
var tagName = parent.tagName.toLowerCase();
if (tagName === 'body'
|| (tagName === 'main'
&& config.scrollableTypes.indexOf(parent.getAttribute('weex-type')) > -1)
) {
vm._parentScroller = parent;
return parent
}
return _getParentScroller(parent.parentElement)
}
return _getParentScroller(el)
}
function horizontalBalance (rect, ctRect) {
return rect.left < ctRect.right && rect.right > ctRect.left
}
function verticalBalance (rect, ctRect) {
return rect.top < ctRect.bottom && rect.bottom > ctRect.top
}
/**
* return a data array with two boolean value, which are:
* 1. visible in current ct's viewport.
* 2. visible with offset in current ct's viewport.
*/
function hasIntersection (rect, ctRect, dir, offset) {
dir = dir || 'up';
var isHorizontal = dir === 'left' || dir === 'right';
var isVertical = dir === 'up' || dir === 'down';
if (isHorizontal && !verticalBalance(rect, ctRect)) {
return [false, false]
}
if (isVertical && !horizontalBalance(rect, ctRect)) {
return [false, false]
}
offset = offset ? parseInt(offset) * weex.config.env.scale : 0;
switch (dir) {
case 'up':
return [
rect.top < ctRect.bottom && rect.bottom > ctRect.top,
rect.top < ctRect.bottom + offset && rect.bottom > ctRect.top - offset
]
case 'down':
return [
rect.bottom > ctRect.top && rect.top < ctRect.bottom,
rect.bottom > ctRect.top - offset && rect.top < ctRect.bottom + offset
]
case 'left':
return [
rect.left < ctRect.right && rect.right > ctRect.left,
rect.left < ctRect.right + offset && rect.right > ctRect.left - offset
]
case 'right':
return [
rect.right > ctRect.left && rect.left < ctRect.right,
rect.right > ctRect.left - offset && rect.left < ctRect.right + offset
]
}
}
/**
* isElementVisible
* @param {HTMLElement} el a dom element.
* @param {HTMLElement} container optional, the container of this el.
*/
function isElementVisible (el, container, dir, offset) {
if (!el.getBoundingClientRect) { return false }
var bodyRect = {
top: 0,
left: 0,
bottom: window.innerHeight,
right: window.innerWidth
};
var ctRect = (container === window || container === document.body)
? bodyRect : container
? container.getBoundingClientRect() : bodyRect;
return hasIntersection(el.getBoundingClientRect(), ctRect, dir, offset)
}
// to trigger the appear/disappear event.
function triggerAppearEvent (elm, evt, dir) {
dispatchNativeEvent(elm, evt, {
direction: dir
});
}
/**
* get all event listeners. including bound handlers in all parent vnodes.
*/
function getEventHandlers (context) {
var vnode = context.$vnode;
var handlers = {};
var attachedVnodes = [];
while (vnode) {
attachedVnodes.push(vnode);
vnode = vnode.parent;
}
attachedVnodes.forEach(function (vnode) {
var parentListeners = vnode.componentOptions && vnode.componentOptions.listeners;
var dataOn = vnode.data && vnode.data.on;
extend(handlers, parentListeners, dataOn);
});
return handlers
}
function getAppearOffset (el) {
return el && el.getAttribute('appear-offset')
}
function updateWatchAppearList (container) {
container._watchAppearList = Array.prototype.slice.call(
container.querySelectorAll('[weex-appear]'));
}
/**
* inject removeChild function to watch disappear and offsetDisappear events.
*/
if (!window._rmInjected) {
window._rmInjected = true;
var nativeRemove = HTMLElement.prototype.removeChild;
HTMLElement.prototype.removeChild = function (el) {
el._visible && triggerAppearEvent(el, 'disappear', null);
el._offsetVisible && triggerAppearEvent(el, 'offsetDisappear', null);
nativeRemove.apply(this, arguments);
};
}
/**
* Watch element's visibility to tell whether should trigger a appear/disappear
* event in scroll handler.
*/
function watchAppear (context, fireNow) {
var el = context && context.$el;
if (!el || el.nodeType !== 1) { return }
var isWindow = false;
var container = getParentScrollerElement(context);
if (!container) {
return
}
if (container === document.body) {
isWindow = true;
}
/**
* Code below will only exec once for binding scroll handler for parent container.
*/
var scrollHandler = container._scrollHandler;
if (!scrollHandler) {
scrollHandler = container._scrollHandler = function (event$$1) {
updateWatchAppearList(container);
/**
* detect scrolling direction.
* direction only support up & down yet.
* TODO: direction support left & right.
*/
var scrollTop = isWindow ? window.pageYOffset : container.scrollTop;
var preTop = container._lastScrollTop;
container._lastScrollTop = scrollTop;
var dir = (scrollTop < preTop
? 'down' : scrollTop > preTop
? 'up' : container._prevDirection) || null;
container._prevDirection = dir;
var watchAppearList = container._watchAppearList || [];
var len = watchAppearList.length;
for (var i = 0; i < len; i++) {
var el = watchAppearList[i];
var appearOffset = getAppearOffset(el);
var visibleData = isElementVisible(el, container, dir, appearOffset);
detectAppear(el, visibleData, dir);
}
};
container.addEventListener('scroll', throttle(scrollHandler, 100, true));
}
if (fireNow) {
context.$nextTick(scrollHandler);
}
}
/**
* decide whether to trigger a appear/disappear event.
* @param {VueComponent} context
* @param {boolean} visible
* @param {string} dir
*/
function detectAppear (el, visibleData, dir, appearOffset) {
if ( dir === void 0 ) dir = null;
if (!el) { return }
var visible = visibleData[0];
var offsetVisible = visibleData[1];
/**
* No matter it's binding appear/disappear or both of them. Always
* should test it's visibility and change the el._visible.
* If neigher has been bound, then ignore it.
*/
/**
* if the component hasn't appeared for once yet, then it shouldn't trigger
* a disappear event at all.
*/
if (el._appearedOnce || visible) {
if (el._visible !== visible) {
el._visible = visible;
if (visible && !el._appearedOnce) {
el._appearedOnce = true;
}
var evtName = visible ? 'appear' : 'disappear';
if (el.getAttribute(("data-evt-" + evtName)) === '') {
triggerAppearEvent(el, evtName, dir);
}
}
}
if (el._offsetAppearedOnce || offsetVisible) {
if (el._offsetVisible !== offsetVisible) {
el._offsetVisible = offsetVisible;
if (offsetVisible && !el._offsetAppearedOnce) {
el._offsetAppearedOnce = true;
}
var evt = offsetVisible ? ['offset-appear', 'offsetAppear'] : ['offset-disappear', 'offsetDisappear'];
if (el.getAttribute(("data-evt-" + (evt[0]))) === '') {
triggerAppearEvent(el, evt[1], dir);
}
}
}
}
/*
* 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 lazyloadAttr = 'data-img-src';
var placeholderAttr = 'placeholder';
function preLoadImg (src,
loadCallback,
errorCallback) {
var img = new Image();
img.onload = loadCallback ? loadCallback.bind(img) : null;
img.onerror = errorCallback ? errorCallback.bind(img) : null;
img.src = src;
}
function applySrc (item, src, placeholderSrc) {
if (!src) { return }
function finallCb () {
delete item._src_loading;
}
if (window._processImgSrc) {
src = window._processImgSrc(src, item);
if (placeholderSrc) {
placeholderSrc = window._processImgSrc(placeholderSrc, item);
}
}
if (item._src_loading === src) {
return
}
/**
* 1. apply src immediately in case javscript blocks the image loading
* before next tick.
*/
item.style.backgroundImage = "url(" + (src || '') + ")";
item.removeAttribute(lazyloadAttr);
/**
* 2. then load the img src with Image constructor (but would not post
* a request again), just to trigger the load event.
*/
item._src_loading = src;
preLoadImg(src, function (evt) {
item.style.backgroundImage = "url(" + (src || '') + ")";
var ref = this;
var naturalWidth = ref.width;
var naturalHeight = ref.height;
var params = {
success: true,
size: { naturalWidth: naturalWidth, naturalHeight: naturalHeight }
};
dispatchNativeEvent(item, 'load', params);
finallCb();
}, function (evt) {
var params = {
success: false,
size: { naturalWidth: 0, naturalHeight: 0 }
};
dispatchNativeEvent(item, 'load', params);
if (placeholderSrc) {
preLoadImg(placeholderSrc, function () {
item.style.backgroundImage = "url(" + (placeholderSrc || '') + ")";
});
}
finallCb();
});
}
function getCtScroller (el) {
if (!el) { return }
var scroller = el._ptScroller;
if (!scroller) {
var pt = el.parentElement;
while (pt && pt !== document.body) {
if ((pt.className + '' || '').match(/weex-list|weex-scroller|weex-waterfall/)) {
scroller = pt;
break
}
pt = pt.parentElement;
}
scroller = pt;
el._ptScroller = pt;
}
return scroller
}
function fireLazyload (el, ignoreVisibility) {
if (Array.isArray(el)) {
return el.forEach(function (ct) { return fireLazyload(ct); })
}
el = el || document.body;
if (!el) { return }
var imgs = (el || document.body).querySelectorAll(("[" + lazyloadAttr + "]"));
if (el.getAttribute(lazyloadAttr)) { imgs = [el]; }
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
if (typeof ignoreVisibility === 'boolean' && ignoreVisibility) {
applySrc(img, img.getAttribute(lazyloadAttr), img.getAttribute(placeholderAttr));
}
else if (isElementVisible(img, getCtScroller(el))[0]) {
applySrc(img, img.getAttribute(lazyloadAttr), img.getAttribute(placeholderAttr));
}
}
}
/**
* cache a throttle lazyload function for every container element
* once for different wait times separate.
* the architecture of this cache:
* cache: {
* el.id: {
* wait: throttledFunction () { ... }
* }
* }
*/
var cache = {};
var _uid$2 = 1;
function getThrottleLazyload (wait, el) {
if ( wait === void 0 ) wait = 16;
if ( el === void 0 ) el = document.body;
var id = +(el && el.dataset.throttleId);
if (isNaN(id) || id <= 0) {
id = _uid$2++;
el && el.setAttribute('data-throttle-id', id + '');
}
!cache[id] && (cache[id] = {});
var throttled = cache[id][wait] ||
(cache[id][wait] = throttle(
fireLazyload.bind(this, el),
parseFloat(wait),
// true for callLastTime.
// to trigger once more time after the last throttled function called with a little more delay.
true)
);
return throttled
}
/*
* 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 bindingStyleNamesForPx2Rem = config.bindingStyleNamesForPx2Rem;
// whether to support using 0.5px to paint 1px width border.
var _supportHairlines;
function supportHairlines () {
if (typeof _supportHairlines === 'undefined') {
var dpr = window.devicePixelRatio;
if (dpr && dpr >= 2 && document.documentElement) {
var docElm = document.documentElement;
var testElm = document.createElement('div');
var fakeBody = document.createElement('body');
var beforeNode = docElm.firstElementChild || docElm.firstChild;
testElm.style.border = '0.5px solid transparent';
fakeBody.appendChild(testElm);
docElm.insertBefore(fakeBody, beforeNode);
_supportHairlines = testElm.offsetHeight === 1;
docElm.removeChild(fakeBody);
}
else {
_supportHairlines = false;
}
}
return _supportHairlines
}
var support = null;
function supportSticky () {
if (support !== null) {
return support
}
var element = window.document.createElement('div');
var elementStyle = element.style;
elementStyle.cssText = 'position:-webkit-sticky;position:sticky;';
support = elementStyle.position.indexOf('sticky') !== -1;
return support
}
/**
* get transformObj
*/
function getTransformObj (elm) {
var styleObj = {};
if (!elm) { return styleObj }
var transformStr = elm.style.webkitTransform
|| elm.style.mozTransform
|| elm.style.transform;
if (transformStr && transformStr.match(/(?: *(?:translate|rotate|scale)[^(]*\([^(]+\))+/i)) {
styleObj = transformStr.trim().replace(/, +/g, ',').split(' ').reduce(function (pre, str) {
['translate', 'scale', 'rotate'].forEach(function (name) {
if (new RegExp(name, 'i').test(str)) {
pre[name] = str;
}
});
return pre
}, {});
}
return styleObj
}
/**
* translate a transform string from a transformObj.
*/
function getTransformStr (obj) {
return Object.keys(obj).reduce(function (pre, key) {
return pre + obj[key] + ' '
}, '')
}
/**
* add transform style to element.
* @param {HTMLElement} elm
* @param {object} style: transform object, format is like this:
* {
* translate: 'translate3d(2px, 2px, 2px)',
* scale: 'scale(0.2)',
* rotate: 'rotate(30deg)'
* }
* @param {boolean} replace: whether to replace all transform properties.
*/
function addTransform (elm, style, replace) {
if (!style) { return }
var styleObj = {};
if (!replace) {
styleObj = getTransformObj(elm);
}
for (var key in style) {
var val = style[key];
if (val) {
styleObj[key] = val;
}
}
var resStr = getTransformStr(styleObj);
elm.style.webkitTransform = resStr;
elm.style.mozTransform = resStr;
elm.style.transform = resStr;
}
/**
* copy a transform behaviour from one element to another.
* key could be: 'translate' | 'scale' | 'rotate'
*/
function copyTransform (from, to, key) {
var str;
if (!key) {
str = from.style.webkitTransform
|| from.style.mozTransform
|| from.style.transform;
}
else {
var fromObj = getTransformObj(from);
if (!fromObj[key]) { return }
var toObj = getTransformObj(to);
toObj[key] = fromObj[key];
str = getTransformStr(toObj);
}
to.style.webkitTransform = str;
to.style.mozTransform = str;
to.style.transform = str;
}
/**
* get color's r, g, b value.
* @param {string} color support all kinds of value of color.
*/
function getRgb (color) {
var haxReg = /#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/;
var rgbReg = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/;
var span = document.createElement('span');
var body = document.body;
span.style.cssText = "color: " + color + "; width: 0px; height: 0px;";
body && body.appendChild(span);
color = window.getComputedStyle(span).color + '';
body && body.removeChild(span);
var match;
match = color.match(haxReg);
if (match) {
return {
r: parseInt(match[1], 16),
g: parseInt(match[2], 16),
b: parseInt(match[3], 16)
}
}
match = color.match(rgbReg);
if (match) {
return {
r: parseInt(match[1]),
g: parseInt(match[2]),
b: parseInt(match[3])
}
}
}
/**
* get style sheet with owner node's id
* @param {string} id owner node id.
*/
function getStyleSheetById (id) {
if (!id) { return }
var styleSheets = document.styleSheets;
var len = styleSheets.length;
for (var i = 0; i < len; i++) {
var styleSheet = styleSheets[i];
if (styleSheet.ownerNode.id === id) {
return styleSheet
}
}
}
function getChildrenTotalWidth (children) {
var len = children.length;
var total = 0;
for (var i = 0; i < len; i++) {
total += children[i].getBoundingClientRect().width;
}
return total
}
/**
* get total content width of the element.
* @param {HTMLElement} elm
*/
function getRangeWidth (elm) {
var children = elm.children;
if (!children) {
return elm.getBoundingClientRect().width
}
if (!Range) {
return getChildrenTotalWidth(children)
}
var range = document.createRange();
if (!range.selectNodeContents) {
return getChildrenTotalWidth(children)
}
range.selectNodeContents(elm);
return range.getBoundingClientRect().width
}
/**
* px2rem and camelize keys.
*/
function styleObject2rem (style, rootValue) {
var obj = {};
for (var k in style) {
var camK = camelize(k);
if (bindingStyleNamesForPx2Rem.indexOf(camK) > -1) {
obj[camK] = px2rem(style[k] + '', rootValue);
}
else {
obj[camK] = style[k];
}
}
return obj
}
function px2rem (px, rootValue) {
return px.replace(/([+-]?\d+(?:.\d*)?)([p|w]x)/g, function ($0, $1, $2) {
if ($2 === 'wx') { // 'wx' -> px
return $1 + 'px'
}
else { // 'px' -> rem
var pxVal = parseFloat($1);
var sign = pxVal > 0
? 1 : pxVal < 0 ?
-1 : 0;
if (Math.abs(pxVal) <= 1) {
return supportHairlines()
? ((sign * 0.5) + "px")
: ((sign * 1) + "px")
}
return pxVal
/ (rootValue || window.weex.config.env.rem)
+ 'rem'
}
})
}
function rem2px (rem, rootValue) {
return rem.replace(/([+-]?\d+(?:.\d*)?)rem/g, function ($0, $1) {
return parseFloat($1)
* (rootValue || window.weex.config.env.rem)
+ 'px'
})
}
/*
* 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 utils = Object.freeze({
extend: extend,
extendTruthy: extendTruthy,
extendKeys: extendKeys,
extractKeys: extractKeys,
bind: bind,
debounce: debounce,
depress: depress,
throttle: throttle,
loopArray: loopArray,
cached: cached,
camelize: camelize,
camelizeKeys: camelizeKeys,
capitalize: capitalize,
hyphenate: hyphenate,
hyphenateKeys: hyphenateKeys,
hyphenateStyleKeys: hyphenateStyleKeys,
camelToKebab: camelToKebab,
appendCss: appendCss,
nextFrame: nextFrame,
toCSSText: toCSSText,
supportsPassive: supportsPassive,
createEvent: createEvent,
createBubblesEvent: createBubblesEvent,
createCustomEvent: createCustomEvent,
dispatchNativeEvent: dispatchNativeEvent,
mapFormEvents: mapFormEvents,
contains: contains,
insideA: insideA,
getParentScroller: getParentScroller,
getParentScrollerElement: getParentScrollerElement,
hasIntersection: hasIntersection,
isElementVisible: isElementVisible,
getEventHandlers: getEventHandlers,
watchAppear: watchAppear,
detectAppear: detectAppear,
applySrc: applySrc,
fireLazyload: fireLazyload,
getThrottleLazyload: getThrottleLazyload,
supportHairlines: supportHairlines,
supportSticky: supportSticky,
getTransformObj: getTransformObj,
getTransformStr: getTransformStr,
addTransform: addTransform,
copyTransform: copyTransform,
getRgb: getRgb,
getStyleSheetById: getStyleSheetById,
getRangeWidth: getRangeWidth,
styleObject2rem: styleObject2rem,
px2rem: px2rem,
rem2px: rem2px,
isPlainObject: isPlainObject,
isArray: isArray,
isPrimitive: isPrimitive,
isDef: isDef
});
/*
* 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 WXEnvironment info.
* @param {object} viewportInfo: info about viewport.
* @param {object} envInfo: info parsed from lib.env.
*/
function initEnv (viewportInfo, envInfo) {
var browserName = envInfo.browser ? envInfo.browser.name : navigator.appName;
var browserVersion = envInfo.browser ? envInfo.browser.version.val : null;
var osName = envInfo.os.name;
if (osName.match(/(iPhone|iPad|iPod)/i)) {
osName = 'iOS';
}
else if (osName.match(/Android/i)) {
osName = 'android';
}
var osVersion = envInfo.os.version.val;
var env = {
platform: 'Web',
weexVersion: '1.0.36',
layoutDirection: 'ltr',
userAgent: navigator.userAgent,
appName: browserName,
appVersion: browserVersion,
osName: osName,
osVersion: osVersion,
deviceModel: envInfo.os.name || null
};
/**
* viewportInfo: scale, deviceWidth, deviceHeight. dpr
*/
return extend(viewportInfo, env)
}
// const viewportInfo = initViewport()
// 750 by default currently
// const scale = viewportInfo.scale
// const units = {
// REM: 12 * scale,
// VW: viewportInfo.deviceWidth / 100,
// VH: viewportInfo.deviceHeight / 100,
// VMIN: Math.min(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
// VMAX: Math.max(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
// CM: 96 / 2.54 * scale,
// MM: 96 / 25.4 * scale,
// Q: 96 / 25.4 / 4 * scale,
// IN: 96 * scale,
// PT: 96 / 72 * scale,
// PC: 96 / 6 * scale,
// PX: scale
// }
// Object.freeze(units)
// Object.freeze(env)
// window.CSS_UNIT = units
window.WXEnvironment = initEnv(init$1(), window.lib.env);
/*
* 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 Vue */
var weexModules = {};
var _roots = [];
var weex$4 = {
__vue__: null,
utils: utils,
// units: window.CSS_UNIT,
config: {
env: window.WXEnvironment,
bundleUrl: location.href
},
_components: {},
_modules: weexModules,
_meta: {
mounted: {},
updated: {},
destroyed: {},
requiredModules: {},
apiCalled: {},
perf: {}
},
document: {
body: {}
},
requireModule: function requireModule (moduleName) {
var metaMod = weex$4._meta.requiredModules;
if (!metaMod[moduleName]) {
metaMod[moduleName] = 0;
}
metaMod[moduleName]++;
return weexModules[moduleName]
},
registerModule: function registerModule () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return (ref = this).registerApiModule.apply(ref, args)
var ref;
},
support: function support (feature) {
if ( feature === void 0 ) feature = '';
var match = (feature + '').match(/@(component|module)\/(\w+)(.\w+)?/);
if (match) {
var type = match[1];
var mod = match[2];
var method = match[3];
method = method && method.replace(/^\./, '');
switch (type) {
case 'component':
return typeof this._components[mod] !== 'undefined'
|| config.weexBuiltInComponents.indexOf(mod) >= 0
case 'module':
var module = weexModules[mod];
return module && method ? !!module[method] : !!module
}
}
else {
console.warn(("[vue-render] invalid argument for weex.support: " + feature));
return null
}
},
supports: function supports () {
return this.support.apply(this, arguments)
},
isRegisteredModule: function isRegisteredModule (moduleName, methodName) {
var feature = methodName ? (moduleName + "." + methodName) : moduleName;
return this.support('@module/' + feature)
},
isRegisteredComponent: function isRegisteredComponent (componentName) {
return this.support('@component/' + componentName)
},
/**
* Register a new vue instance in this weex instance. Put its root element into weex.document.body.children, so
* that user can use weex.document.body to walk through all dom structures in all vue instances in the page.
*/
registerVueInstance: function registerVueInstance (instance) {
if (!instance instanceof Vue) {
return
}
var root = instance.$root;
if (!root || !root.$el) {
return
}
this.document.body.children.push(root.$el);
},
// @deprecated
require: function require () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
console.log("[Vue Render] \"weex.require\" is deprecated, please use \"weex.requireModule\" instead.");
return (ref = this).requireModule.apply(ref, args)
var ref;
},
// @deprecated
// TODO: rename to registerModule
registerApiModule: function registerApiModule (name, module, meta) {
if (!weexModules[name]) {
weexModules[name] = {};
}
if (!!meta && meta.registerType === 'assignment') {
weexModules[name] = module;
}
else {
var loop = function ( key ) {
if (module.hasOwnProperty(key)) {
weexModules[name][key] = function () {
var called = weex$4._meta.apiCalled;
if (!called[name]) {
called[name] = {};
}
var calledMod = called[name];
if (!calledMod[key]) {
calledMod[key] = 0;
}
calledMod[key]++;
return module[key].apply(weex$4, arguments)
};
}
};
for (var key in module) loop( key );
}
},
registerComponent: function registerComponent (name, component) {
if (!this.__vue__) {
return console.log('[Vue Render] Vue is not found. Please import Vue.js before register a component.')
}
this._components[name] = 0;
if (component._css) {
var css = component._css.replace(/\b[+-]?[\d.]+rem;?\b/g, function (m) {
return parseFloat(m) * 75 * weex$4.config.env.scale + 'px'
});
appendCss(css, ("weex-cmp-" + name));
delete component._css;
}
this.__vue__.component(name, component);
},
// @deprecated
getRoot: function getRoot () {},
// @deprecated
sender: {
performCallback: function performCallback (callback, data, keepAlive) {
if (typeof callback === 'function') {
return callback(data)
}
return null
}
},
// @deprecated
install: function install (module) {
module.init(this);
}
};
Object.defineProperty(weex$4.document.body, 'children', {
get: function get () { return _roots }
})
; ['on', 'once', 'off', 'emit'].forEach(function (method) {
weex$4[method] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (!this._vue) {
this._vue = new this.__vue__();
}
return (ref = this._vue)[("$" + method)].apply(ref, args)
var ref;
};
});
/*
* 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 getInlineStyle (vnode) {
var data = vnode.data || {};
return extendTruthy({}, data.staticStyle, data.style)
}
function extractComponentStyle (context) {
return getComponentInlineStyle(context)
// return getComponentStyle(context, true)
}
function getComponentInlineStyle (context) {
var vnode = context && context.$vnode;
if (!vnode) {
return {}
}
var style = {};
while (vnode) {
extend(style, getInlineStyle(vnode));
vnode = vnode.parent;
}
return style
}
var text$2 = {
transform: function transform (style) {
var lines = style.lines;
if (lines > 0) {
return Object.assign(style, {
overflow: 'hidden',
textOverflow: 'ellipsis',
WebkitLineClamp: lines
})
}
return style
}
};
var tagMap$1 = {
text: text$2
};
var getTransformer$1 = function (tag) {
return tagMap$1[tag]
};
var transformer = {
getTransformer: getTransformer$1
};
var getTransformer = transformer.getTransformer;
var getTransformer_1 = getTransformer;
/*
* 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 weexBuiltInComponents = config.weexBuiltInComponents;
var appearEventsMap = {
appear: 'appear',
disappear: 'disappear',
offsetAppear: 'offset-appear',
offsetDisappear: 'offset-disappear'
};
/**
* remove text nodes in the nodes array.
* @param {Array} nodes
* @return {Array} nodes without text nodes.
*/
function trimTextVNodes (vnodes) {
if (isArray(vnodes)) {
return vnodes.filter(function (vnode) { return !!vnode.tag; })
}
return vnodes
}
/**
* ==================================================
* method to transform args passed to createElement
* for render function.
* ==================================================
*/
// should share with precompiler.
var metaMap = {
figure: ['img', 'image', 'gif', 'figure'],
p: ['text', 'p'],
div: ['container', 'div'],
section: ['cell', 'cell-slot'],
'recycle-list': ['recycle-list']
};
var checkMap = Object.keys(metaMap).reduce(function (pre, targetTag) {
var tagArr = metaMap[targetTag];
tagArr.forEach(function (fromTag) {
pre[fromTag] = targetTag;
});
return pre
}, {});
var _stdTagMap = {
p: 'text',
figure: 'image',
section: 'cell'
};
function getStdTag (tag) {
var stdTag = _stdTagMap[tag];
return stdTag || tag
}
var precompiledClassMap = {
div: {
'weex-ct': true,
'weex-div': true
},
image: {
'weex-el': true,
'weex-image': true
},
text: {
'weex-el': true,
'weex-text': true
},
cell: {
'weex-ct': true,
'weex-cell': true
},
a: {
'weex-ct': true,
'weex-a': true
}
};
function isPrecompiled (tag) {
return config.weexBuiltInComponents.indexOf(tag) > -1
}
function transformRender (ctx, h) {
return function (
tag,
data,
children,
normalizationType,
alwaysNormalize
) {
if (isArray(data) || isPrimitive(data)) {
normalizationType = children;
children = data;
data = {};
}
if (!isDef(data)) {
data = {};
}
if (isDef(data.is)) {
tag = data.is;
}
if (typeof tag === 'string') {
data = transformData(this, data, tag);
tag = transformTag(this, tag);
}
else { // direct component options / constructor
data = transformData(this, data, undefined);
}
return h.call(
this,
tag,
data,
children,
normalizationType,
alwaysNormalize
)
}.bind(ctx)
}
function transformTag (ctx, tag) {
var elementTag = checkMap[tag];
return elementTag || tag
}
/**
* Tell whether a element is contained in a element who has
* a attribute 'bubble'=true.
* @param {HTMLElement} el
*/
// function inBubble (el) {
// if (typeof el._inBubble === 'boolean') {
// return el._inBubble
// }
// const parents = []
// let parent = el.parentElement
// let inBubble
// while (parent && parent !== document.body) {
// if (typeof parent._inBubble === 'boolean') {
// inBubble = parent._inBubble
// break
// }
// const attr = parent.getAttribute('bubble')
// if (attr !== '') {
// inBubble = attr === true || attr === 'true'
// break
// }
// parents.push(parent)
// parent = parent.parentElement
// }
// el._inBubble = inBubble
// for (let i = 0, l = parents.length; i < l; i++) {
// parents[i]._inBubble = inBubble
// }
// return inBubble
// }
function bindEvents (ctx, evts, attrs, tag, appearAttached) {
for (var key in evts) {
var appearEvtName = appearEventsMap[key];
if (appearEvtName) {
attrs[("data-evt-" + appearEvtName)] = '';
if (!appearAttached.value) {
appearAttached.value = true;
attrs['weex-appear'] = '';
}
}
else {
attrs[("data-evt-" + key)] = '';
if (key !== 'click') {
// should stop propagation by default.
// TODO: should test inBubble first.
var handler = evts[key];
if (isArray(evts[key])) {
handler.unshift(ctx.$stopPropagation);
}
else {
evts[key] = [ctx.$stopPropagation, handler];
}
}
}
}
if (evts.click) {
evts.weex$tap = evts.click;
evts.click = ctx.$stopOuterA;
}
if (evts.scroll) {
evts.weex$scroll = evts.scroll;
delete evts.scroll;
}
}
function transformOn (ctx, data, tag) {
var on = data.on;
var nativeOn = data.nativeOn;
if (weexBuiltInComponents.indexOf(tag) > -1) {
/**
* for div, image, text, cell, a, ...
* user should bind all events without .native.
*/
nativeOn = null;
delete data.nativeOn;
}
if (isDef(weex._components[tag])) {
/**
* for slider, list, ...
* user should bind events without .native.
* in our events handling, all events should transfer to
* .native binding.
*/
delete data.nativeOn;
nativeOn = null;
if (on) {
nativeOn = data.nativeOn = on;
}
on = null;
delete data.on;
}
var attrs = data.attrs;
if (!attrs) {
attrs = data.attrs = {};
}
var appearAttached = {
value: false
};
if (on) {
bindEvents(ctx, on, attrs, tag, appearAttached);
}
if (nativeOn) {
bindEvents(ctx, nativeOn, attrs, tag, appearAttached);
}
/**
* binding a weex$tap to <a> element to stop propagation if there
* is no bubbles=true flag showing on parents.
*/
if (tag === 'a') {
if (!on) {
on = data.on = {};
}
// if (!checkBubble(el)) {
var evt = on['weex$tap'];
if (!evt) {
on['weex$tap'] = ctx.$stopPropagation;
}
else if (Array.isArray(evt)) {
evt.unshift(ctx.$stopPropagation);
}
else {
evt = [ctx.$stopPropagation, evt];
}
// }
}
}
function transformClass (data, tag) {
var classData = data.class;
var tagClassObj = precompiledClassMap[tag];
if (!classData) {
classData = data.class = [];
}
if (classData && isArray(classData)) {
data.class = classData.concat(Object.keys(tagClassObj));
}
else if (typeof classData === 'object') {
Object.assign(classData, tagClassObj);
}
}
function transformStyle (ctx, data, tag) {
var style = data.style;
if (!style) { return }
var transformer = getTransformer_1(getStdTag(tag));
if (transformer) {
data.style = ctx._px2rem(transformer.transform(style), 75);
}
else {
data.style = ctx._px2rem(style, 75);
}
}
/**
* transformAttrs:
* - add weex-type attrs for precompiledTags.
* - image.resize: transform to directive weex-resize.
*/
function transformAttrs (data, tag) {
var attrs = data.attrs;
var directives = data.directives;
if (!attrs) {
attrs = data.attrs = {};
}
attrs['weex-type'] = tag;
if (tag === 'image' || tag === 'gif') {
var src = attrs.src;
var resize = attrs.resize;
if (src) {
attrs['data-img-src'] = src;
}
if (resize) {
if (!directives) {
directives = data.directives = [];
}
directives.push({
name: 'weex-resize',
value: attrs.resize
});
}
}
}
function transformData (ctx, data, tag) {
if (isArray(data)) {
// parameter data is ommited.
return data
}
var isP = isPrecompiled(tag);
// class
isP && transformClass(data, tag);
// style
transformStyle(ctx, data, tag);
// attrs
isP && transformAttrs(data, tag);
// on
transformOn(ctx, data, tag);
return data
}
function mapNativeEvents (ctx, map) {
var eventMap = {};
var loop = function ( origEvent ) {
eventMap[origEvent] = function (evt) {
var el = evt.target;
dispatchNativeEvent(el, map[origEvent]);
};
};
for (var origEvent in map) loop( origEvent );
return eventMap
}
/*
* 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 core = Object.freeze({
extractComponentStyle: extractComponentStyle,
getComponentInlineStyle: getComponentInlineStyle,
trimTextVNodes: trimTextVNodes,
transformRender: transformRender,
transformTag: transformTag,
transformData: transformData,
mapNativeEvents: mapNativeEvents
});
/*
* 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 scrollableTypes = config.scrollableTypes;
var lazyloadWatched = false;
function watchLazyload () {
lazyloadWatched = true
; [
'scroll',
// 'transitionend',
// 'webkitTransitionEnd',
// 'animationend',
// 'webkitAnimationEnd',
'resize'
].forEach(function (evt) {
window.addEventListener(evt, getThrottleLazyload(25, document.body));
});
/**
* In case the users use the body's overflow to scroll. Then the scroll
* event would not be triggered on the window object but on the body.
*/
document.body.addEventListener('scroll', getThrottleLazyload(25, document.body));
}
var idCnt = 0;
var appearWatched = false;
/**
* during updating, the appear watcher binding on the appearWatched context
* should be triggered within a debounced wrapper.
* If the updating interval is shorter then 50 ms, then the appear events will
* ignore the change in the previous 50 ms due to the debounce wrapper.
*/
var debouncedWatchAppear = debounce(function () {
watchAppear(appearWatched, true);
}, 50);
/**
* if it's a scrollable tag, then watch appear events for it.
*/
function watchAppearForScrollables (tagName, context) {
// when this is a scroller/list/waterfall
if (scrollableTypes.indexOf(tagName) > -1) {
var sd = context.scrollDirection;
if (!sd || sd !== 'horizontal') {
appearWatched = context;
watchAppear(context, true);
}
}
}
var base$1 = {
beforeCreate: function beforeCreate () {
if (!lazyloadWatched) {
watchLazyload();
}
},
updated: function updated () {
var el = this.$el;
if (!el || el.nodeType !== 1) {
return
}
if (this._rootId) {
if (el.className.indexOf('weex-root') <= -1) {
el.classList.add('weex-root');
el.classList.add('weex-ct');
el.setAttribute('data-wx-root-id', this._rootId);
}
}
var tagName = this.$options && this.$options._componentTag;
var metaUp = weex._meta.updated;
if (!metaUp[tagName]) {
metaUp[tagName] = 0;
}
metaUp[tagName]++;
// will check appearing when no other changes in latest 50ms.
debouncedWatchAppear();
/**
* since the updating of component may affect the layout, the lazyloading should
* be fired.
*/
this._fireLazyload();
},
mounted: function mounted () {
var tagName = this.$options && this.$options._componentTag;
var el = this.$el;
if (!el || el.nodeType !== 1) {
return
}
if (typeof weex._components[tagName] !== 'undefined') {
weex._components[tagName]++;
}
var metaMt = weex._meta.mounted;
if (!metaMt[tagName]) {
metaMt[tagName] = 0;
}
metaMt[tagName]++;
watchAppearForScrollables(tagName, this);
// when this is the root element of Vue instance.
if (this === this.$root) {
var rootId = "wx-root-" + (idCnt++);
if (!weex._root) {
weex._root = {};
}
weex._root[rootId] = this;
this._rootId = rootId;
if (el.nodeType !== 1) {
return
}
el.classList.add('weex-root');
el.classList.add('weex-ct');
el.setAttribute('data-wx-root-id', rootId);
/**
* there's no scrollable component in this page. That is to say,
* the page is using body scrolling instead of scrollabe components.
* Then the appear watcher should be attached on the body.
*/
if (!appearWatched) {
appearWatched = this;
watchAppear(this, true);
}
this._fireLazyload(el);
}
// give warning for not using $processStyle in vue-loader config.
// if (!warned && !window._style_processing_added) {
// warnProcessStyle()
// }
},
destroyed: function destroyed () {
var el = this.$el;
if (!el || el.nodeType !== 1) {
return
}
/**
* if the destroyed element is above another panel with images inside, and the images
* moved into the viewport, then the lazyloading should be triggered.
*/
if (this._rootId) {
delete weex._root[this._rootId];
delete this._rootId;
}
var tagName = this.$options && this.$options._componentTag;
if (typeof weex._components[tagName] !== 'undefined') {
weex._components[tagName]--;
}
var metaDs = weex._meta.destroyed;
if (!metaDs[tagName]) {
metaDs[tagName] = 0;
}
metaDs[tagName]++;
this._fireLazyload();
},
methods: {
_fireLazyload: function _fireLazyload (el) {
getThrottleLazyload(25, el || document.body)();
}
}
};
var event$1 = {
methods: {
// deprecated.
$stopOutterA: function $stopOutterA (e) {
return this.$stopOuterA(e)
},
$stopOuterA: function $stopOuterA (e) {
if (e && e.preventDefault && e.target) {
if (insideA(e.target)) {
e.preventDefault();
}
}
},
$stopPropagation: function $stopPropagation (e) {
if (e && e.stopPropagation) {
e.stopPropagation();
}
}
}
};
/*
* 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 bindingStyleNamesForPx2Rem$1 = config.bindingStyleNamesForPx2Rem;
var style = {
methods: {
_px2rem: function _px2rem (value, rootValue) {
var this$1 = this;
if (typeof value === 'string') {
return (value + '').replace(/[+-]?\d+(?:.\d*)?[pw]x/gi, function ($0) {
return weex.utils.px2rem($0, rootValue)
})
}
if (typeof value === 'number') {
return weex.utils.px2rem(value + '', rootValue)
}
if (isPlainObject(value)) {
for (var k in value) {
if (
value.hasOwnProperty(k)
&& bindingStyleNamesForPx2Rem$1.indexOf(k) > -1
) {
value[k] = weex.utils.px2rem(value[k] + '', rootValue);
}
}
return value
}
if (isArray(value)) {
for (var i = 0, l = value.length; i < l; i++) {
this$1._px2rem(value[i], rootValue);
}
return value
}
},
_processExclusiveStyle: function _processExclusiveStyle (styleObj, rootValue, tagName) {
var transformer = getTransformer_1(tagName);
return this._px2rem(
transformer.transform(styleObj),
rootValue
)
},
_getParentRect: function _getParentRect () {
var el = this.$el;
var parent = el && el.parentElement;
return parent && parent.getBoundingClientRect()
}
}
};
/*
* 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.
*/
// input and textare has some common api and event
var findEnterKeyType = function (key) {
var keys = ['default', 'go', 'next', 'search', 'send'];
if (keys.indexOf(key) > -1) {
return key
}
return 'done'
};
var inputCommon = {
methods: {
focus: function focus () {
this.$el && this.$el.focus();
},
blur: function blur () {
this.$el && this.$el.blur();
},
setSelectionRange: function setSelectionRange (start, end) {
try {
this.$el.setSelectionRange(start, end);
}
catch (e) {
}
},
getSelectionRange: function getSelectionRange (callback) {
try {
var selection = window.getSelection();
var str = selection.toString();
var selectionStart = this.$el.value.indexOf(str);
var selectionEnd = selectionStart === -1 ? selectionStart : selectionStart + str.length;
callback && callback({
selectionStart: selectionStart,
selectionEnd: selectionEnd
});
}
catch (e) {
callback && callback(new Error('[vue-render] getSelection is not supported.'));
}
},
getEditSelectionRange: function getEditSelectionRange (callback) {
this.getSelectionRange(callback);
},
// support enter key event
createKeyboardEvent: function createKeyboardEvent (events) {
var customKeyType = this.returnKeyType;
if (customKeyType) {
var keyboardEvents = {
'keyup': function (ev) {
var code = ev.keyCode;
var key = ev.key;
if (code === 13) {
if (!key || key.toLowerCase() === 'tab') {
key = 'next';
}
dispatchNativeEvent(ev.target, 'return', {
key: key,
returnKeyType: findEnterKeyType(customKeyType),
value: ev.target.value
});
}
}
};
events = extend(events, keyboardEvents);
}
return events
}
}
};
/*
* 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 sticky = {
destroyed: function destroyed () {
if (!this._stickyAdded) { return }
var scroller = getParentScroller(this);
if (!scroller) { return }
delete scroller._stickyChildren[this._uid];
},
methods: {
_addSticky: function _addSticky () {
var el = this.$el;
if (!el || el.nodeType === 1) {
return
}
el.classList.add('sticky');
if (!this._placeholder) {
this._placeholder = el.cloneNode(true);
}
this._placeholder.style.display = 'block';
this._placeholder.style.width = this.$el.offsetWidth + 'px';
this._placeholder.style.height = this.$el.offsetHeight + 'px';
el.parentNode.insertBefore(this._placeholder, this.$el);
},
_removeSticky: function _removeSticky () {
var el = this.$el;
if (!el || el.nodeType === 1) {
return
}
el.classList.remove('sticky');
if (this._placeholder) {
this._placeholder.parentNode.removeChild(this._placeholder);
}
this._placeholder = 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.
*/
window.global = window;
window.weex = weex$4;
weex$4._styleMap = {}
; ['getComponentInlineStyle',
'extractComponentStyle',
'mapNativeEvents',
'trimTextVNodes']
.forEach(function (method) {
weex$4[method] = core[method].bind(weex$4);
});
weex$4.mixins = {
inputCommon: inputCommon
};
/*
* 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 _inited$1 = false;
var renderFunctionPlugin = {
init: function init (weex) {
if (_inited$1) {
return
}
_inited$1 = true;
var Vue = weex.__vue__;
var _render = Vue.prototype._render;
Vue.prototype._render = function () {
var weexRender = this._weexRender;
var tag = this.$options && this.$options._componentTag;
if (
!weexRender
&& !isDef(weex._components[tag])
) {
var origRender = this.$options.render;
weexRender = this._weexRender = function (h) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return origRender.call.apply(origRender, [ this, transformRender(this, h) ].concat( args ))
};
this.$options.render = weexRender;
}
return _render.call(this)
};
}
};
/*
* 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.
*/
if (global.Vue) {
setVue(global.Vue);
}
function setVue (vue) {
if (!vue) {
throw new Error('[Vue Render] Vue not found. Please make sure vue 2.x runtime is imported.')
}
if (global.weex.__vue__) {
return
}
global.weex.__vue__ = vue;
weex.install(renderFunctionPlugin);
console.log(("[Vue Render] install Vue " + (vue.version) + "."));
}
/*
* 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 weex.
* @param {Vue$2} Vue: Vue Constructor.
* @param {object} options: extend weex plugins.
* - components.
* - modules.
*/
var _inited = false;
function init (Vue/* options = {}*/) {
if (_inited) { return }
_inited = true;
setVue(Vue);
Vue.prototype.$getConfig = function () {
console.warn('[Vue Render] "this.$getConfig" is deprecated, please use "weex.config" instead.');
return weex.config
};
var htmlRegex = /^html:/i;
Vue.config.isReservedTag = function (tag) { return htmlRegex.test(tag); };
Vue.config.parsePlatformTagName = function (tag) { return tag.replace(htmlRegex, ''); };
function isWeexTag (tag) {
return typeof weex._components[tag] !== 'undefined'
}
var oldGetTagNamespace = Vue.config.getTagNamespace;
Vue.config.getTagNamespace = function (tag) {
if (isWeexTag(tag)) {
return
}
return oldGetTagNamespace(tag)
};
Vue.mixin(base$1);
Vue.mixin(event$1);
Vue.mixin(style);
Vue.mixin(sticky);
}
// auto init in dist mode.
if (typeof window !== 'undefined' && window.Vue) {
init(window.Vue);
}
weex.init = init;
/*
* 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 Input component.
* Support v-model only if vue version is larger than 2.2.0
*/
var mapFormEvents$1;
var appendCss$1;
var ID_PREFIX_PLACEHOLDER_COLOR = 'wipt_plc_';
var ID_PREFIX_INPUT = 'wipt_';
var idCount = 0;
function setPlaceholderColor (inputVm, placeholderColor) {
if (!placeholderColor) {
return
}
var vendors = [
'::-webkit-input-placeholder',
':-moz-placeholder',
'::-moz-placeholder',
':-ms-input-placeholder',
':placeholder-shown'
];
var id = inputVm._id;
appendCss$1(
vendors.map(function (vendor, idx) {
return ("#" + ID_PREFIX_INPUT + id + (vendors[idx]) + "{color:" + placeholderColor + ";}")
}).join(''),
("" + ID_PREFIX_PLACEHOLDER_COLOR + id),
true);
}
function processStyle (vm) {
var styles = getComponentInlineStyle(vm);
var phColor = styles.placeholderColor || styles['placeholder-color'];
if (phColor) {
setPlaceholderColor(vm, phColor);
}
return styles
}
function getInput (weex) {
var ref = weex.mixins;
var inputCommon = ref.inputCommon;
return {
name: 'weex-input',
mixins: [inputCommon],
props: {
type: {
type: String,
default: 'text',
validator: function validator (value) {
return [
'email', 'number', 'password', 'search', 'tel', 'text', 'url', 'date',
'datetime', 'time' ].indexOf(value) !== -1
}
},
value: String,
placeholder: String,
disabled: {
type: [String, Boolean],
default: false
},
autofocus: {
type: [String, Boolean],
default: false
},
maxlength: [String, Number],
returnKeyType: String
},
render: function render (createElement) {
if (!this._id) {
this._id = idCount++;
}
var events = mapFormEvents$1(this);
return createElement('html:input', {
attrs: {
'weex-type': 'input',
id: ("" + ID_PREFIX_INPUT + (this._id)),
type: this.type,
value: this.value,
disabled: (this.disabled !== 'false' && this.disabled !== false),
autofocus: (this.autofocus !== 'false' && this.autofocus !== false),
placeholder: this.placeholder,
maxlength: this.maxlength,
'returnKeyType': this.returnKeyType
},
domProps: {
value: this.value
},
on: this.createKeyboardEvent(events),
staticClass: 'weex-input weex-el',
staticStyle: processStyle(this)
})
}
}
}
var input = {
init: function init (weex) {
mapFormEvents$1 = weex.utils.mapFormEvents;
appendCss$1 = weex.utils.appendCss;
weex.registerComponent('input', getInput(weex));
}
};
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n.weex-switch {\n border: 0.013333rem solid #dfdfdf;\n cursor: pointer;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n background-clip: content-box;\n color: #64bd63;\n width: 1.333333rem;\n height: 0.8rem;\n background-color: white;\n border-color: #dfdfdf;\n -webkit-box-shadow: #dfdfdf 0 0 0 0 inset;\n box-shadow: #dfdfdf 0 0 0 0 inset;\n border-radius: 0.8rem;\n -webkit-transition: border 0.4s, background-color 1.2s, -webkit-box-shadow 0.4s;\n transition: border 0.4s, background-color 1.2s, -webkit-box-shadow 0.4s;\n transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;\n transition: border 0.4s, box-shadow 0.4s, background-color 1.2s, -webkit-box-shadow 0.4s;\n}\n\n.weex-switch-checked {\n background-color: #64bd63;\n border-color: #64bd63;\n -webkit-box-shadow: #64bd63 0 0 0 0.533333rem inset;\n box-shadow: #64bd63 0 0 0 0.533333rem inset;\n}\n\n.weex-switch-checked.weex-switch-disabled {\n opacity: 0.3\n}\n\n.weex-switch-disabled {\n background-color: #EEEEEE;\n}\n\n.weex-switch-inner {\n width: 0.8rem;\n height: 0.8rem;\n background: #fff;\n border-radius: 100%;\n -webkit-box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);\n box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);\n position: absolute;\n top: 0;\n left: 0;\n -webkit-transition: background-color 0.4s, left 0.2s;\n transition: background-color 0.4s, left 0.2s;\n}\n\n.weex-switch-checked > .weex-switch-inner {\n left: 0.533333rem;\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.
*/
function getSwitch (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var ref = weex.utils;
var dispatchNativeEvent = ref.dispatchNativeEvent;
return {
name: 'weex-switch',
props: {
checked: {
type: [Boolean, String],
default: false
},
disabled: {
type: [Boolean, String],
default: false
},
// Border color when the switch is turned off
tintColor: String,
// Background color when the switch is turned on.
onTintColor: String,
// Color of the foreground switch grip.
thumbTintColor: String
},
data: function data () {
return {
isChecked: (this.checked !== 'false' && this.checked !== false),
isDisabled: (this.disabled !== 'false' && this.disabled !== false)
}
},
computed: {
wrapperClass: function wrapperClass () {
var classArray = ['weex-el', 'weex-switch'];
this.isChecked && classArray.push('weex-switch-checked');
this.isDisabled && classArray.push('weex-switch-disabled');
return classArray.join(' ')
},
mergeStyle: function mergeStyle () {
var style = extractComponentStyle(this);
var ref = this;
var tintColor = ref.tintColor;
var onTintColor = ref.onTintColor;
var isChecked = ref.isChecked;
var isDisabled = ref.isDisabled;
if (!isChecked && tintColor) {
Object.assign(style, {
borderColor: tintColor,
boxShadow: (tintColor + " 0 0 0 0 inset")
});
}
if (isChecked && onTintColor) {
Object.assign(style, {
backgroundColor: onTintColor,
color: onTintColor,
borderColor: onTintColor,
boxShadow: (onTintColor + " 0 0 0 0.533333rem inset")
});
}
isDisabled && Object.assign(style, {
opacity: 0.3
});
return style
},
smallStyle: function smallStyle () {
var ref = this;
var thumbTintColor = ref.thumbTintColor;
var smallStyle = {};
if (thumbTintColor) {
smallStyle = {
background: thumbTintColor
};
}
return smallStyle
}
},
methods: {
toggle: function toggle () {
// TODO: handle the events
if (!this.isDisabled) {
this.isChecked = !this.isChecked;
dispatchNativeEvent(this.$el, 'change', { value: this.isChecked });
}
}
},
mounted: function mounted () {
var this$1 = this;
var el = this.$el;
if (el && el.nodeType === 1) {
if (!this._removeClickHandler) {
var handler = function (evt) {
this$1.toggle();
};
this._removeClickHandler = el.removeEventListener.bind(el, 'weex$tap', handler);
el.addEventListener('weex$tap', handler);
}
}
},
beforeDestroy: function beforeDestroy () {
var rm = this._removeClickHandler;
if (rm) {
rm();
delete this._removeClickHandler;
}
},
render: function render (createElement) {
return createElement('span', {
attrs: { 'weex-type': 'switch' },
staticClass: this.wrapperClass,
staticStyle: this.mergeStyle
}, [createElement('small', {
staticClass: 'weex-switch-inner',
staticStyle: this.smallStyle
})])
}
}
}
var _switch = {
init: function init (weex) {
weex.registerComponent('switch', getSwitch(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 DEFAULT_OFFSET_ACCURACY = 10;
var DEFAULT_LOADMORE_OFFSET = 0;
function getThrottledScroll (context) {
var scale = weex.config.env.scale;
if (!context._throttleScroll) {
var wrapper = context.$refs.wrapper;
var inner = context.$refs.inner;
var preOffset = (context.scrollDirection === 'horizontal'
? wrapper.scrollLeft
: wrapper.scrollTop)
|| 0;
context._throttleScroll = weex.utils.throttle(function (evt) {
var offset = context.scrollDirection === 'horizontal'
? wrapper.scrollLeft
: wrapper.scrollTop;
var indent = parseInt(context.offsetAccuracy) * scale;
function triggerScroll () {
var rect = inner.getBoundingClientRect();
var evtObj = {
contentSize: { width: rect.width, height: rect.height },
contentOffset: {
x: wrapper.scrollLeft,
/**
* positive direciton for y-axis is down.
* so should use negative operation on scrollTop.
*
* (0,0)---------------> x
* |
* |
* |
* |
* v y
*
*/
y: -wrapper.scrollTop
}
};
if (context.$el) {
weex.utils.dispatchNativeEvent(context.$el, 'weex$scroll', evtObj);
}
}
if (Math.abs(offset - preOffset) >= indent) {
triggerScroll();
preOffset = offset;
}
}, 16, true);
}
return context._throttleScroll
}
var scrollable$1 = {
props: {
loadmoreoffset: {
type: [String, Number],
default: DEFAULT_LOADMORE_OFFSET,
validator: function validator (value) {
var val = parseInt(value);
return !isNaN(val) && val >= DEFAULT_LOADMORE_OFFSET
}
},
offsetAccuracy: {
type: [Number, String],
default: DEFAULT_OFFSET_ACCURACY,
validator: function validator (value) {
var val = parseInt(value);
return !isNaN(val) && val >= DEFAULT_OFFSET_ACCURACY
}
}
},
created: function created () {
// should call resetLoadmore() to enable loadmore event.
this._loadmoreReset = true;
},
mounted: function mounted () {
this.reloadStickyChildren();
},
updated: function updated () {
this.reloadStickyChildren();
},
methods: {
updateLayout: function updateLayout () {
var wrapper = this.$refs.wrapper;
if (wrapper) {
var rect = wrapper.getBoundingClientRect();
this._wrapperWidth = rect.width;
this._wrapperHeight = rect.height;
}
var inner = this.$refs.inner;
var children = inner && inner.children;
if (inner) {
var rect$1 = inner.getBoundingClientRect();
this._innerWidth = rect$1.width;
this._innerHeight = rect$1.height;
}
var loadingEl = this._loading && this._loading.$el;
var refreshEl = this._refresh && this._refresh.$el;
if (loadingEl) {
this._innerHeight -= loadingEl.getBoundingClientRect().height;
}
if (refreshEl) {
this._innerHeight -= refreshEl.getBoundingClientRect().height;
}
// inner width is always the viewport width somehow in horizontal
// scoller, therefore the inner width should be reclaculated.
if (this.scrollDirection === 'horizontal' && children) {
this._innerWidth = weex.utils.getRangeWidth(inner);
}
},
resetLoadmore: function resetLoadmore () {
this._loadmoreReset = true;
},
/**
* process sticky children in scrollable components.
* current only support list and vertical scroller.
*/
processSticky: function processSticky () {
var this$1 = this;
/**
* current browser support 'sticky' or '-webkit-sticky', so there's no need
* to do further more.
*/
var stickyChildren = this._stickyChildren;
var len = stickyChildren && stickyChildren.length || 0;
if (len <= 0) { return }
var origSticky = weex.utils.supportSticky();
// current only support list and vertical scroller.
if (this.scrollDirection === 'horizontal') {
return
}
var container = this.$el;
if (!container) { return }
var scrollTop = container.scrollTop;
var stickyChild;
for (var i = 0; i < len; i++) {
stickyChild = stickyChildren[i];
if (origSticky) {
this$1.addSticky(stickyChild, origSticky);
}
else if (stickyChild._initOffsetTop < scrollTop) {
this$1.addSticky(stickyChild);
}
else {
this$1.removeSticky(stickyChild);
}
}
},
addSticky: function addSticky (el, supportSticky) {
if (supportSticky) {
el.classList.add('weex-ios-sticky');
}
else {
if (el._sticky === true) { return }
el._sticky = true;
if (!el._placeholder) {
var placeholder = el.cloneNode(true);
placeholder._origNode = el;
placeholder.classList.add('weex-sticky-placeholder');
el._placeholder = placeholder;
}
el.parentNode.insertBefore(el._placeholder, el);
el.style.width = window.getComputedStyle(el).width;
el.classList.add('weex-sticky');
}
},
removeSticky: function removeSticky (el) {
if (
typeof el._sticky === 'undefined'
|| el._sticky === false
) {
return
}
el._sticky = false;
el.parentNode.removeChild(el._placeholder);
el.classList.remove('weex-sticky');
},
reloadStickyChildren: function reloadStickyChildren () {
var container = this.$el;
if (!container) { return }
var stickyChildren = [];
var children = container.querySelectorAll('[sticky]');
for (var i = 0, l = children.length; i < l; i++) {
var child = children[i];
if (/weex-sticky-placeholder/.test(child.className)) { // is a placeholder.
var origNode = child._origNode;
if (
!origNode
|| !origNode.parentNode
|| origNode.parentNode !== child.parentNode
) {
child.parentNode.removeChild(child);
}
}
else { // is a sticky node.
stickyChildren.push(child);
if (!child._sticky) {
child._initOffsetTop = child.offsetTop;
}
}
}
this._stickyChildren = stickyChildren;
},
handleScroll: function handleScroll (event) {
weex.utils.getThrottleLazyload(25, this.$el, 'scroll')();
getThrottledScroll(this)(event);
this.processSticky();
// fire loadmore event.
var inner = this.$refs.inner;
if (inner) {
var innerLength = this.scrollDirection === 'horizontal'
? this._innerWidth
: this._innerHeight;
if (!this._innerLength) {
this._innerLength = innerLength;
}
if (this._innerLength !== innerLength) {
this._innerLength = innerLength;
this._loadmoreReset = true;
}
if (this._loadmoreReset && this.reachBottom(this.loadmoreoffset)) {
this._loadmoreReset = false;
var el = this.$el;
if (el) {
weex.utils.dispatchNativeEvent(el, 'loadmore');
}
}
}
},
reachTop: function reachTop () {
var wrapper = this.$refs.wrapper;
return (!!wrapper) && (wrapper.scrollTop <= 0)
},
reachBottom: function reachBottom (offset) {
var wrapper = this.$refs.wrapper;
var inner = this.$refs.inner;
offset = parseInt(offset || 0) * weex.config.env.scale;
if (wrapper && inner) {
var key = this.scrollDirection === 'horizontal'
? 'width'
: 'height';
var innerLength = this[("_inner" + (key[0].toUpperCase()) + (key.substr(1)))];
var wrapperLength = this[("_wrapper" + (key[0].toUpperCase()) + (key.substr(1)))];
var scrollOffset = this.scrollDirection === 'horizontal'
? wrapper.scrollLeft
: wrapper.scrollTop;
return scrollOffset >= innerLength - wrapperLength - offset
}
return false
},
handleTouchStart: function handleTouchStart (event) {
if (this._loading || this._refresh) {
var touch = event.changedTouches[0];
this._touchParams = {
reachTop: this.reachTop(),
reachBottom: this.reachBottom(),
startTouchEvent: touch,
startX: touch.pageX,
startY: touch.pageY,
timeStamp: event.timeStamp
};
}
},
handleTouchMove: function handleTouchMove (event) {
if (!this._touchParams || !this._refresh && !this._loading) {
return
}
var inner = this.$refs.inner;
var ref = this._touchParams;
var startY = ref.startY;
var reachTop = ref.reachTop;
var reachBottom = ref.reachBottom;
if (inner) {
var touch = event.changedTouches[0];
var offsetY = touch.pageY - startY;
var dir = offsetY > 0 ? 'down' : 'up';
this._touchParams.offsetY = offsetY;
if (this._refresh && (dir === 'down') && reachTop) {
this._refresh.pullingDown(offsetY);
}
else if (this._loading && (dir === 'up') && reachBottom) {
this._loading.pullingUp(-offsetY);
}
}
},
handleTouchEnd: function handleTouchEnd (event) {
if (!this._touchParams || !this._refresh && !this._loading) {
return
}
var inner = this.$refs.inner;
var ref = this._touchParams;
var startY = ref.startY;
var reachTop = ref.reachTop;
var reachBottom = ref.reachBottom;
if (inner) {
var touch = event.changedTouches[0];
var offsetY = touch.pageY - startY;
var dir = offsetY > 0 ? 'down' : 'up';
this._touchParams.offsetY = offsetY;
if (this._refresh && (dir === 'down') && reachTop) {
this._refresh.pullingEnd();
}
else if (this._loading && (dir === 'up') && reachBottom) {
this._loading.pullingEnd();
}
}
delete this._touchParams;
}
}
};
/*
* 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.
*/
function getList (weex) {
var extractComponentStyle = weex.extractComponentStyle;
return {
name: 'weex-list',
mixins: [scrollable$1],
computed: {
wrapperClass: function wrapperClass () {
var classArray = ['weex-list', 'weex-list-wrapper', 'weex-ct'];
this._refresh && classArray.push('with-refresh');
this._loading && classArray.push('with-loading');
return classArray.join(' ')
}
},
methods: {
createChildren: function createChildren (h) {
var slots = this.$slots.default || [];
this._cells = slots.filter(function (vnode) {
if (!vnode.tag && !vnode.componentOptions) { return false }
return true
});
return [
h('article', {
ref: 'inner',
staticClass: 'weex-list-inner weex-ct'
}, this._cells)
]
}
},
render: function render (createElement) {
var this$1 = this;
this.weexType = 'list';
this.$nextTick(function () {
this$1.updateLayout();
});
return createElement('main', {
ref: 'wrapper',
attrs: { 'weex-type': 'list' },
staticClass: this.wrapperClass,
on: {
scroll: this.handleScroll,
touchstart: this.handleTouchStart,
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
},
staticStyle: extractComponentStyle(this)
}, this.createChildren(createElement))
}
}
}
var list = {
init: function init (weex) {
weex.registerComponent('list', getList(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.
*/
function getScroller (weex) {
var extractComponentStyle = weex.extractComponentStyle;
return {
name: 'weex-scroller',
mixins: [scrollable$1],
props: {
scrollDirection: {
type: [String],
default: 'vertical',
validator: function validator (value) {
return ['horizontal', 'vertical'].indexOf(value) !== -1
}
},
scrollable: {
type: [Boolean],
default: true
}
},
computed: {
wrapperClass: function wrapperClass () {
var classArray = ['weex-scroller', 'weex-scroller-wrapper', 'weex-ct'];
if (this.scrollDirection === 'horizontal') {
classArray.push('weex-scroller-horizontal');
}
else {
classArray.push('weex-scroller-vertical');
}
if (!this.scrollable) {
classArray.push('weex-scroller-disabled');
}
return classArray.join(' ')
}
},
methods: {
createChildren: function createChildren (h) {
var slots = this.$slots.default || [];
this._cells = slots.filter(function (vnode) {
if (!vnode.tag && !vnode.componentOptions) { return false }
return true
});
return [
h('article', {
ref: 'inner',
staticClass: 'weex-scroller-inner weex-ct'
}, this._cells)
]
}
},
render: function render (createElement) {
var this$1 = this;
this.weexType = 'scroller';
/* istanbul ignore next */
// if ("production" === 'development') {
// validateStyles('scroller', this.$vnode.data && this.$vnode.data.staticStyle)
// }
this._cells = this.$slots.default || [];
this.$nextTick(function () {
this$1.updateLayout();
});
return createElement('main', {
ref: 'wrapper',
attrs: { 'weex-type': 'scroller' },
on: {
scroll: this.handleScroll,
touchstart: this.handleTouchStart,
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
},
staticClass: this.wrapperClass,
staticStyle: extractComponentStyle(this)
}, this.createChildren(createElement))
}
}
}
var scroller = {
init: function init (weex) {
weex.registerComponent('scroller', getScroller(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.
*/
/**
* @fileoverview waterfall
* NOTE: only support full screen width waterfall.
*/
var NORMAL_GAP_SIZE = 32;
var DEFAULT_COLUMN_COUNT = 1;
function getWaterfall (weex) {
var extractComponentStyle = weex.extractComponentStyle;
return {
name: 'weex-waterfall',
mixins: [scrollable$1],
props: {
/**
* specified gap size.
* value can be number or 'normal'. 'normal' (32px) by default.
*/
columnGap: {
type: [String, Number],
default: 'normal',
validator: function validator (val) {
if (!val || val === 'normal') {
return true
}
val = parseInt(val);
return !isNaN(val) && val > 0
}
},
/**
* the maximum column counts.
* value can be number or 'auto'. 1 by default.
*/
columnCount: {
type: [String, Number],
default: DEFAULT_COLUMN_COUNT,
validator: function validator (val) {
val = parseInt(val);
return !isNaN(val) && val > 0
}
},
/**
* the mimimum column width.
* value can be number or 'auto'. 'auto' by default.
*/
columnWidth: {
type: [String, Number],
default: 'auto',
validator: function validator (val) {
if (!val || val === 'auto') {
return true
}
val = parseInt(val);
return !isNaN(val) && val > 0
}
}
},
mounted: function mounted () {
this._nextTick();
},
updated: function updated () {
this.$nextTick(this._nextTick());
},
methods: {
_createChildren: function _createChildren (h, rootStyle) {
var this$1 = this;
var slots = (this.$slots.default || []).slice();
this._headers = [];
this._footers = [];
this._others = [];
var len = slots.length;
for (var i = 0; i < len; i++) {
var vnode = slots[i];
var tag =
vnode.componentOptions
&& vnode.componentOptions.tag
|| vnode.tag;
if (tag === 'refresh' || tag === 'loading') {
continue
}
if (tag === 'section') { // cell
break
}
if (tag === 'header') {
this$1._headers.push(vnode);
slots[i] = null; // should not included in footer.
}
}
for (var i$1 = len - 1; i$1 >= 0; i$1--) {
var vnode$1 = slots[i$1];
if (!vnode$1) { continue } // already taken by header.
var tag$1 =
vnode$1.componentOptions
&& vnode$1.componentOptions.tag
|| vnode$1.tag;
if (tag$1 === 'refresh' || tag$1 === 'loading') {
continue
}
if (tag$1 === 'section') { // cell
break
}
if (tag$1 === 'header') {
this$1._footers.push(vnode$1);
}
}
this._cells = slots.filter(function (vnode) {
if (!vnode) { return false }
var cmpOpts = vnode.componentOptions;
if (!vnode.tag && !cmpOpts) { return false }
var tag = cmpOpts && cmpOpts.tag || vnode.tag;
if (tag === 'refresh' || tag === 'loading') {
this$1[("_" + tag)] = vnode;
return false
}
if (tag !== 'section') {
this$1._others.push(vnode);
return false
}
return true
});
this._reCalc(rootStyle);
this._genColumns(h);
var children = [];
this._refresh && children.push(this._refresh);
children = children.concat(this._headers);
// .concat(this._others)
children.push(h('html:div', {
ref: 'columns',
staticClass: 'weex-waterfall-inner-columns weex-ct'
}, this._columns));
children.push(h('html:div', {
ref: 'footers',
staticClass: 'weex-waterfall-footers weex-ct'
}, this._footers));
this._loading && children.push(this._loading);
return [
h('article', {
ref: 'inner',
staticClass: 'weex-waterfall-inner weex-ct'
}, children)
]
},
_reCalc: function _reCalc (rootStyle) {
/**
* NOTE: columnGap and columnWidth can't both be auto.
* NOTE: the formula:
* totalWidth = n * w + (n - 1) * gap
* 1. if columnCount = n then calc w
* 2. if columnWidth = w then calc n
* 3. if columnWidth = w and columnCount = n then calc totalWidth
* 3.1 if totalWidth < ctWidth then increase columnWidth
* 3.2 if totalWidth > ctWidth then decrease columnCount
*/
var width, gap, cnt, ctWidth;
var scale = weex.config.env.scale;
var el = this.$el;
function getCtWidth (width, style) {
var padding = style.padding
? parseInt(style.padding) * 2
: parseInt(style.paddingLeft || 0) + parseInt(style.paddingRight || 0);
return width - padding
}
if (el && el.nodeType === 1) { // already mounted
var cstyle = window.getComputedStyle(el);
ctWidth = getCtWidth(el.getBoundingClientRect().width, cstyle);
}
else { // not mounted.
// only support full screen width for waterfall component.
ctWidth = getCtWidth(document.documentElement.clientWidth, rootStyle);
}
gap = this.columnGap;
if (gap && gap !== 'normal') {
gap = parseInt(gap);
}
else {
gap = NORMAL_GAP_SIZE;
}
gap = gap * scale;
width = this.columnWidth;
cnt = this.columnCount;
if (width && width !== 'auto') {
width = parseInt(width) * scale;
}
if (cnt && cnt !== 'auto') {
cnt = parseInt(cnt);
}
// 0. if !columnCount && !columnWidth
if (cnt === 'auto' && width === 'auto') {
}
// 1. if columnCount = n then calc w.
else if (cnt !== 'auto' && width === 'auto') {
width = (ctWidth - (cnt - 1) * gap) / cnt;
}
// 2. if columnWidth = w then calc n.
else if (cnt === 'auto' && width !== 'auto') {
cnt = (ctWidth + gap) / (width + gap);
}
// 3. if columnWidth = w and columnCount = n then calc totalWidth
else if (cnt !== 'auto' && width !== 'auto') {
var totalWidth;
var adjustCountAndWidth = function () {
totalWidth = cnt * width + (cnt - 1) * gap;
if (totalWidth < ctWidth) {
width += (ctWidth - totalWidth) / cnt;
}
else if (totalWidth > ctWidth && cnt > 1) {
cnt--;
adjustCountAndWidth();
}
else if (totalWidth > ctWidth) { // cnt === 1
width = ctWidth;
}
};
adjustCountAndWidth();
}
this._columnCount = cnt;
this._columnWidth = width;
this._columnGap = gap;
},
_genColumns: function _genColumns (createElement) {
var this$1 = this;
this._columns = [];
var cells = this._cells;
var columnCnt = this._columnCount;
var len = cells.length;
var columnCells = this._columnCells = Array(columnCnt).join('.').split('.').map(function () { return [] });
// spread cells to the columns using simpole polling algorithm.
for (var i = 0; i < len; i++) {
(cells[i].data.attrs || (cells[i].data.attrs = {}))['data-cell'] = i;
columnCells[i % columnCnt].push(cells[i]);
}
for (var i$1 = 0; i$1 < columnCnt; i$1++) {
this$1._columns.push(createElement('html:div', {
ref: ("column" + i$1),
attrs: {
'data-column': i$1
},
staticClass: 'weex-ct',
staticStyle: {
width: this$1._columnWidth + 'px',
marginLeft: i$1 === 0 ? 0 : this$1._columnGap + 'px'
}
}, columnCells[i$1]));
}
},
_nextTick: function _nextTick () {
this._reLayoutChildren();
},
_reLayoutChildren: function _reLayoutChildren () {
var this$1 = this;
/**
* treat the shortest column bottom as the match standard.
* whichever cell exceeded it would be rearranged.
* 1. m = shortest column bottom.
* 2. get all cell ids who is below m.
* 3. calculate which cell should be in which column.
*/
var columnCnt = this._columnCount;
var columnDoms = [];
var columnAppendFragments = [];
var columnBottoms = [];
var minBottom = Number.MAX_SAFE_INTEGER;
var minBottomColumnIndex = 0;
// 1. find the shortest column bottom.
for (var i = 0; i < columnCnt; i++) {
var columnDom = this$1._columns[i].elm;
var lastChild = columnDom.lastElementChild;
var bottom = lastChild ? lastChild.getBoundingClientRect().bottom : 0;
columnDoms.push(columnDom);
columnBottoms[i] = bottom;
columnAppendFragments.push(document.createDocumentFragment());
if (bottom < minBottom) {
minBottom = bottom;
minBottomColumnIndex = i;
}
}
// 2. get all cell ids who is below m.
var belowCellIds = [];
var belowCells = {};
for (var i$1 = 0; i$1 < columnCnt; i$1++) {
if (i$1 === minBottomColumnIndex) {
continue
}
var columnDom$1 = columnDoms[i$1];
var cellsInColumn = columnDom$1.querySelectorAll('section.weex-cell');
var len = cellsInColumn.length;
for (var j = len - 1; j >= 0; j--) {
var cellDom = cellsInColumn[j];
var cellRect = cellDom.getBoundingClientRect();
if (cellRect.top > minBottom) {
var id = ~~cellDom.getAttribute('data-cell');
belowCellIds.push(id);
belowCells[id] = { elm: cellDom, height: cellRect.height };
columnBottoms[i$1] -= cellRect.height;
}
}
}
// 3. calculate which cell should be in which column and rearrange them
// in the dom tree.
belowCellIds.sort(function (a, b) { return a > b });
var cellIdsLen = belowCellIds.length;
function addToShortestColumn (belowCell) {
// find shortest bottom.
minBottom = Math.min.apply(Math, columnBottoms);
minBottomColumnIndex = columnBottoms.indexOf(minBottom);
var cellElm = belowCell.elm;
var cellHeight = belowCell.height;
columnAppendFragments[minBottomColumnIndex].appendChild(cellElm);
columnBottoms[minBottomColumnIndex] += cellHeight;
}
for (var i$2 = 0; i$2 < cellIdsLen; i$2++) {
addToShortestColumn(belowCells[belowCellIds[i$2]]);
}
for (var i$3 = 0; i$3 < columnCnt; i$3++) {
columnDoms[i$3].appendChild(columnAppendFragments[i$3]);
}
}
},
render: function render (createElement) {
var this$1 = this;
this.weexType = 'waterfall';
this._cells = this.$slots.default || [];
this.$nextTick(function () {
this$1.updateLayout();
});
var mergedStyle = extractComponentStyle(this);
return createElement('main', {
ref: 'wrapper',
attrs: { 'weex-type': 'waterfall' },
on: {
scroll: this.handleScroll,
touchstart: this.handleTouchStart,
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
},
staticClass: 'weex-waterfall weex-waterfall-wrapper weex-ct',
staticStyle: mergedStyle
}, this._createChildren(createElement, mergedStyle))
}
}
}
var waterfall = {
init: function init (weex) {
weex.registerComponent('waterfall', getWaterfall(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.
*/
function getHeader (weex) {
var extractComponentStyle = weex.extractComponentStyle;
return {
render: function render (createElement) {
var attrs = this.$vnode.data.attrs;
return createElement('html:header', {
attrs: {
'weex-type': 'header',
sticky: (
this.$parent.weexType === 'waterfall'
&& typeof attrs.sticky === 'undefined'
) ? undefined : ''
},
ref: 'header',
staticClass: 'weex-header weex-ct',
staticStyle: extractComponentStyle(this)
}, this.$slots.default)
}
}
}
var header = {
init: function init (weex) {
weex.registerComponent('header', getHeader(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.
*/
function getLoading () {
var extractComponentStyle = weex.extractComponentStyle;
var ref = weex.utils;
var dispatchNativeEvent = ref.dispatchNativeEvent;
return {
name: 'weex-loading',
props: {
display: {
type: String,
default: 'show',
validator: function validator (value) {
return ['show', 'hide'].indexOf(value) !== -1
}
}
},
data: function data () {
return {
height: -1,
viewHeight: 0
}
},
mounted: function mounted () {
this.viewHeight = this.$el.offsetHeight;
if (this.display === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
},
watch: {
height: function height (val) {
var offset = val + "px";
this.$el.style.height = offset;
this.$el.style.bottom = offset;
},
display: function display (val) {
if (val === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
}
},
methods: {
pulling: function pulling (offsetY) {
if ( offsetY === void 0 ) offsetY = 0;
this.height = offsetY;
},
pullingUp: function pullingUp (offsetY) {
this.$el.style.transition = "height 0s";
this.pulling(offsetY);
},
pullingEnd: function pullingEnd () {
this.$el && (this.$el.style.transition = "height .2s");
if (this.height >= this.viewHeight) {
this.pulling(this.viewHeight);
if (this.$el) {
dispatchNativeEvent(this.$el, 'loading');
}
}
else {
this.pulling(0);
}
},
getChildren: function getChildren () {
var children = this.$slots.default || [];
if (this.display === 'show') {
return children
}
return children.filter(function (vnode) {
return !(vnode.componentOptions
&& vnode.componentOptions.tag === 'loading-indicator')
})
}
},
render: function render (createElement) {
this.$parent._loading = this;
return createElement('aside', {
ref: 'loading',
attrs: { 'weex-type': 'loading' },
staticClass: 'weex-loading weex-ct',
staticStyle: extractComponentStyle(this)
}, this.getChildren())
}
}
}
var loading = {
init: function init (weex) {
weex.registerComponent('loading', getLoading(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.
*/
function getRefresh (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var ref = weex.utils;
var dispatchNativeEvent = ref.dispatchNativeEvent;
return {
name: 'weex-refresh',
props: {
display: {
type: String,
default: 'show',
validator: function validator (value) {
return ['show', 'hide'].indexOf(value) !== -1
}
}
},
data: function data () {
return {
lastDy: 0,
viewHeight: 0,
height: -1
}
},
mounted: function mounted () {
this.viewHeight = this.$el.offsetHeight;
if (this.display === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
},
watch: {
height: function height (val) {
this.$el.style.height = val + "px";
},
display: function display (val) {
if (val === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
}
},
methods: {
pulling: function pulling (offsetY) {
if ( offsetY === void 0 ) offsetY = 0;
this.height = offsetY;
if (this.$el) {
dispatchNativeEvent(this.$el, 'pullingdown', {
dy: offsetY - this.lastDy,
pullingDistance: offsetY,
viewHeight: this.viewHeight
});
}
this.lastDy = offsetY;
},
pullingDown: function pullingDown (offsetY) {
this.$el.style.transition = "height 0s";
this.pulling(offsetY);
},
pullingEnd: function pullingEnd () {
this.$el && (this.$el.style.transition = "height .2s");
if (this.height >= this.viewHeight) {
this.pulling(this.viewHeight);
if (this.$el) {
dispatchNativeEvent(this.$el, 'refresh');
}
}
else {
this.pulling(0);
}
},
getChildren: function getChildren () {
var children = this.$slots.default || [];
if (this.display === 'show') {
return children
}
return children.filter(function (vnode) {
return !(vnode.componentOptions
&& vnode.componentOptions.tag === 'loading-indicator')
})
}
},
render: function render (createElement) {
this.$parent._refresh = this;
return createElement('aside', {
ref: 'refresh',
attrs: { 'weex-type': 'refresh' },
staticClass: 'weex-refresh weex-ct',
staticStyle: extractComponentStyle(this)
}, this.getChildren())
}
}
}
var refresh = {
init: function init (weex) {
weex.registerComponent('refresh', getRefresh(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 extractComponentStyle$1;
var getRgb$1;
var loopArray$1;
var getStyleSheetById$1;
var _css = "\n.weex-refresh-indicator,\n.weex-loading-indicator {\n width: 1rem !important;\n height: 1rem !important;\n -webkit-box-align: center;\n -moz-box-align: center;\n -webkit-align-items: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -moz-box-pack: center;\n -webkit-justify-content: center;\n -ms-flex-pack: center;\n justify-content: center;\n overflow: visible;\n background: none;\n}\n.weex-refresh-indicator:before,\n.weex-loading-indicator:before {\n display: block;\n content: '';\n font-size: 0.16rem;\n width: 0.5em;\n height: 0.5em;\n left: 0;\n top: 0;\n border-radius: 50%;\n position: relative;\n text-indent: -9999em;\n -webkit-animation: weex-spinner 1.1s infinite ease;\n -moz-animation: weex-spinner 1.1s infinite ease;\n animation: weex-spinner 1.1s infinite ease;\n}\n\n@-webkit-keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -1.3em 0em 0em #ffffff, 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.5), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7);\n }\n 11.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.7), 0.9em -0.9em 0 0em #ffffff, 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.5), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7), 1.25em 0em 0 0em #ffffff, 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5), 1.25em 0em 0 0em rgba(255, 255, 255, 0.7), 0.875em 0.875em 0 0em #ffffff, 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.5), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.7), 0em 1.25em 0 0em #ffffff, -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 61.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.5), 0em 1.25em 0 0em rgba(255, 255, 255, 0.7), -0.9em 0.9em 0 0em #ffffff, -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.5), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.7), -1.3em 0em 0 0em #ffffff, -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.5), -1.3em 0em 0 0em rgba(255, 255, 255, 0.7), -0.9em -0.9em 0 0em #ffffff;\n }\n}\n\n@keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -1.3em 0em 0em #ffffff, 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.5), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7);\n }\n 11.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.7), 0.9em -0.9em 0 0em #ffffff, 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.5), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7), 1.25em 0em 0 0em #ffffff, 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5), 1.25em 0em 0 0em rgba(255, 255, 255, 0.7), 0.875em 0.875em 0 0em #ffffff, 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.5), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.7), 0em 1.25em 0 0em #ffffff, -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 61.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.5), 0em 1.25em 0 0em rgba(255, 255, 255, 0.7), -0.9em 0.9em 0 0em #ffffff, -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.5), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.7), -1.3em 0em 0 0em #ffffff, -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.5), -1.3em 0em 0 0em rgba(255, 255, 255, 0.7), -0.9em -0.9em 0 0em #ffffff;\n }\n}\n";
function getStyleSheet (spinnerVm) {
if (spinnerVm._styleSheet) {
return
}
spinnerVm._styleSheet = getStyleSheetById$1('weex-cmp-loading-indicator');
}
function setKeyframeColor (spinnerVm, val) {
getStyleSheet(spinnerVm);
var keyframeRules = computeKeyFrameRules(val);
var rules = spinnerVm._styleSheet.rules || spinnerVm._styleSheet.cssRules;
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 -1.3em 0em 0em',
'0.9em -0.9em 0 0em',
'1.25em 0em 0 0em',
'0.875em 0.875em 0 0em',
'0em 1.25em 0 0em',
'-0.9em 0.9em 0 0em',
'-1.3em 0em 0 0em',
'-0.9em -0.9em 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
}
function processStyle$1 (vm) {
var style = extractComponentStyle$1(vm);
var color = style.color;
var rgb = color && getRgb$1(color);
if (rgb) {
setKeyframeColor(vm, rgb);
}
return style
}
var loadingIndicator = {
name: 'weex-loading-indicator',
render: function render (createElement) {
this.weexType = 'loading-indicator';
return createElement('mark', {
attrs: { 'weex-type': 'loading-indicator' },
staticClass: 'weex-loading-indicator weex-ct',
staticStyle: processStyle$1(this)
})
},
_css: _css
};
var loadingIndicator$1 = {
init: function init (weex) {
extractComponentStyle$1 = weex.extractComponentStyle;
getRgb$1 = weex.utils.getRgb;
loopArray$1 = weex.utils.loopArray;
getStyleSheetById$1 = weex.utils.getStyleSheetById;
weex.registerComponent('loading-indicator', loadingIndicator);
}
};
/*
* 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 getList$1 (weex) {
var extractComponentStyle = weex.extractComponentStyle;
return {
name: 'weex-recycle-list',
mixins: [scrollable$1],
props: {
scrollDirection: {
type: [String],
default: 'vertical',
validator: function validator (value) {
return ['horizontal', 'vertical'].indexOf(value) !== -1
}
},
_items: Array,
_switch: String
},
computed: {
wrapperClass: function wrapperClass () {
var classArray = ['weex-recycle', 'weex-recycle-wrapper', 'weex-ct'];
this._refresh && classArray.push('with-refresh');
this._loading && classArray.push('with-loading');
if (this.scrollDirection === 'horizontal') {
classArray.push('weex-recycle-horizontal');
}
else {
classArray.push('weex-recycle-vertical');
}
return classArray.join(' ')
}
},
methods: {
createChildren: function createChildren (h) {
var _vm = this;
return [
h('article', {
ref: 'inner',
staticClass: 'weex-recycle-inner weex-ct'
}, [
_vm._l(_vm._items, function (item, index) {
return [
_vm._t(_vm.sloteName(item), null, {
item: item,
index: index
})
]
})
])
]
},
sloteName: function sloteName (item) {
if (this._switch && item[this._switch]) {
return item[this._switch]
}
else {
return 'default'
}
}
},
render: function render (createElement) {
var this$1 = this;
this.weexType = 'list';
this.$nextTick(function () {
this$1.updateLayout();
});
return createElement('main', {
ref: 'wrapper',
attrs: { 'weex-type': 'recycle-list' },
staticClass: this.wrapperClass,
on: {
scroll: this.handleScroll,
touchstart: this.handleTouchStart,
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
},
staticStyle: extractComponentStyle(this)
}, this.createChildren(createElement))
}
}
}
var recycleList = {
init: function init (weex) {
weex.registerComponent('recycle-list', getList$1(weex));
}
};
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nbody > .weex-list,\nbody > .weex-recycle,\nbody > .weex-scroller,\nbody > .weex-waterfall {\n max-height: 100%;\n}\n\n.weex-list-wrapper,\n.weex-recycle-wrapper,\n.weex-scroller-wrapper,\n.weex-waterfall-wrapper {\n -webkit-overflow-scrolling: touch;\n}\n\n.weex-list-wrapper,\n.weex-waterfall-wrapper {\n overflow-y: scroll !important;\n overflow-x: hidden !important;\n}\n\n.weex-list-inner,\n.weex-recycle-inner,\n.weex-scroller-inner,\n.weex-waterfall-inner {\n -webkit-overflow-scrolling: touch;\n}\n\n.weex-waterfall-inner-columns {\n -webkit-flex-direction: row;\n flex-direction: row;\n -webkit-box-orient: horizontal;\n}\n\n.weex-scroller-wrapper.weex-scroller-vertical,\n.weex-recycle-wrapper.weex-recycle-vertical {\n overflow-x: hidden;\n overflow-y: scroll;\n}\n\n.weex-scroller-wrapper.weex-scroller-horizontal,\n.weex-recycle-wrapper.weex-recycle-horizontal {\n overflow-x: scroll;\n overflow-y: hidden;\n}\n\n.weex-scroller-wrapper.weex-scroller-disabled {\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.weex-scroller-horizontal .weex-scroller-inner,\n.weex-recycle-horizontal .weex-recycle-inner {\n -webkit-flex-direction: row;\n flex-direction: row;\n -webkit-box-orient: horizontal;\n height: 100%;\n}\n\n.weex-cell {\n width: 100%;\n}\n\n.weex-refresh,\n.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 width: 100%;\n overflow: hidden;\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.
*/
// import cell from './cell'
var modules = [
list,
scroller,
waterfall,
// cell,
header,
loading,
refresh,
loadingIndicator$1,
recycleList
];
var scrollable = {
init: function init (weex) {
modules.forEach(function (mod) {
weex.install(mod);
});
}
};
/*
* 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 TRANSITION_TIME = 400;
var NEIGHBOR_SCALE_TIME = 100;
var MAIN_SLIDE_OPACITY = 1;
var THROTTLE_SCROLL_TIME = 25;
var INTERVAL_MINIMUM = 200;
var slideMixin = {
created: function created () {
this._clones = [];
this.innerOffset = 0;
this._indicator = null;
},
beforeUpdate: function beforeUpdate () {
this._getWrapperSize();
},
updated: function updated () {
var this$1 = this;
var children = this.$children;
var len = children && children.length;
if (children && len > 0) {
for (var i = 0; i < len; i++) {
var vm = children[i];
if (vm.$options._componentTag === 'indicator'
|| vm.$vnode.data.ref === 'indicator') {
vm._watcher.get();
break
}
}
}
var frameCount = this.frameCount;
if (!this._preFrameCount) {
this._preFrameCount = frameCount;
}
else if (this._preFrameCount !== frameCount) {
this._resetNodes();
this._preFrameCount = frameCount;
var resetBlankFrame = function () {
if (this$1.currentIndex >= frameCount) {
// reset blank page.
this$1._stopAutoPlay();
this$1._slideTo(0);
}
};
if (this._sliding) {
// If it's sliding, then the currentIndex is the last frame. The actual currentIndex
// should be the next index.
// That is to say, this updating happens Between _parepareNodes and _rearrangeNodes,
// and the sliding is not yet finished, and the state is not updated yet.
setTimeout(resetBlankFrame, TRANSITION_TIME + NEIGHBOR_SCALE_TIME);
}
else {
resetBlankFrame();
}
}
weex.utils.fireLazyload(this.$el, true);
if (this._preIndex !== this.currentIndex) {
this._slideTo(this.currentIndex);
}
},
mounted: function mounted () {
this._getWrapperSize();
this._slideTo(this.currentIndex);
weex.utils.fireLazyload(this.$el, true);
},
methods: {
_getWrapperSize: function _getWrapperSize () {
var wrapper = this.$refs.wrapper;
if (wrapper) {
var rect = wrapper.getBoundingClientRect();
this._wrapperWidth = rect.width;
this._wrapperHeight = rect.height;
}
},
_formatChildren: function _formatChildren (createElement) {
var this$1 = this;
var children = this.$slots.default || [];
var indicatorVnode;
var cells = children.filter(function (vnode) {
if (!vnode.tag) { return false }
if (vnode.componentOptions && vnode.componentOptions.tag === 'indicator') {
indicatorVnode = vnode;
return false
}
return true
}).map(function (vnode) {
return createElement('li', {
ref: 'cells',
staticClass: ("weex-slider-cell weex-ct" + (this$1.isNeighbor ? ' neighbor-cell' : ''))
}, [vnode])
});
if (indicatorVnode) {
indicatorVnode.data.attrs = indicatorVnode.data.attrs || {};
indicatorVnode.data.attrs.count = cells.length;
indicatorVnode.data.attrs.active = this.currentIndex;
this._indicator = indicatorVnode;
}
return cells
},
_renderSlides: function _renderSlides (createElement) {
this._cells = this._formatChildren(createElement);
this.frameCount = this._cells.length;
return createElement(
'nav',
{
ref: 'wrapper',
attrs: { 'weex-type': this.isNeighbor ? 'slider-neighbor' : 'slider' },
on: {
touchstart: this._handleTouchStart,
touchmove: weex.utils.throttle(weex.utils.bind(this._handleTouchMove, this), 25),
touchend: this._handleTouchEnd,
touchcancel: this._handleTouchCancel
},
staticClass: 'weex-slider weex-slider-wrapper weex-ct',
staticStyle: weex.extractComponentStyle(this)
},
[
createElement('ul', {
ref: 'inner',
staticClass: 'weex-slider-inner weex-ct'
}, this._cells),
this._indicator
]
)
},
// get standard index
_normalizeIndex: function _normalizeIndex (index) {
var newIndex = (index + this.frameCount) % this.frameCount;
return Math.min(Math.max(newIndex, 0), this.frameCount - 1)
},
_startAutoPlay: function _startAutoPlay () {
if (!this.autoPlay || this.autoPlay === 'false') {
return
}
if (this._autoPlayTimer) {
clearTimeout(this._autoPlayTimer);
this._autoPlayTimer = null;
}
var interval = parseInt(this.interval - TRANSITION_TIME - NEIGHBOR_SCALE_TIME);
interval = interval > INTERVAL_MINIMUM ? interval : INTERVAL_MINIMUM;
this._autoPlayTimer = setTimeout(weex.utils.bind(this._next, this), interval);
},
_stopAutoPlay: function _stopAutoPlay () {
if (this._autoPlayTimer) {
clearTimeout(this._autoPlayTimer);
this._autoPlayTimer = null;
}
},
_slideTo: function _slideTo (index, isTouchScroll) {
var this$1 = this;
if (this.frameCount <= 0) {
return
}
if (!this.infinite || this.infinite === 'false') {
if (index === -1 || index > (this.frameCount - 1)) {
this._slideTo(this.currentIndex);
return
}
}
if (!this._preIndex && this._preIndex !== 0) {
if (this._showNodes && this._showNodes[0]) {
this._preIndex = this._showNodes[0].index;
}
else {
this._preIndex = this.currentIndex;
}
}
if (this._sliding) {
return
}
this._sliding = true;
var newIndex = this._normalizeIndex(index);
var inner = this.$refs.inner;
var step = this._step = this.frameCount <= 1 ? 0 : this._preIndex - index;
if (inner) {
this._prepareNodes();
var translate = weex.utils.getTransformObj(inner).translate;
var match = translate && translate.match(/translate[^(]+\(([+-\d.]+)/);
var innerX = match && match[1] || 0;
var dist = innerX - this.innerOffset;
this.innerOffset += step * this._wrapperWidth;
// transform the whole slides group.
inner.style.webkitTransition = "-webkit-transform " + (TRANSITION_TIME / 1000) + "s ease-in-out";
inner.style.mozTransition = "transform " + (TRANSITION_TIME / 1000) + "s ease-in-out";
inner.style.transition = "transform " + (TRANSITION_TIME / 1000) + "s ease-in-out";
inner.style.webkitTransform = "translate3d(" + (this.innerOffset) + "px, 0, 0)";
inner.style.mozTransform = "translate3d(" + (this.innerOffset) + "px, 0, 0)";
inner.style.transform = "translate3d(" + (this.innerOffset) + "px, 0, 0)";
// emit scroll events.
if (!isTouchScroll) {
this._emitScrollEvent('scrollstart');
}
setTimeout(function () {
this$1._throttleEmitScroll(dist, function () {
this$1._emitScrollEvent('scrollend');
});
}, THROTTLE_SCROLL_TIME);
this._loopShowNodes(step);
setTimeout(function () {
if (this$1.isNeighbor) {
this$1._setNeighbors();
}
setTimeout(function () {
inner.style.webkitTransition = '';
inner.style.mozTransition = '';
inner.style.transition = '';
for (var i = this$1._showStartIdx; i <= this$1._showEndIdx; i++) {
var node = this$1._showNodes[i];
if (!node) { continue }
var elm = node.firstElementChild;
elm.style.webkitTransition = '';
elm.style.mozTransition = '';
elm.style.transition = '';
}
// clean cloned nodes and rearrange slide cells.
this$1._rearrangeNodes(newIndex);
}, NEIGHBOR_SCALE_TIME);
}, TRANSITION_TIME);
}
if (newIndex !== this._preIndex) {
weex.utils.dispatchNativeEvent(this.$el, 'change', {
index: newIndex
});
}
},
_clearNodesOffset: function _clearNodesOffset () {
var this$1 = this;
var end = this._showEndIdx;
for (var i = this._showStartIdx; i <= end; i++) {
var node = this$1._showNodes[i];
node = node && node.firstElementChild;
if (!node) { continue }
weex.utils.addTransform(this$1._showNodes[i].firstElementChild, {
translate: 'translate3d(0px, 0px, 0px)'
});
}
},
_loopShowNodes: function _loopShowNodes (step) {
var this$1 = this;
if (!step || this.frameCount <= 1) {
return
}
var sign = step > 0 ? 1 : -1;
var i = step <= 0 ? this._showStartIdx : this._showEndIdx;
var end = step <= 0 ? this._showEndIdx : this._showStartIdx;
for (; i !== end - sign; i -= sign) {
var nextIdx = i + step;
this$1._showNodes[nextIdx] = this$1._showNodes[i];
this$1._showNodes[nextIdx]._showIndex = nextIdx;
delete this$1._showNodes[i];
}
this._showStartIdx += step;
this._showEndIdx += step;
},
_prepareNodes: function _prepareNodes () {
// test if the next slide towards the direction exists.
// e.g. currentIndex 0 -> 1: should prepare 4 slides: -1, 0, 1, 2
// if not, translate a node to here, or just clone it.
var step = this._step;
if (!this._inited) {
this._initNodes();
this._inited = true;
this._showNodes = {};
}
if (this.frameCount <= 1) {
this._showStartIdx = this._showEndIdx = 0;
var node = this._cells[0].elm;
node.style.opacity = 1;
node.style.zIndex = 99;
node.index = 0;
this._showNodes[0] = node;
node._inShow = true;
node._showIndex = 0;
return
}
var showCount = this._showCount = Math.abs(step) + 3;
this._showStartIdx = step <= 0 ? -1 : 2 - showCount;
this._showEndIdx = step <= 0 ? showCount - 2 : 1;
this._clearNodesOffset();
this._positionNodes(this._showStartIdx, this._showEndIdx, step);
},
_clearClones: function _clearClones () {
var this$1 = this;
// clear all clones.
Object.keys(this._clones).forEach(function (key) {
this$1._clones[key].forEach(function (cloneNode) {
cloneNode.parentNode.removeChild(cloneNode);
});
this$1._clones[key] = [];
});
},
// reset nodes' index and _inShow state. But leave the styles
// as they are to prevent dom rerendering.
_resetNodes: function _resetNodes () {
this._clearClones();
// reset status.
this._cells.forEach(function (cell, idx) {
var elm = cell.elm;
elm.index = idx;
elm._inShow = false;
});
},
_initNodes: function _initNodes () {
this._cells.forEach(function (cell, idx) {
var node = cell.elm;
node.index = idx;
node._inShow = false;
node.style.zIndex = 0;
node.style.opacity = 0;
});
},
_positionNodes: function _positionNodes (begin, end, step, anim) {
var this$1 = this;
var cells = this._cells;
var start = step <= 0 ? begin : end;
var stop = step <= 0 ? end : begin;
var sign = step <= 0 ? -1 : 1;
var cellIndex = this._preIndex + sign;
for (var i = start; i !== stop - sign; i = i - sign) {
var node = cells[this$1._normalizeIndex(cellIndex)].elm;
cellIndex = cellIndex - sign;
this$1._positionNode(node, i);
}
},
/**
* index: position index in the showing cells' view.
*/
_positionNode: function _positionNode (node, index) {
var holder = this._showNodes[index];
if (node._inShow && (holder !== node || holder._showIndex !== index)) {
if (holder && holder._isClone) { this._removeClone(holder); }
node = this._getClone(node.index);
}
else if (node._inShow) { // holder === node
return
}
node._inShow = true;
var translateX = index * this._wrapperWidth - this.innerOffset;
weex.utils.addTransform(node, {
translate: ("translate3d(" + translateX + "px, 0px, 0px)")
});
node.style.zIndex = 99 - Math.abs(index);
node.style.opacity = 1;
node._showIndex = index;
this._showNodes[index] = node;
},
_getClone: function _getClone (index) {
var arr = this._clones[index] || (this._clones[index] = []);
var origNode = this._cells[index].elm;
var clone = origNode.cloneNode(true);
clone._isClone = true;
clone._inShow = true;
// clone._inShow = origNode._inShow
clone.index = origNode.index;
clone.style.opacity = 0;
clone.style.zIndex = 0;
this.$refs.inner.appendChild(clone);
arr.push(clone);
return clone
// try {
// let arr = this._clones[index]
// if (!arr) {
// this._clones[index] = arr = []
// }
// if (arr.length <= 0) {
// }
// return arr.pop()
// } catch (err) {
// console.error('this._cells -> ', this._cells)
// }
},
_removeClone: function _removeClone (node) {
var cloneArr = this._clones[node.index];
var i;
if (cloneArr && (i = cloneArr.indexOf(node)) > -1) {
cloneArr.splice(i, 1);
}
try {
node.parentNode.removeChild(node);
}
catch (err) {
// maybe cells has been updated and this clone node is already removed from the dom tree
// throught _clearClones method.
}
// const idx = node.index
// this._hideNode(node)
// const arr = this._clones[idx]
// arr.push(node)
},
_hideNode: function _hideNode (node) {
node._inShow = false;
node.style.opacity = 0;
node.style.zIndex = 0;
},
/**
* hide nodes from begin to end in showArray.
* if it is clone node, just move the clone node to the buffer.
*/
_clearNodes: function _clearNodes (begin, end) {
var this$1 = this;
for (var i = begin; i <= end; i++) {
var node = this$1._showNodes[i];
if (!node) { return }
if (node._isClone) {
this$1._removeClone(node);
}
else if (!node._inShow) {
this$1._hideNode(node);
}
delete this$1._showNodes[i];
}
},
/**
* copy node style props (opacity and zIndex) and transform status from
* one element to another.
*/
_copyStyle: function _copyStyle (from, to, styles, transformExtra) {
if ( styles === void 0 ) styles = ['opacity', 'zIndex'];
if ( transformExtra === void 0 ) transformExtra = {};
weex.utils.extendKeys(to.style, from.style, styles);
var transObj = weex.utils.getTransformObj(from);
for (var k in transformExtra) {
transObj[k] = transformExtra[k];
}
weex.utils.addTransform(to, transObj);
var fromInner = from.firstElementChild;
var toInner = to.firstElementChild;
toInner.style.opacity = fromInner.style.opacity;
weex.utils.copyTransform(fromInner, toInner);
},
/**
* replace a clone node with the original node if it's not in use.
*/
_replaceClone: function _replaceClone (clone, pos) {
var this$1 = this;
var origCell = this._cells[clone.index];
if (!origCell) {
return
}
var origNode = origCell.elm;
if (origNode._inShow) {
return
}
var origShowIndex = origNode._showIndex;
var styleProps = ['opacity', 'zIndex'];
var cl;
if (Math.abs(origShowIndex) <= 1) {
// leave a clone to replace the origNode in the show zone(-1 ~ 1).
cl = this._getClone(origNode.index);
this._copyStyle(origNode, cl);
this._showNodes[origShowIndex] = cl;
}
origNode._inShow = true;
var transObj = weex.utils.getTransformObj(clone);
transObj.translate = transObj.translate.replace(/[+-\d.]+[pw]x/, function ($0) {
return pos * this$1._wrapperWidth - this$1.innerOffset + 'px'
});
this._copyStyle(clone, origNode, styleProps, transObj);
this._removeClone(clone);
if (!cl) {
delete this._showNodes[origShowIndex];
}
this._showNodes[pos] = origNode;
origNode._showIndex = pos;
},
_rearrangeNodes: function _rearrangeNodes (newIndex) {
var this$1 = this;
if (this.frameCount <= 1) {
this._sliding = false;
this.currentIndex = 0;
return
}
// clear autoPlay timer (and restart after updated hook).
this._startAutoPlay();
/**
* clean nodes. replace current node with non-cloned node.
* set current index to the new index.
*/
var shows = this._showNodes;
for (var i = this._showStartIdx; i <= this._showEndIdx; i++) {
shows[i]._inShow = false;
}
for (var i$1 = -1; i$1 <= 1; i$1++) {
var node = shows[i$1];
if (!node._isClone) {
node._inShow = true;
}
else {
this$1._replaceClone(node, i$1);
}
}
this._clearNodes(this._showStartIdx, -2);
this._showStartIdx = -1;
this._clearNodes(2, this._showEndIdx);
this._showEndIdx = 1;
this._sliding = false;
// set current index to the new index.
this.currentIndex = newIndex;
this._preIndex = newIndex;
},
/**
* according to the attrs: neighborScale, neighborAlpha, neighborSpace.
* 1. apply the main cell transform effects.
* 2. set the previous cell and the next cell's positon, scale and alpha.
* 3. set other cells' scale and alpha.
*/
_setNeighbors: function _setNeighbors () {
var this$1 = this;
for (var i = this._showStartIdx; i <= this._showEndIdx; i++) {
var elm = this$1._showNodes[i].firstElementChild;
elm.style.webkitTransition = "all " + (NEIGHBOR_SCALE_TIME / 1000) + "s ease";
elm.style.mozTransition = "all " + (NEIGHBOR_SCALE_TIME / 1000) + "s ease";
elm.style.transition = "all " + (NEIGHBOR_SCALE_TIME / 1000) + "s ease";
var transObj = {
scale: ("scale(" + (i === 0 ? this$1.currentItemScale : this$1.neighborScale) + ")")
};
var translateX = (void 0);
if (!this$1._neighborWidth) {
this$1._neighborWidth = parseFloat(elm.style.width) || elm.getBoundingClientRect().width;
}
// calculate position offsets according to neighbor scales.
if (Math.abs(i) === 1) {
var dist = ((this$1._wrapperWidth - this$1._neighborWidth * this$1.neighborScale) / 2
+ this$1.neighborSpace * weex.config.env.scale) / this$1.neighborScale;
translateX = -i * dist;
}
else {
// clear position offsets.
translateX = 0;
}
transObj.translate = "translate3d(" + translateX + "px, 0px, 0px)";
weex.utils.addTransform(elm, transObj);
elm.style.opacity = i === 0 ? MAIN_SLIDE_OPACITY : this$1.neighborAlpha;
}
},
_next: function _next () {
var next = this.currentIndex + 1;
if (this.frameCount <= 1) {
next--;
}
this._slideTo(next);
},
_prev: function _prev () {
var prev = this.currentIndex - 1;
if (this.frameCount <= 1) {
prev++;
}
this._slideTo(prev);
},
_handleTouchStart: function _handleTouchStart (event) {
var touch = event.changedTouches[0];
this._stopAutoPlay();
var inner = this.$refs.inner;
this._touchParams = {
originalTransform: inner.style.webkitTransform
|| inner.style.mozTransform
|| inner.style.transform,
startTouchEvent: touch,
startX: touch.pageX,
startY: touch.pageY,
timeStamp: event.timeStamp
};
},
_handleTouchMove: function _handleTouchMove (event) {
var tp = this._touchParams;
if (!tp) { return }
if (this._sliding) {
return
}
var ref = this._touchParams;
var startX = ref.startX;
var startY = ref.startY;
var touch = event.changedTouches[0];
var offsetX = touch.pageX - startX;
var offsetY = touch.pageY - startY;
tp.offsetX = offsetX;
tp.offsetY = offsetY;
var isV = tp.isVertical;
if (typeof isV === 'undefined') {
isV = tp.isVertical = Math.abs(offsetX) < Math.abs(offsetY);
if (!isV) {
this._emitScrollEvent('scrollstart');
}
}
// vertical scroll. just ignore it.
if (isV) {
return
}
// horizontal scroll. trigger scroll event.
event.preventDefault();
var inner = this.$refs.inner;
if (inner && offsetX) {
if (!this._nodesOffsetCleared) {
this._nodesOffsetCleared = true;
this._clearNodesOffset();
}
this._emitScrollEvent('weex$scroll', {
offsetXRatio: offsetX / this._wrapperWidth
});
inner.style.webkitTransform = "translate3d(" + (this.innerOffset + offsetX) + "px, 0, 0)";
inner.style.mozTransform = "translate3d(" + (this.innerOffset + offsetX) + "px, 0, 0)";
inner.style.transform = "translate3d(" + (this.innerOffset + offsetX) + "px, 0, 0)";
}
},
_handleTouchEnd: function _handleTouchEnd (event) {
this._startAutoPlay();
var tp = this._touchParams;
if (!tp) { return }
var isV = tp.isVertical;
if (typeof isV === 'undefined') {
return
}
var inner = this.$refs.inner;
var offsetX = tp.offsetX;
if (inner) {
this._nodesOffsetCleared = false;
// TODO: test the velocity if it's less than 0.2.
var reset = Math.abs(offsetX / this._wrapperWidth) < 0.2;
var direction = offsetX > 0 ? 1 : -1;
var newIndex = reset ? this.currentIndex : (this.currentIndex - direction);
this._slideTo(newIndex, true);
}
delete this._touchParams;
},
_handleTouchCancel: function _handleTouchCancel (event) {
return this._handleTouchEnd(event)
},
_emitScrollEvent: function _emitScrollEvent (type, data) {
if ( data === void 0 ) data = {};
var el = this.$el;
if (el) {
weex.utils.dispatchNativeEvent(el, type, data);
}
},
_throttleEmitScroll: function _throttleEmitScroll (offset, callback) {
var this$1 = this;
var i = 0;
var throttleTime = THROTTLE_SCROLL_TIME;
var cnt = parseInt(TRANSITION_TIME / throttleTime) - 1;
var sign = offset > 0 ? 1 : -1;
var r = Math.abs(offset / this._wrapperWidth);
var throttledScroll = function () {
if (++i > cnt) {
return callback && callback.call(this$1)
}
var ratio = this$1._step === 0
? sign * r * (1 - i / cnt)
: sign * (r + (1 - r) * i / cnt);
this$1._emitScrollEvent('weex$scroll', {
offsetXRatio: ratio
});
setTimeout(throttledScroll, THROTTLE_SCROLL_TIME);
};
throttledScroll();
}
}
};
/*
* 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 { validateStyles } from '../../validator'
// import indicator from './indicator'
var slider$1 = {
mixins: [slideMixin],
props: {
index: {
type: [String, Number],
default: 0
},
'auto-play': {
type: [String, Boolean],
default: false
},
interval: {
type: [String, Number],
default: 3000
},
infinite: {
type: [String, Boolean],
default: true
}
},
watch: {
index: function index () {
this.currentIndex = this._normalizeIndex(this.index);
}
},
data: function data () {
return {
frameCount: 0,
currentIndex: this.index
}
},
beforeCreate: function beforeCreate () {
this.weexType = 'slider';
},
render: function render (createElement) {
/* istanbul ignore next */
// if ("production" === 'development') {
// validateStyles('slider', this.$vnode.data && this.$vnode.data.staticStyle)
// }
return this._renderSlides(createElement)
}
};
var slider$2 = {
init: function init (weex) {
weex.registerComponent('slider', slider$1);
weex.registerComponent('cycleslider', slider$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 DEFAULT_NEIGHBOR_SPACE = 20;
var DEFAULT_NEIGHBOR_ALPHA = 0.6;
var DEFAULT_NEIGHBOR_SCALE = 0.8;
var DEFAULT_CURRENT_ITEM_SCALE = 0.9;
var sliderNeighbor = {
mixins: [slideMixin],
props: {
index: {
type: [String, Number],
default: 0
},
autoPlay: {
type: [String, Boolean],
default: false
},
interval: {
type: [String, Number],
default: 3000
},
infinite: {
type: [String, Boolean],
default: true
},
neighborSpace: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val > 0
},
default: DEFAULT_NEIGHBOR_SPACE
},
neighborAlpha: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val >= 0 && val <= 1
},
default: DEFAULT_NEIGHBOR_ALPHA
},
neighborScale: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val >= 0 && val <= 1
},
default: DEFAULT_NEIGHBOR_SCALE
},
currentItemScale: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val >= 0 && val <= 1
},
default: DEFAULT_CURRENT_ITEM_SCALE
}
},
watch: {
index: function index () {
this.currentIndex = this._normalizeIndex(this.index);
}
},
data: function data () {
return {
currentIndex: this.index,
frameCount: 0
}
},
beforeCreate: function beforeCreate () {
this.isNeighbor = true;
this.weexType = 'slider-neighbor';
},
render: function render (createElement) {
return this._renderSlides(createElement)
}
};
var neighbor = {
init: function init (weex) {
weex.registerComponent('slider-neighbor', sliderNeighbor);
}
};
/*
* 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 getComponentInlineStyle$1;
function getIndicatorItemStyle (ms, isActive) {
var style = {};
var bgColor = isActive
? ms['itemSelectedColor'] || ms['item-selected-color']
: ms['itemColor'] || ms['item-color'];
style['background-color'] = bgColor;
style['width'] = style['height'] = ms['itemSize'] || ms['item-size'];
return style
}
function getScopeIds (context) {
var scopeIds = context._scopeIds;
if (scopeIds) {
return scopeIds
}
else {
scopeIds = [];
}
var parent = context.$parent;
while (parent) {
var i = (void 0);
if ((i = parent.$options) && (i = i._scopeId)) {
scopeIds.push(i);
}
parent = parent.$parent;
}
context._scopeIds = scopeIds;
return scopeIds
}
function _render (context, h) {
var children = [];
var mergedStyle = getComponentInlineStyle$1(context);
var scopeIds = getScopeIds(context);
var attrs = {};
for (var i = 0, l = scopeIds.length; i < l; i++) {
attrs[scopeIds[i]] = '';
}
for (var i$1 = 0; i$1 < Number(context.count); ++i$1) {
var classNames = ['weex-indicator-item weex-el'];
var isActive = false;
if (i$1 === Number(context.active)) {
classNames.push('weex-indicator-item-active');
isActive = true;
}
children.push(h('mark', {
attrs: attrs,
staticClass: classNames.join(' '),
staticStyle: getIndicatorItemStyle(mergedStyle, isActive)
}));
}
return h('nav', {
attrs: { 'weex-type': 'indicator' },
staticClass: 'weex-indicator weex-ct'
}, [
// the indicator nav may cover the slides, and may stop the
// click event be triggered on the slides.
// so a smaller wrapper is needed to prevent the overlap.
// This wrapper will cover only the whole size of all the
// indicator pointers' item-sizes.
h('div', {
staticClass: 'weex-indicator-inner'
}, children)
])
}
var indicator = {
name: 'weex-indicator',
methods: {
show: function () {
this.$el.style.visibility = 'visible';
}
},
props: {
itemColor: [String],
itemSelectedColor: [String],
itemSize: [String]
},
data: function data () {
return {
count: 0,
active: 0
}
},
render: function render (createElement) {
var ref = this.$vnode.data.attrs || {};
var count = ref.count;
var active = ref.active;
this.count = count;
this.active = active;
if (!this.count) { return }
return _render(this, createElement)
}
};
var indicator$1 = {
init: function init (weex) {
getComponentInlineStyle$1 = weex.getComponentInlineStyle;
weex.registerComponent('indicator', indicator);
}
};
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n \n.weex-slider-wrapper {\n overflow: hidden;\n}\n\n.weex-slider-inner {\n width: 100%;\n height: 100%;\n overflow: visible;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n flex-direction: row;\n}\n\n.weex-slider-cell {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0px;\n left: 0px;\n background: transparent !important;\n overflow: hidden;\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\n.neighbor-cell {\n overflow: visible !important;\n}\n\nnav.weex-indicator {\n position: absolute;\n z-index: 10;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n flex-direction: row;\n margin: 0;\n padding: 0;\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 -webkit-transform: translate(-10rem, 0px);\n transform: translate(-10rem, 0px)\n}\n\ndiv.weex-indicator-inner {\n -webkit-transform: translate(10rem, 0px);\n transform: translate(10rem, 0px);\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n flex-direction: row;\n}\n\n.weex-indicator-item {\n display: inline-block;\n position: relative;\n border-radius: 50%;\n width: 0.266667rem;\n height: 0.266667rem;\n background-color: #BBBBBB;\n}\n.weex-indicator-item + .weex-indicator-item {\n margin-left: 0.133333rem;\n}\n\n.weex-indicator-item-active {\n background-color: blue;\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 slider = {
init: function init (weex) {
weex.install(slider$2);
weex.install(neighbor);
weex.install(indicator$1);
}
};
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n.weex-textarea {\n font-size: 0.426667rem\n}\n.weex-textarea:focus {\n outline: none;\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.
*/
function getTextarea (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var ref = weex.mixins;
var inputCommon = ref.inputCommon;
var ref$1 = weex.utils;
var extend = ref$1.extend;
var mapFormEvents = ref$1.mapFormEvents;
return {
name: 'weex-textarea',
mixins: [inputCommon],
props: {
value: String,
placeholder: String,
disabled: {
type: [String, Boolean],
default: false
},
autofocus: {
type: [String, Boolean],
default: false
},
rows: {
type: [String, Number],
default: 2
},
returnKeyType: String
},
render: function render (createElement) {
/* istanbul ignore next */
// if ("production" === 'development') {
// validateStyles('textarea', this.$vnode.data && this.$vnode.data.staticStyle)
// }
var events = extend(mapFormEvents(this));
return createElement('html:textarea', {
attrs: {
'weex-type': 'textarea',
value: this.value,
disabled: (this.disabled !== 'false' && this.disabled !== false),
autofocus: (this.autofocus !== 'false' && this.autofocus !== false),
placeholder: this.placeholder,
rows: this.rows,
'return-key-type': this.returnKeyType
},
domProps: {
value: this.value
},
on: this.createKeyboardEvent(events),
staticClass: 'weex-textarea weex-el',
staticStyle: extractComponentStyle(this)
})
}
}
}
var textarea = {
init: function init (weex) {
weex.registerComponent('textarea', getTextarea(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.
*/
function getVideo (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var mapNativeEvents = weex.mapNativeEvents;
var ref = weex.utils;
var dispatchNativeEvent = ref.dispatchNativeEvent;
return {
name: 'weex-video',
props: {
src: String,
playStatus: {
type: String,
default: 'pause',
validator: function validator (value) {
return ['play', 'pause'].indexOf(value) !== -1
}
},
autoplay: {
type: [String, Boolean],
default: false
},
autoPlay: {
type: [String, Boolean],
default: false
},
playsinline: {
type: [String, Boolean],
default: true
},
controls: {
type: [String, Boolean],
default: false
}
},
render: function render (createElement) {
if (this.playStatus === 'play') {
this.$nextTick(function () {
try {
this.$el && this.$el.play();
}
catch (err) {
dispatchNativeEvent(this && this.$el, 'error', {
message: err.message
});
}
});
}
else if (this.playStatus === 'pause') {
this.$nextTick(function () {
this.$el && this.$el.pause();
});
}
return createElement('html:video', {
attrs: {
'weex-type': 'video',
autoplay: ((this.autoplay !== 'false' && this.autoplay !== false)
|| (this.autoPlay !== 'false' && this.autoPlay !== false)),
'webkit-playsinline': this.playsinline,
controls: this.controls,
src: this.src
},
on: mapNativeEvents(this, {
play: 'start',
error: 'fail'
}),
staticClass: 'weex-video weex-el',
staticStyle: extractComponentStyle(this)
})
}
}
}
var video = {
init: function init (weex) {
weex.registerComponent('video', getVideo(weex));
}
};
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n.weex-web {\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\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.
*/
function getWeb (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var ref = weex.utils;
var dispatchNativeEvent = ref.dispatchNativeEvent;
return {
data: function data () {
return {
currentSrc: ''
}
},
name: 'weex-web',
props: {
src: String
},
watch: {
src: function src (newVal) {
this.currentSrc = newVal;
}
},
methods: {
goBack: function goBack () {
var el = this.$el;
if (el) {
var win = el.contentWindow;
try {
win.history.back();
this.currentSrc = win.location.href;
}
catch (err) {
dispatchNativeEvent(el, 'error', err);
}
}
},
goForward: function goForward () {
var el = this.$el;
if (el) {
var win = el.contentWindow;
try {
win.history.forward();
this.currentSrc = win.location.href;
}
catch (err) {
dispatchNativeEvent(el, 'error', err);
}
}
},
reload: function reload () {
var el = this.$el;
if (el) {
try {
el.contentWindow.location.reload();
dispatchNativeEvent(el, 'pagestart', { url: this.currentSrc });
}
catch (err) {
dispatchNativeEvent(el, 'error', err);
}
}
}
},
created: function created () {
this.currentSrc = this.src;
},
mounted: function mounted () {
var el = this.$el;
this._prevSrc = this.currentSrc;
if (el) {
dispatchNativeEvent(el, 'pagestart', { url: this.currentSrc });
}
},
updated: function updated () {
if (this.currentSrc !== this._prevSrc) {
this._prevSrc = this.currentSrc;
dispatchNativeEvent(this.$el, 'pagestart', { url: this.currentSrc });
}
},
render: function render (createElement) {
var this$1 = this;
return createElement('iframe', {
attrs: {
'weex-type': 'web',
src: this.currentSrc
},
on: {
load: function (event) {
this$1.$nextTick(function () {
var el = this.$el;
try {
var html = el.contentWindow.document.documentElement;
if (html) {
dispatchNativeEvent(el, 'pagefinish', { url: this.currentSrc });
}
else {
dispatchNativeEvent(el, 'error', new Error('[vue-render]:found no page content.'));
}
}
catch (err) {
dispatchNativeEvent(el, 'error', err);
}
});
}
},
staticClass: 'weex-web weex-el',
staticStyle: extractComponentStyle(this)
})
}
}
}
var web = {
init: function init (weex) {
weex.registerComponent('web', getWeb(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.
*/
// import a from './a'
// import div from './div'
// import image from './image'
// import text from './text'
var components = [
// a,
// div,
// image,
input,
_switch,
scrollable,
slider,
// text,
textarea,
video,
web
];
/*
* 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 = {
geolocation: [{
name: 'getCurrentPosition',
args: ['function', 'function', 'object']
}, {
name: 'watchPosition',
args: ['function', 'function', 'object']
}, {
name: 'clearWatch',
args: ['string']
}]
};
var geolocation$1 = {
init: function init (Weex) {
Weex.registerApiModule('geolocation', geolocation, 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.
*/
/* global localStorage */
var supportLocalStorage = false;
try {
supportLocalStorage = typeof localStorage !== 'undefined';
}
catch (err) {
// not support.
}
var SUCCESS = 'success';
var FAILED = 'failed';
var INVALID_PARAM = 'invalid_param';
var UNDEFINED = 'undefined';
function callFail (sender, callbackId, errorMsg) {
sender.performCallback(callbackId, {
result: FAILED,
data: errorMsg || UNDEFINED
});
}
function callNotSupportFail (sender, callbackId) {
sender.performCallback(callbackId, {
result: FAILED,
data: 'localStorage is disabled or not supported.'
});
}
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 not null nor undifined,but 0 works.
* @param {function} callbackId
*/
setItem: function (key, value, callbackId) {
var sender = this.sender;
if (!supportLocalStorage) {
return callNotSupportFail(sender, callbackId)
}
if (!key || (!value && value !== 0)) {
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
callFail(sender, callbackId);
}
},
/**
* When passed a key name, will return that key's value.
* @param {string} key
* @param {function} callbackId
*/
getItem: function (key, callbackId) {
var sender = this.sender;
if (!supportLocalStorage) {
return callNotSupportFail(sender, callbackId)
}
if (!key) {
sender.performCallback(callbackId, {
result: FAILED,
data: INVALID_PARAM
});
return
}
try {
var val = localStorage.getItem(key);
sender.performCallback(callbackId, {
result: val ? SUCCESS : FAILED,
data: val || UNDEFINED
});
}
catch (e) {
// accept any exception thrown during a storage attempt as a quota error
callFail(sender, callbackId);
}
},
/**
*When passed a key name, will remove that key from the storage.
* @param {string} key
* @param {function} callbackId
*/
removeItem: function (key, callbackId) {
var sender = this.sender;
if (!supportLocalStorage) {
return callNotSupportFail(sender, callbackId)
}
if (!key) {
sender.performCallback(callbackId, {
result: FAILED,
data: INVALID_PARAM
});
return
}
try {
localStorage.removeItem(key);
sender.performCallback(callbackId, {
result: SUCCESS,
data: UNDEFINED
});
}
catch (e) {
// accept any exception thrown during a storage attempt as a quota error
callFail(sender, callbackId);
}
},
/**
* Returns an integer representing the number of data items stored in the Storage object.
* @param {function} callbackId
*/
length: function (callbackId) {
var sender = this.sender;
if (!supportLocalStorage) {
return callNotSupportFail(sender, callbackId)
}
try {
var len = localStorage.length;
sender.performCallback(callbackId, {
result: SUCCESS,
data: len
});
}
catch (e) {
// accept any exception thrown during a storage attempt as a quota error
callFail(sender, callbackId);
}
},
/**
* Returns an array that contains all keys stored in Storage object.
* @param {function} callbackId
*/
getAllKeys: function (callbackId) {
var sender = this.sender;
if (!supportLocalStorage) {
return callNotSupportFail(sender, callbackId)
}
try {
var _arr = [];
for (var i = 0; i < localStorage.length; i++) {
_arr.push(localStorage.key(i));
}
sender.performCallback(callbackId, {
result: SUCCESS,
data: _arr
});
}
catch (e) {
// accept any exception thrown during a storage attempt as a quota error
callFail(sender, callbackId);
}
}
};
var meta$1 = {
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$1 = {
init: function (Weex) {
Weex.registerApiModule('storage', storage, meta$1);
}
};
(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={}));var httpurl_common = window.lib['httpurl'];
var strictUriEncode = 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$1 = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject$1(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 objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
var arguments$1 = arguments;
var from;
var to = toObject$1(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments$1[s]);
for (var key in from) {
if (hasOwnProperty$1.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;
};
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 = 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 queryString = {
extract: extract,
parse: parse,
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 = config.jsonpCallbackName || '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 = queryString.stringify(body);
}
var url = config.url;
var hashIdx = url.indexOf('#');
hashIdx <= -1 && (hashIdx = url.length);
var hash = url.substr(hashIdx);
if (hash && hash[0] === '#') {
hash = hash.substr(1);
}
url = url.substring(0, hashIdx);
if (body) {
url += (config.url.indexOf('?') <= -1 ? '?' : '&') + body;
}
url += '#' + 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$2 = {
stream: [{
name: 'sendHttp',
args: ['object', 'function']
}, {
name: 'fetch',
args: ['object', 'function', 'function']
}]
};
var stream$1 = {
init: function (Weex) {
utils$1 = Weex.utils;
Weex.registerApiModule('stream', stream, 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.
*/
/**
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$3 = {
clipboard: [{
name: 'getString',
args: ['function']
}, {
name: 'setString',
args: ['string']
}]
};
var clipboard$1 = {
init: function (Weex) {
Weex.registerApiModule('clipboard', clipboard, 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 event$2 = {
/**
* openUrl
* @param {string} url
*/
openURL: function (url) {
location.href = url;
}
};
var meta$4 = {
event: [{
name: 'openURL',
args: ['string']
}]
};
var eventModule = {
init: function (Weex) {
Weex.registerApiModule('event', event$2, 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.
*/
var utils$2 = {};
var endEvent;
var styleName;
var DESIGN_ROOT_VALUE = 75;
var EVENT_NAME_MAP = {
transition: 'transitionend',
WebkitTransition: 'webkitTransitionEnd',
MozTransition: 'mozTransitionEnd',
OTransition: 'oTransitionEnd',
msTransition: 'MSTransitionEnd'
};
function detectEvents () {
var testEl = document.createElement('div');
var style = testEl.style;
for (var name in EVENT_NAME_MAP) {
if (name in style) {
endEvent = EVENT_NAME_MAP[name];
styleName = name;
break
}
}
}
detectEvents();
function transitionOnce (vnode, config, callback) {
var nextFrame = utils$2.nextFrame;
var toCSSText = utils$2.toCSSText;
var styleObject2rem = utils$2.styleObject2rem;
var isArray = utils$2.isArray;
if (isArray(vnode)) {
vnode = vnode[0];
}
var duration = config.duration || 0; // ms
var timing = config.timingFunction || 'linear';
var delay = config.delay || 0; // ms
// TODO: parse transition properties
var transitionValue = "all " + duration + "ms " + timing + " " + delay + "ms";
var dom = vnode instanceof HTMLElement ? vnode : vnode.$el;
// trigger image lazyloading by force.
dom && weex.utils.fireLazyload(dom, true);
var transitionEndHandler = function (event) {
event && event.stopPropagation();
if (endEvent) {
dom.removeEventListener(endEvent, transitionEndHandler);
dom.style[styleName] = '';
}
callback();
};
if (endEvent) {
dom.style[styleName] = transitionValue;
dom.addEventListener(endEvent, transitionEndHandler);
}
nextFrame(function () {
dom.style.cssText
+= toCSSText(styleObject2rem(config.styles, DESIGN_ROOT_VALUE) || {});
});
}
var animation = {
/**
* transition
* @param {String} vnode
* @param {Object} config
* @param {String} callback
*/
transition: function transition (vnode, config, callback) {
if (!config.styles) { return }
return transitionOnce(vnode, config, function () {
callback && callback();
})
}
};
var animation$1 = {
init: function init (weex) {
var extendKeys = weex.utils.extendKeys;
extendKeys(utils$2, weex.utils, [
'nextFrame',
'toCSSText',
'styleObject2rem',
// 'autoPrefix',
// 'normalizeStyle',
'isArray'
]);
weex.registerModule('animation', animation);
}
};
/*
* 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 utils$3 = {};
function now () {
var now = window.performance && window.performance.now
? window.performance.now.bind(window.performance) : Date.now;
return now()
}
function scrollElement (dSuffix, position) {
if ((this === document.body) || (this === window)
&& window.scrollTo) {
return window.scrollTo(0, position)
}
this[("scroll" + dSuffix)] = position;
}
/**
* self invoked function that, given a context, steps through scrolling
* @method step
* @param {Object} context
*/
function step$1 (context) {
// call method again on next available frame
context.frame = window.requestAnimationFrame(step$1.bind(window, context));
var time = now();
var elapsed = (time - context.startTime) / 468;
// avoid elapsed times higher than one
elapsed = elapsed > 1 ? 1 : elapsed;
// apply easing to elapsed time
var value = ease(elapsed);
var currentPosition = context.startPosition + (context.position - context.startPosition) * value;
context.method.call(context.scrollable, context.dSuffix, currentPosition);
// return when end points have been reached
/**
* NOTE: should use ~~ to parse position number into integer. Otherwise
* this two float numbers maybe have a slicely little difference, which
* will cause this function never to stop.
*/
if (~~currentPosition === ~~context.position) {
window.cancelAnimationFrame(context.frame);
return
}
}
/**
* returns result of applying ease math function to a number
* @method ease
* @param {Number} k
* @returns {Number}
*/
function ease (k) {
return 0.5 * (1 - Math.cos(Math.PI * k))
}
var dom = {
/**
* scrollToElement
* @param {Vnode | VComponent} vnode
* @param {Object} options {offset:Number}
* ps: scroll-to has 'ease' and 'duration'(ms) as options.
*/
scrollToElement: function (vnode, options) {
var isArray = utils$3.isArray;
var getParentScrollerElement = utils$3.getParentScrollerElement;
if (isArray(vnode)) {
vnode = vnode[0];
}
var isElement = vnode instanceof HTMLElement;
var el = isElement ? vnode : (vnode.$el || vnode.elm);
var ct = getParentScrollerElement(vnode);
var scroller = ct.__vue__;
var isWindow = ct === document.body;
var scrollDirection =
isWindow ? 'vertical'
: (scroller && scroller.scrollDirection || 'vertical');
if (ct && el) {
var dSuffix = ({
horizontal: 'Left',
vertical: 'Top'
})[scrollDirection];
var ctRect = ct.getBoundingClientRect();
var elRect = el.getBoundingClientRect();
/**
* if it's a waterfall, and you want to scroll to a header, then just
* scroll to the top.
*/
if (
!isElement
&& scroller
&& scroller.weexType === 'waterfall'
&& scroller._headers
&& scroller._headers.indexOf(vnode.$vnode || vnode) > -1) {
// it's in waterfall. just scroll to the top.
elRect = ct.firstElementChild.getBoundingClientRect();
}
var dir = dSuffix.toLowerCase();
var offset = (isWindow ? 0 : ct[("scroll" + dSuffix)]) + elRect[dir] - ctRect[dir];
if (options) {
offset += options.offset && options.offset * weex.config.env.scale || 0;
}
else {}
if (options && options.animated === false) {
return scrollElement.call(ct, dSuffix, offset)
}
step$1({
scrollable: ct,
startTime: now(),
frame: null,
startPosition: isWindow ? window.pageYOffset : ct[("scroll" + dSuffix)],
position: offset,
method: scrollElement,
dSuffix: dSuffix
});
}
},
/**
* getComponentRect
* @param {String} vnode
* @param {Function} callback
*/
getComponentRect: function (vnode, callback) {
var isArray = utils$3.isArray;
if (isArray(vnode)) {
vnode = vnode[0];
}
var scale = window.weex.config.env.scale;
var info = {
result: false
};
var rectKeys = ['width', 'height', 'top', 'bottom', 'left', 'right'];
function recalc (rect) {
var res = {};
rectKeys.forEach(function (key) {
if (rect[key]) {
res[key] = rect[key] / scale;
}
});
return res
}
if (vnode && vnode === 'viewport') {
info.result = true;
info.size = recalc({
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
top: 0,
left: 0,
right: document.documentElement.clientWidth,
bottom: document.documentElement.clientHeight
});
}
else if (vnode) {
var el = vnode instanceof HTMLElement
? vnode
: vnode.$el;
if (el.getBoundingClientRect) {
info.result = true;
info.size = recalc(el.getBoundingClientRect());
}
else {
info.result = false;
}
}
var message = info.result ? info : {
result: false,
errMsg: 'Illegal parameter'
};
callback && callback(message);
return message
},
/**
* getLayoutDirection
* @param {String} vnode
* @param {Function} callback
*/
getLayoutDirection: function (vnode, callback) {
var isArray = utils$3.isArray;
if (isArray(vnode)) {
vnode = vnode[0];
}
var direction = 'ltr';
if (vnode && vnode === 'viewport') {
direction = getComputedStyle(document.documentElement)['direction'];
}
else if (vnode) {
var el = vnode instanceof HTMLElement ? vnode : vnode.$el;
direction = getComputedStyle(el)['direction'];
}
callback && callback(direction);
return direction
},
/**
* for adding fontFace
* @param {string} key fontFace
* @param {object} styles rules
*/
addRule: function (key, styles) {
var camelToKebab = utils$3.camelToKebab;
var appendCss = utils$3.appendCss;
key = camelToKebab(key);
var stylesText = '';
for (var k in styles) {
if (styles.hasOwnProperty(k)) {
stylesText += camelToKebab(k) + ':' + styles[k] + ';';
}
}
var styleText = "@" + key + "{" + stylesText + "}";
appendCss(styleText, 'dom-added-rules');
}
};
var dom$1 = {
init: function init (weex) {
var extendKeys = weex.utils.extendKeys;
extendKeys(utils$3, weex.utils, ['camelToKebab', 'appendCss', 'isArray', 'getParentScrollerElement']);
weex.registerModule('dom', dom);
}
};
/*
* 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.
*/
/**
* globalEvent API:
* @doc http://weex.apache.org/cn/references/modules/globalevent.html
*/
// track varies kinds of events and listeners.
var handlerTraker = {};
var globalEvent = {
/**
* addEventListener
* NOTE: one callback can only be bound to the same event once. Bind a callback twice doesn't
* mean it will be called twice when the event fired once.
* @param {string} evt - the event name to add a listener on.
*/
addEventListener: function addEventListener (evt, callback) {
if (!callback) {
return
}
var handlers = handlerTraker[evt];
if (!handlers) {
handlers = handlerTraker[evt] = [];
}
var len = handlers.length;
for (var i = 0; i < len; i++) {
if (handlers[i] === callback) {
// this callback is already bound. no need to bind it again.
return
}
}
handlers.push(callback);
document.addEventListener(evt, callback);
},
/**
* removeEventListener
* NOTE: remove all the event handlers for the specified event type.
* @param {string} evt - the event name to remove a listener from.
*/
removeEventListener: function removeEventListener (evt) {
var handlers = handlerTraker[evt];
if (!handlers) {
// evt handlers has been already removed.
return
}
handlers.forEach(function (cb) { return document.removeEventListener(evt, cb); });
delete handlerTraker[evt];
}
};
var globalEvent$1 = {
init: function init (weex) {
weex.registerModule('globalEvent', globalEvent);
}
};
/*
* 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 queue$1 = [];
var isProcessing = false;
var toastWin;
var TOAST_WIN_CLASS_NAME = 'weex-toast';
var TOAST_TRANSITION_DURATION = 0.4;
var DEFAULT_DURATION = 0.8;
function showToastWindow (msg, callback) {
if (!toastWin) {
toastWin = document.createElement('div');
toastWin.classList.add(TOAST_WIN_CLASS_NAME);
toastWin.classList.add('hide');
document.body.appendChild(toastWin);
}
toastWin.textContent = msg;
setTimeout(function () {
toastWin.classList.remove('hide');
callback && callback();
}, 16);
}
function hideToastWindow (callback) {
if (!toastWin) {
return
}
toastWin.classList.add('hide');
setTimeout(function () {
callback && callback();
}, TOAST_TRANSITION_DURATION * 1000);
}
var toast = {
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 () {
setTimeout(function () {
hideToastWindow(function () {
isProcessing = false;
that.show();
});
}, toastInfo.duration * 1000);
});
}
};
/*
* 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.
*/
// there will be only one instance of modal.
var MODAL_WRAP_CLASS = 'weex-modal-wrap';
var MODAL_NODE_CLASS = 'weex-modal-node';
function Modal () {
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.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();
});
}
};
/*
* 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 CONTENT_CLASS = 'content';
var MSG_CLASS = 'content-msg';
var BUTTON_GROUP_CLASS = 'btn-group';
var BUTTON_CLASS = 'btn';
function Alert (config) {
this.msg = config.message || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
Modal.call(this);
this.node.classList.add('weex-alert');
}
Alert.prototype = Object.create(Modal.prototype);
Alert.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.prototype.bindEvents = function () {
Modal.prototype.bindEvents.call(this);
var button = this.node.querySelector('.' + BUTTON_CLASS);
button.addEventListener('click', function () {
this.destroy();
this.callback && this.callback();
}.bind(this));
};
/*
* 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 CONTENT_CLASS$1 = 'content';
var MSG_CLASS$1 = 'content-msg';
var BUTTON_GROUP_CLASS$1 = 'btn-group';
var BUTTON_CLASS$1 = 'btn';
function Confirm (config) {
this.msg = config.message || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
this.cancelTitle = config.cancelTitle || 'Cancel';
Modal.call(this);
this.node.classList.add('weex-confirm');
}
Confirm.prototype = Object.create(Modal.prototype);
Confirm.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.prototype.bindEvents = function () {
Modal.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));
};
/*
* 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 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 (config) {
this.msg = config.message || '';
this.defaultMsg = config.default || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
this.cancelTitle = config.cancelTitle || 'Cancel';
Modal.call(this);
this.node.classList.add('weex-prompt');
}
Prompt.prototype = Object.create(Modal.prototype);
Prompt.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.prototype.bindEvents = function () {
Modal.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));
};
/*
* 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 _css$1 = "\n.weex-toast {\n font-size: 0.426667rem;\n line-height: 0.426667rem;\n position: fixed;\n z-index: 1999999999;\n box-sizing: border-box;\n max-width: 80%;\n bottom: 50%;\n left: 50%;\n padding: 0.213333rem;\n background-color: #000;\n color: #fff;\n text-align: center;\n opacity: 0.7;\n -webkit-transition: all 0.4s ease-in-out;\n -moz-transition: all 0.4s ease-in-out;\n -ms-transition: all 0.4s ease-in-out;\n transition: all 0.4s ease-in-out;\n border-radius: 0.066667rem;\n -webkit-transform: translateX(-50%);\n -moz-transform: translateX(-50%);\n -ms-transform: translateX(-50%);\n transform: translateX(-50%);\n}\n\n.weex-toast.hide {\n opacity: 0;\n}\n\n.weex-alert .weex-alert-ok {\n width: 100%;\n}\n\n.weex-confirm .btn-group .btn {\n float: left;\n width: 50%;\n}\n\n.weex-confirm .btn-group .btn.btn-ok {\n border-right: 0.013333rem solid #ddd;\n}\n\n.weex-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.weex-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 -moz-transform: translate(-50%, -50%);\n -ms-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n background-color: #fff;\n}\n\n.weex-modal-node.hide {\n display: none;\n}\n\n.weex-modal-node .content {\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n -moz-box-orient: vertical;\n -moz-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -webkit-box-align: center;\n -webkit-align-items: center;\n -ms-flex-align: center;\n -moz-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -moz-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 100%;\n min-height: 1.866667rem;\n box-sizing: border-box;\n font-size: 0.426667rem;\n line-height: 0.426667rem;\n padding: 0.213333rem;\n border-bottom: 0.013333rem solid #ddd;\n}\n\n.weex-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\n.weex-modal-node .btn-group .btn {\n text-align: center;\n}\n\n.weex-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 text-align: center;\n}\n\n.weex-prompt .input-wrap {\n box-sizing: border-box;\n width: 100%;\n margin-top: 0.133333rem;\n height: 0.96rem;\n}\n\n.weex-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.426667rem;\n border: 0.013333rem solid #999;\n}\n\n.weex-prompt .btn-group .btn {\n float: left;\n width: 50%;\n}\n\n.weex-prompt .btn-group .btn.btn-ok {\n border-right: 0.013333rem solid #ddd;\n}\n";
/*
* 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: rewrite the modal styles
var modal = {
// duration: default is 0.8 seconds.
toast: function (config) {
toast.push(config.message, config.duration);
},
// config:
// - message: string
// - okTitle: title of ok button
// - callback
alert: function (config, callback) {
config.callback = function () {
callback && callback();
};
new Alert(config).show();
},
// config:
// - message: string
// - okTitle: title of ok button
// - cancelTitle: title of cancel button
// - callback
confirm: function (config, callback) {
config.callback = function (val) {
callback && callback(val);
};
new Confirm(config).show();
},
// config:
// - message: string
// - okTitle: title of ok button
// - cancelTitle: title of cancel button
// - callback
prompt: function (config, callback) {
config.callback = function (val) {
callback && callback(val);
};
new Prompt(config).show();
}
};
var modal$1 = {
init: function (Weex) {
Weex.utils.appendCss(_css$1, 'weex-mud-modal');
Weex.registerModule('modal', 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.
*/
/**
* Navigator module
*/
var navigatorModule = {
push: function (config, callback) {
window.location.href = config.url;
callback && callback();
},
pop: function (config, callback) {
window.history.back();
callback && callback();
}
};
var navigatorModule$1 = {
init: function init (weex) {
weex.registerModule('navigator', navigatorModule);
}
};
/*
* 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.
*/
/**
* Webview module
*/
var isArray$1;
var webview = {
goBack: function goBack (vnode) {
if (isArray$1(vnode)) {
vnode = vnode[0];
}
if (vnode && typeof vnode.goBack === 'function') {
vnode.goBack();
}
},
goForward: function goForward (vnode) {
if (isArray$1(vnode)) {
vnode = vnode[0];
}
if (vnode && typeof vnode.goForward === 'function') {
vnode.goForward();
}
},
reload: function reload (vnode) {
if (isArray$1(vnode)) {
vnode = vnode[0];
}
if (vnode && typeof vnode.reload === 'function') {
vnode.reload();
}
}
};
var webview$1 = {
init: function init (weex) {
isArray$1 = weex.utils.isArray;
weex.registerModule('webview', webview);
}
};
/*
* 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.
*/
/**
* websocket module
*/
/*global WebSocket*/
var websocket$1 = (function () {
var registerListeners = ['onopen', 'onmessage', 'onerror', 'onclose'];
var ws = {
INSTANCE: null,
WebSocket: function (url, protocol) {
if (!url) {
ws.INSTANCE = null;
return
}
if (!protocol) {
ws.INSTANCE = new WebSocket(url);
}
else {
ws.INSTANCE = new WebSocket(url, protocol);
}
return ws.INSTANCE
},
send: function (messages) {
ws.INSTANCE && ws.INSTANCE.send(messages);
},
close: function () {
ws.INSTANCE && ws.INSTANCE.close();
}
};
var loop = function ( i ) {
if (registerListeners.hasOwnProperty(i)) {
Object.defineProperty(ws, registerListeners[i], {
get: function () {
return ws.INSTANCE && ws.INSTANCE[registerListeners[i]]
},
set: function (fn) {
if (ws.INSTANCE) {
ws.INSTANCE[registerListeners[i]] = fn;
}
}
});
}
};
for (var i in registerListeners) loop( i );
return ws
})();
/*
* 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: rewrite the module meta
var websocket = {
init: function (Weex) {
Weex.registerModule('webSocket', websocket$1, { registerType: 'assignment' });
}
};
/*
* 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 meta$5 = {
/**
* setViewport.
* Changing viewport design width at runtime.
*/
setViewport: function setViewport (options) {
if (!options) {
console.error(("[vue-render] set viewport width invalid options: " + options));
}
var newWidth = parseInt(options.width);
if (!isNaN(newWidth) && newWidth > 0) {
resetViewport(options.width);
}
else {
console.error(("[vue-render] set viewport width invalid options.width: " + (options.width)));
}
}
};
var meta$6 = {
init: function init (weex) {
weex.registerModule('meta', 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.
*/
// modules from render/browesr (legacy modules)
// custom modules
var modules$1 = [
geolocation$1,
storage$1,
stream$1,
clipboard$1,
eventModule,
modal$1,
websocket,
animation$1,
dom$1,
globalEvent$1,
navigatorModule$1,
webview$1,
meta$6
];
/*
* 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 valMap = {
contain: 'contain',
cover: 'cover',
stretch: '100% 100%'
};
var vals = Object.keys(valMap);
var defaultVal = 'stretch';
var resize = {
init: function init (weex) {
weex.__vue__.directive('weex-resize', function (el, binding) {
if (el.tagName.toLowerCase() !== 'figure') {
return
}
var value = binding.value;
var oldValue = binding.oldvalue;
if (value === oldValue) {
return
}
if (vals.indexOf(value) <= -1) {
value = defaultVal;
}
el.style.backgroundSize = valMap[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 directives = {
resize: resize
};
var preInit = weex.init;
weex.init = function () {
preInit.apply(weex, arguments);
var plugins = components.concat(modules$1);
plugins.forEach(function (plugin) {
weex.install(plugin);
});
for (var k in directives) {
weex.install(directives[k]);
}
};
if (global.Vue) {
weex.init(global.Vue);
}
return weex;
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tbW9uLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2xpYnJhcnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWlvYmplY3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mbi9hcnJheS9mcm9tLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mbi9vYmplY3QvYXNzaWduLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdGFzay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wZXJmb3JtLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vLi4vLi4vc3JjL2xpYi9nZXN0dXJlLmpzIiwiLi4vLi4vLi4vc3JjL2xpYi9lbnZkL3ZlcnNpb24uanMiLCIuLi8uLi8uLi9zcmMvbGliL2VudmQvcGFyYW1zLmpzIiwiLi4vLi4vLi4vc3JjL2xpYi9lbnZkL2luZGV4LmpzIiwiLi4vLi4vLi4vc3JjL3V0aWxzL3R5cGUuanMiLCIuLi8uLi8uLi9zcmMvdXRpbHMvZnVuYy5qcyIsIi4uLy4uLy4uL3NyYy93ZWV4L3ZpZXdwb3J0LmpzIiwiLi4vLi4vLi4vc3JjL3V0aWxzL2V2ZW50LmpzIiwiLi4vLi4vLi4vc3JjL2NvbmZpZy5qcyIsIi4uLy4uLy4uL3NyYy91dGlscy9jb21wb25lbnQuanMiLCIuLi8uLi8uLi9zcmMvdXRpbHMvbGF6eWxvYWQuanMiLCIuLi8uLi8uLi9zcmMvdXRpbHMvc3R5bGUuanMiLCIuLi8uLi8uLi9zcmMvdXRpbHMvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvd2VleC93eC1lbnYuanMiLCIuLi8uLi8uLi9zcmMvd2VleC9pbnN0YW5jZS5qcyIsIi4uLy4uLy4uL3NyYy9jb3JlL3N0eWxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3d4di10cmFuc2Zvcm1lci90cmFuc2Zvcm1lci90ZXh0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3d4di10cmFuc2Zvcm1lci90cmFuc2Zvcm1lci9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy93eHYtdHJhbnNmb3JtZXIvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvY29yZS9ub2RlLmpzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvbWl4aW5zL2Jhc2UuanMiLCIuLi8uLi8uLi9zcmMvbWl4aW5zL2V2ZW50LmpzIiwiLi4vLi4vLi4vc3JjL21peGlucy9zdHlsZS5qcyIsIi4uLy4uLy4uL3NyYy9taXhpbnMvaW5wdXQtY29tbW9uLmpzIiwiLi4vLi4vLi4vc3JjL21peGlucy9zdGlja3kuanMiLCIuLi8uLi8uLi9zcmMvbWl4aW5zL2luZGV4LmpzIiwiLi4vLi4vLi4vc3JjL3dlZXgvZ2xvYmFsLmpzIiwiLi4vLi4vLi4vc3JjL3dlZXgvcmVuZGVyLWZ1bmN0aW9uLmpzIiwiLi4vLi4vLi4vc3JjL3dlZXgvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9pbnB1dC9pbmRleC5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N3aXRjaC9pbmRleC5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3Njcm9sbGFibGUvbWl4aW5zL3Njcm9sbGFibGUuanMiLCIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zY3JvbGxhYmxlL21peGlucy9pbmRleC5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsZXIuanMiLCIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zY3JvbGxhYmxlL3dhdGVyZmFsbC5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3Njcm9sbGFibGUvaGVhZGVyLmpzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9sb2FkaW5nLmpzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9yZWZyZXNoLmpzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9sb2FkaW5nLWluZGljYXRvci5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3Njcm9sbGFibGUvcmVjeWNsZS1saXN0LmpzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9pbmRleC5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NsaWRlci9zbGlkZU1peGluLmpzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2xpZGVyL3NsaWRlci5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NsaWRlci9zbGlkZXItbmVpZ2hib3IuanMiLCIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zbGlkZXIvaW5kaWNhdG9yLmpzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2xpZGVyL2luZGV4LmpzIiwiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dGFyZWEvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWRlby5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3dlYi9pbmRleC5qcyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2luZGV4LmpzIiwiLi4vLi4vLi4vc3JjL21vZHVsZXMvZ2VvbG9jYXRpb24uanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy9zdG9yYWdlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2h0dHB1cmwvYnVpbGQvaHR0cHVybC5jb21tb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3RyaWN0LXVyaS1lbmNvZGUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWVyeS1zdHJpbmcvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy9zdHJlYW0uanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy9jbGlwYm9hcmQuanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy9ldmVudC5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL2FuaW1hdGlvbi5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvbS5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL2dsb2JhbEV2ZW50LmpzIiwiLi4vLi4vLi4vc3JjL21vZHVsZXMvbW9kYWwvdG9hc3QuanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy9tb2RhbC9tb2RhbC5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL21vZGFsL2FsZXJ0LmpzIiwiLi4vLi4vLi4vc3JjL21vZHVsZXMvbW9kYWwvY29uZmlybS5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL21vZGFsL3Byb21wdC5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL21vZGFsL3N0eWxlLmpzIiwiLi4vLi4vLi4vc3JjL21vZHVsZXMvbW9kYWwvaW5kZXguanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy9uYXZpZ2F0b3IuanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy93ZWJ2aWV3LmpzIiwiLi4vLi4vLi4vc3JjL21vZHVsZXMvd2Vic29ja2V0L3dlYnNvY2tldC5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL3dlYnNvY2tldC9pbmRleC5qcyIsIi4uLy4uLy4uL3NyYy9tb2R1bGVzL21ldGEuanMiLCIuLi8uLi8uLi9zcmMvbW9kdWxlcy9pbmRleC5qcyIsIi4uLy4uLy4uL3NyYy9kaXJlY3RpdmVzL3Jlc2l6ZS5qcyIsIi4uLy4uLy4uL3NyYy9kaXJlY3RpdmVzL2luZGV4LmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS4yJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG4iLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyICRpdGVyQ3JlYXRlID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBCVUdHWSA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKTsgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxudmFyIEZGX0lURVJBVE9SID0gJ0BAaXRlcmF0b3InO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uIChraW5kKSB7XG4gICAgaWYgKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKSByZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFUztcbiAgdmFyIFZBTFVFU19CVUcgPSBmYWxzZTtcbiAgdmFyIHByb3RvID0gQmFzZS5wcm90b3R5cGU7XG4gIHZhciAkbmF0aXZlID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdO1xuICB2YXIgJGRlZmF1bHQgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKTtcbiAgdmFyICRlbnRyaWVzID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZDtcbiAgdmFyICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlO1xuICB2YXIgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZiAoJGFueU5hdGl2ZSkge1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgSXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmICghTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIGhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSkge1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gPSByZXR1cm5UaGlzO1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChrZXkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKCEoa2V5IGluIHByb3RvKSkgcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICBpZiAoaW5kZXggaW4gb2JqZWN0KSAkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xufTtcbiIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLkFycmF5LmZyb207XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIFMgPSBTeW1ib2woKTtcbiAgdmFyIEsgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW1NdID0gNztcbiAgSy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgd2hpbGUgKGFMZW4gPiBpbmRleCkge1xuICAgIHZhciBTID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIGlmIChpc0VudW0uY2FsbChTLCBrZXkgPSBrZXlzW2orK10pKSBUW2tleV0gPSBTW2tleV07XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuYXNzaWduO1xuIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG4iLCIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0IH0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgdGVzdCA9IHt9O1xudGVzdFtyZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKV0gPSAneic7XG5pZiAodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJykge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59XG4iLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBraW5kID0gdGhpcy5faztcbiAgdmFyIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZiAoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpIHtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIiwidmFyICRpdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIENTU1J1bGVMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogZmFsc2UsXG4gIENTU1ZhbHVlTGlzdDogZmFsc2UsXG4gIENsaWVudFJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NUmVjdExpc3Q6IGZhbHNlLFxuICBET01TdHJpbmdMaXN0OiBmYWxzZSxcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogZmFsc2UsXG4gIEZpbGVMaXN0OiBmYWxzZSxcbiAgSFRNTEFsbENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxGb3JtRWxlbWVudDogZmFsc2UsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiBmYWxzZSxcbiAgTWVkaWFMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgTWltZVR5cGVBcnJheTogZmFsc2UsXG4gIE5hbWVkTm9kZU1hcDogZmFsc2UsXG4gIE5vZGVMaXN0OiB0cnVlLFxuICBQYWludFJlcXVlc3RMaXN0OiBmYWxzZSxcbiAgUGx1Z2luOiBmYWxzZSxcbiAgUGx1Z2luQXJyYXk6IGZhbHNlLFxuICBTVkdMZW5ndGhMaXN0OiBmYWxzZSxcbiAgU1ZHTnVtYmVyTGlzdDogZmFsc2UsXG4gIFNWR1BhdGhTZWdMaXN0OiBmYWxzZSxcbiAgU1ZHUG9pbnRMaXN0OiBmYWxzZSxcbiAgU1ZHU3RyaW5nTGlzdDogZmFsc2UsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IGZhbHNlLFxuICBTb3VyY2VCdWZmZXJMaXN0OiBmYWxzZSxcbiAgU3R5bGVTaGVldExpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBUZXh0VHJhY2tDdWVMaXN0OiBmYWxzZSxcbiAgVGV4dFRyYWNrTGlzdDogZmFsc2UsXG4gIFRvdWNoTGlzdDogZmFsc2Vcbn07XG5cbmZvciAodmFyIGNvbGxlY3Rpb25zID0gZ2V0S2V5cyhET01JdGVyYWJsZXMpLCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gY29sbGVjdGlvbnNbaV07XG4gIHZhciBleHBsaWNpdCA9IERPTUl0ZXJhYmxlc1tOQU1FXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIHZhciBrZXk7XG4gIGlmIChwcm90bykge1xuICAgIGlmICghcHJvdG9bSVRFUkFUT1JdKSBoaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmICghcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGlmIChleHBsaWNpdCkgZm9yIChrZXkgaW4gJGl0ZXJhdG9ycykgaWYgKCFwcm90b1trZXldKSByZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEQpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZTogZmFsc2UsIHY6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgZTogdHJ1ZSwgdjogZSB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgaXNSZWplY3QpIHtcbiAgaWYgKHByb21pc2UuX24pIHJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgb2sgPSBwcm9taXNlLl9zID09IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIGlmIChwcm9taXNlLl9oID09IDEpIHJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZWFjdGlvbjtcbiAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYgKHJlYWN0aW9uLmZhaWwgfHwgIWlzVW5oYW5kbGVkKHJlYWN0aW9uLnByb21pc2UpKSByZXR1cm4gZmFsc2U7XG4gIH0gcmV0dXJuIHRydWU7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpIHtcbiAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3YgfSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYgKCFwcm9taXNlLl9hKSBwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgdmFyIHRoZW47XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmICh0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgJHJlamVjdC5jYWxsKHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9hKSB0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX3MpIG5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gJFByb21pc2UgfHwgQyA9PT0gV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFByb21pc2U6ICRQcm9taXNlIH0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB2YXIgJCRyZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoTElCUkFSWSAmJiB0aGlzID09PSBXcmFwcGVyID8gJFByb21pc2UgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyICRpbmRleCA9IGluZGV4Kys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBpc0luaXRpYWxpemVkID0gZmFsc2VcblxuLy8gbWFqb3IgZXZlbnRzIHN1cHBvcnRlZDpcbi8vICAgcGFuc3RhcnRcbi8vICAgcGFubW92ZVxuLy8gICBwYW5lbmRcbi8vICAgc3dpcGVcbi8vICAgbG9uZ3ByZXNzXG4vLyBleHRyYSBldmVudHMgc3VwcG9ydGVkOlxuLy8gICBkdWFsdG91Y2hzdGFydFxuLy8gICBkdWFsdG91Y2hcbi8vICAgZHVhbHRvdWNoZW5kXG4vLyAgIHRhcFxuLy8gICBkb3VibGV0YXBcbi8vICAgcHJlc3NlbmRcblxudmFyIGRvYyA9IHdpbmRvdy5kb2N1bWVudFxudmFyIGRvY0VsID0gZG9jLmRvY3VtZW50RWxlbWVudFxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG52YXIgZ2VzdHVyZXMgPSB7fVxudmFyIGxhc3RUYXAgPSBudWxsXG5cbi8qKlxuICogZmluZCB0aGUgY2xvc2VzdCBjb21tb24gYW5jZXN0b3JcbiAqIGlmIHRoZXJlJ3Mgbm8gb25lLCByZXR1cm4gbnVsbFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsMSBmaXJzdCBlbGVtZW50XG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbDIgc2Vjb25kIGVsZW1lbnRcbiAqIEByZXR1cm4ge0VsZW1lbnR9ICAgICBjb21tb24gYW5jZXN0b3JcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tbW9uQW5jZXN0b3IoZWwxLCBlbDIpIHtcbiAgdmFyIGVsID0gZWwxXG4gIHdoaWxlIChlbCkge1xuICAgIGlmIChlbC5jb250YWlucyhlbDIpIHx8IGVsID09IGVsMikge1xuICAgICAgcmV0dXJuIGVsXG4gICAgfVxuICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogZmlyZSBhIEhUTUxFdmVudFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsZW1lbnQgd2hpY2ggZWxlbWVudCB0byBmaXJlIGEgZXZlbnQgb25cbiAqIEBwYXJhbSAge3N0cmluZ30gIHR5cGUgICAgdHlwZSBvZiBldmVudFxuICogQHBhcmFtICB7b2JqZWN0fSAgZXh0cmEgICBleHRyYSBkYXRhIGZvciB0aGUgZXZlbnQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudChlbGVtZW50LCB0eXBlLCBleHRyYSkge1xuICB2YXIgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKVxuICBldmVudC5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSlcblxuICBpZiAodHlwZW9mIGV4dHJhID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIHAgaW4gZXh0cmEpIHtcbiAgICAgIGV2ZW50W3BdID0gZXh0cmFbcF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSBmbGFnIHRvIGRpc3Rpbmd1aXNoIHdpdGggb3RoZXIgZXZlbnRzIHdpdGggdGhlIHNhbWUgbmFtZSBnZW5lcmF0ZWRcbiAgICogYnkgYW5vdGhlciBsaWJyYXJ5IGluIHRoZSBzYW1lIHBhZ2UuXG4gICAqLyBcbiAgZXZlbnQuX2ZvciA9ICd3ZWV4J1xuXG4gIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBjYWxjIHRoZSB0cmFuc2Zvcm1cbiAqIGFzc3VtZSA0IHBvaW50cyBBQkNEIG9uIHRoZSBjb29yZGluYXRlIHN5c3RlbVxuICogPiByb3RhdGXvvJphbmdsZSByb3RhdGluZyBmcm9tIEFCIHRvIENEXG4gKiA+IHNjYWxl77yac2NhbGUgcmF0aW8gZnJvbSBBQiB0byBDRFxuICogPiB0cmFuc2xhdGXvvJp0cmFuc2xhdGUgc2hpZnQgZnJvbSBBIHRvIENcbiAqXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgxIGFic2Npc3NhIG9mIEFcbiAqIEBwYXJhbSAge251bWJlcn0geTEgb3JkaW5hdGUgb2YgQVxuICogQHBhcmFtICB7bnVtYmVyfSB4MiBhYnNjaXNzYSBvZiBCXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkyIG9yZGluYXRlIG9mIEJcbiAqIEBwYXJhbSAge251bWJlcn0geDMgYWJzY2lzc2Egb2YgQ1xuICogQHBhcmFtICB7bnVtYmVyfSB5MyBvcmRpbmF0ZSBvZiBDXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHg0IGFic2Npc3NhIG9mIERcbiAqIEBwYXJhbSAge251bWJlcn0geTQgb3JkaW5hdGUgb2YgRFxuICogQHJldHVybiB7b2JqZWN0fSAgICB0cmFuc2Zvcm0gb2JqZWN0IGxpa2VcbiAqICAge3JvdGF0ZSwgc2NhbGUsIHRyYW5zbGF0ZVsyXSwgbWF0cml4WzNdWzNdfVxuICovXG5mdW5jdGlvbiBjYWxjKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCkge1xuICB2YXIgcm90YXRlID0gTWF0aC5hdGFuMih5NCAtIHkzLCB4NCAtIHgzKSAtIE1hdGguYXRhbjIoeTIgLSB5MSwgeDIgLSB4MSlcbiAgdmFyIHNjYWxlID0gTWF0aC5zcXJ0KChNYXRoLnBvdyh5NCAtIHkzLCAyKVxuICAgICsgTWF0aC5wb3coeDQgLSB4MywgMikpIC8gKE1hdGgucG93KHkyIC0geTEsIDIpXG4gICAgKyBNYXRoLnBvdyh4MiAtIHgxLCAyKSkpXG4gIHZhciB0cmFuc2xhdGUgPSBbXG4gICAgeDNcbiAgICAtIHNjYWxlICogeDEgKiBNYXRoLmNvcyhyb3RhdGUpXG4gICAgKyBzY2FsZSAqIHkxICogTWF0aC5zaW4ocm90YXRlKSxcbiAgICB5M1xuICAgIC0gc2NhbGUgKiB5MSAqIE1hdGguY29zKHJvdGF0ZSlcbiAgICAtIHNjYWxlICogeDEgKiBNYXRoLnNpbihyb3RhdGUpXVxuXG4gIHJldHVybiB7XG4gICAgcm90YXRlOiByb3RhdGUsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlLFxuICAgIG1hdHJpeDogW1xuICAgICAgW3NjYWxlICogTWF0aC5jb3Mocm90YXRlKSwgLXNjYWxlICogTWF0aC5zaW4ocm90YXRlKSwgdHJhbnNsYXRlWzBdXSxcbiAgICAgIFtzY2FsZSAqIE1hdGguc2luKHJvdGF0ZSksIHNjYWxlICogTWF0aC5jb3Mocm90YXRlKSwgdHJhbnNsYXRlWzFdXSxcbiAgICAgIFswLCAwLCAxXVxuICAgIF1cbiAgfVxufVxuXG4vKipcbiAqIHRha2Ugb3ZlciB0aGUgdG91Y2hzdGFydCBldmVudHMuIEFkZCBuZXcgdG91Y2hlcyB0byB0aGUgZ2VzdHVyZXMuXG4gKiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyByZWNvcmRzLCB0aGVuIGJpbmQgdG91Y2htb3ZlLCB0b2NoZW5kXG4gKiBhbmQgdG91Y2hjYW5jZWwgZXZlbnRzLlxuICogbmV3IHRvdWNoZXMgaW5pdGlhbGl6ZWQgd2l0aCBzdGF0ZSAndGFwcGluZycsIGFuZCB3aXRoaW4gNTAwIG1pbGxpc2Vjb25kc1xuICogaWYgdGhlIHN0YXRlIGlzIHN0aWxsIHRhcHBpbmcsIHRoZW4gdHJpZ2dlciBnZXN0dXJlICdwcmVzcycuXG4gKiBJZiB0aGVyZSBhcmUgdHdvIHRvdWNoZSBwb2ludHMsIHRoZW4gdGhlICdkdWFsdG91Y2hzdGFydCcgaXMgdHJpZ2dlcmQuIFRoZVxuICogbm9kZSBvZiB0aGUgdG91Y2ggZ2VzdHVyZSBpcyB0aGVpciBjbG9lc3QgY29tbW9uIGFuY2VzdG9yLlxuICpcbiAqIEBldmVudFxuICogQHBhcmFtICB7ZXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHRvdWNoc3RhcnRIYW5kbGVyKGV2ZW50KSB7XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkb2NFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmVIYW5kbGVyLCB0cnVlKVxuICAgIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyLCB0cnVlKVxuICAgIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyLCB0cnVlKVxuICB9XG5cbiAgLy8gcmVjb3JkIGV2ZXJ5IHRvdWNoXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXVxuICAgIHZhciB0b3VjaFJlY29yZCA9IHt9XG5cbiAgICBmb3IgKHZhciBwIGluIHRvdWNoKSB7XG4gICAgICB0b3VjaFJlY29yZFtwXSA9IHRvdWNoW3BdXG4gICAgfVxuXG4gICAgdmFyIGdlc3R1cmUgPSB7XG4gICAgICBzdGFydFRvdWNoOiB0b3VjaFJlY29yZCxcbiAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgIHN0YXR1czogJ3RhcHBpbmcnLFxuICAgICAgZWxlbWVudDogZXZlbnQuc3JjRWxlbWVudCB8fCBldmVudC50YXJnZXQsXG4gICAgICBwcmVzc2luZ0hhbmRsZXI6IHNldFRpbWVvdXQoZnVuY3Rpb24gKGVsZW1lbnQsIHRvdWNoKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAndGFwcGluZycpIHtcbiAgICAgICAgICAgIGdlc3R1cmUuc3RhdHVzID0gJ3ByZXNzaW5nJ1xuXG4gICAgICAgICAgICBmaXJlRXZlbnQoZWxlbWVudCwgJ2xvbmdwcmVzcycsIHtcbiAgICAgICAgICAgICAgLy8gYWRkIHRvdWNoIGRhdGEgZm9yIHdlZXhcbiAgICAgICAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICAgICAgICB0b3VjaGVzOiBldmVudC50b3VjaGVzLFxuICAgICAgICAgICAgICBjaGFuZ2VkVG91Y2hlczogZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNsZWFyVGltZW91dChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcilcbiAgICAgICAgICBnZXN0dXJlLnByZXNzaW5nSGFuZGxlciA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfShldmVudC5zcmNFbGVtZW50IHx8IGV2ZW50LnRhcmdldCwgZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV0pLCA1MDApXG4gICAgfVxuICAgIGdlc3R1cmVzW3RvdWNoLmlkZW50aWZpZXJdID0gZ2VzdHVyZVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT0gMikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdXG5cbiAgICBmb3IgKHZhciBwIGluIGdlc3R1cmVzKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGdlc3R1cmVzW3BdLmVsZW1lbnQpXG4gICAgfVxuXG4gICAgZmlyZUV2ZW50KGdldENvbW1vbkFuY2VzdG9yKGVsZW1lbnRzWzBdLCBlbGVtZW50c1sxXSksICdkdWFsdG91Y2hzdGFydCcsIHtcbiAgICAgIHRvdWNoZXM6IHNsaWNlLmNhbGwoZXZlbnQudG91Y2hlcyksXG4gICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiB0YWtlIG92ZXIgdG91Y2htb3ZlIGV2ZW50cywgYW5kIGhhbmRsZSBwYW4gYW5kIGR1YWwgcmVsYXRlZCBnZXN0dXJlcy5cbiAqXG4gKiAxLiB0cmF2ZXJzZSBldmVyeSB0b3VjaCBwb2ludO+8mlxuICogPiBpZiAndGFwcGluZycgYW5kIHRoZSBzaGlmdCBpcyBvdmVyIDEwIHBpeGxlcywgdGhlbiBpdCdzIGEgJ3Bhbm5pbmcnLlxuICogMi4gaWYgdGhlcmUgYXJlIHR3byB0b3VjaCBwb2ludHMsIHRoZW4gY2FsYyB0aGUgdHJhbmZvcm0gYW5kIHRyaWdnZXJcbiAqICAgJ2R1YWx0b3VjaCcuXG4gKlxuICogQGV2ZW50XG4gKiBAcGFyYW0gIHtldmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gdG91Y2htb3ZlSGFuZGxlcihldmVudCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV1cbiAgICB2YXIgZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoLmlkZW50aWZpZXJdXG5cbiAgICBpZiAoIWdlc3R1cmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghZ2VzdHVyZS5sYXN0VG91Y2gpIHtcbiAgICAgIGdlc3R1cmUubGFzdFRvdWNoID0gZ2VzdHVyZS5zdGFydFRvdWNoXG4gICAgfVxuICAgIGlmICghZ2VzdHVyZS5sYXN0VGltZSkge1xuICAgICAgZ2VzdHVyZS5sYXN0VGltZSA9IGdlc3R1cmUuc3RhcnRUaW1lXG4gICAgfVxuICAgIGlmICghZ2VzdHVyZS52ZWxvY2l0eVgpIHtcbiAgICAgIGdlc3R1cmUudmVsb2NpdHlYID0gMFxuICAgIH1cbiAgICBpZiAoIWdlc3R1cmUudmVsb2NpdHlZKSB7XG4gICAgICBnZXN0dXJlLnZlbG9jaXR5WSA9IDBcbiAgICB9XG4gICAgaWYgKCFnZXN0dXJlLmR1cmF0aW9uKSB7XG4gICAgICBnZXN0dXJlLmR1cmF0aW9uID0gMFxuICAgIH1cblxuICAgIHZhciB0aW1lID0gIERhdGUubm93KCkgLSBnZXN0dXJlLmxhc3RUaW1lXG4gICAgdmFyIHZ4ID0gKHRvdWNoLmNsaWVudFggLSBnZXN0dXJlLmxhc3RUb3VjaC5jbGllbnRYKSAvIHRpbWVcbiAgICB2YXIgdnkgPSAodG91Y2guY2xpZW50WSAtIGdlc3R1cmUubGFzdFRvdWNoLmNsaWVudFkpIC8gdGltZVxuXG4gICAgdmFyIFJFQ09SRF9EVVJBVElPTiA9IDcwXG4gICAgaWYgKHRpbWUgPiBSRUNPUkRfRFVSQVRJT04pIHtcbiAgICAgIHRpbWUgPSBSRUNPUkRfRFVSQVRJT05cbiAgICB9XG4gICAgaWYgKGdlc3R1cmUuZHVyYXRpb24gKyB0aW1lID4gUkVDT1JEX0RVUkFUSU9OKSB7XG4gICAgICBnZXN0dXJlLmR1cmF0aW9uID0gUkVDT1JEX0RVUkFUSU9OIC0gdGltZVxuICAgIH1cblxuICAgIGdlc3R1cmUudmVsb2NpdHlYID0gKGdlc3R1cmUudmVsb2NpdHlYICogZ2VzdHVyZS5kdXJhdGlvbiArIHZ4ICogdGltZSlcbiAgICAgIC8gKGdlc3R1cmUuZHVyYXRpb24gKyB0aW1lKVxuICAgIGdlc3R1cmUudmVsb2NpdHlZID0gKGdlc3R1cmUudmVsb2NpdHlZICogZ2VzdHVyZS5kdXJhdGlvbiArIHZ5ICogdGltZSlcbiAgICAgIC8gKGdlc3R1cmUuZHVyYXRpb24gKyB0aW1lKVxuICAgIGdlc3R1cmUuZHVyYXRpb24gKz0gdGltZVxuXG4gICAgZ2VzdHVyZS5sYXN0VG91Y2ggPSB7fVxuXG4gICAgZm9yICh2YXIgcCBpbiB0b3VjaCkge1xuICAgICAgZ2VzdHVyZS5sYXN0VG91Y2hbcF0gPSB0b3VjaFtwXVxuICAgIH1cbiAgICBnZXN0dXJlLmxhc3RUaW1lID0gRGF0ZS5ub3coKVxuXG4gICAgdmFyIGRpc3BsYWNlbWVudFggPSB0b3VjaC5jbGllbnRYIC0gZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFhcbiAgICB2YXIgZGlzcGxhY2VtZW50WSA9IHRvdWNoLmNsaWVudFkgLSBnZXN0dXJlLnN0YXJ0VG91Y2guY2xpZW50WVxuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChNYXRoLnBvdyhkaXNwbGFjZW1lbnRYLCAyKVxuICAgICAgKyBNYXRoLnBvdyhkaXNwbGFjZW1lbnRZLCAyKSlcbiAgICB2YXIgaXNWZXJ0aWNhbCA9ICEoTWF0aC5hYnMoZGlzcGxhY2VtZW50WCkgPiBNYXRoLmFicyhkaXNwbGFjZW1lbnRZKSlcbiAgICB2YXIgZGlyZWN0aW9uID0gaXNWZXJ0aWNhbFxuICAgICAgPyBkaXNwbGFjZW1lbnRZID49IDAgPyAnZG93bicgOiAndXAnXG4gICAgICA6IGRpc3BsYWNlbWVudFggPj0gMCA/ICdyaWdodCcgOiAnbGVmdCdcblxuICAgIC8vIG1hZ2ljIG51bWJlciAxMDogbW92aW5nIDEwcHggbWVhbnMgcGFuLCBub3QgdGFwXG4gICAgaWYgKChnZXN0dXJlLnN0YXR1cyA9PT0gJ3RhcHBpbmcnIHx8IGdlc3R1cmUuc3RhdHVzID09PSAncHJlc3NpbmcnKVxuICAgICAgICAmJiBkaXN0YW5jZSA+IDEwKSB7XG4gICAgICBnZXN0dXJlLnN0YXR1cyA9ICdwYW5uaW5nJ1xuICAgICAgZ2VzdHVyZS5pc1ZlcnRpY2FsID0gaXNWZXJ0aWNhbFxuICAgICAgZ2VzdHVyZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cblxuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3BhbnN0YXJ0Jywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoZXM6IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzOiBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnQsXG4gICAgICAgIGlzVmVydGljYWw6IGdlc3R1cmUuaXNWZXJ0aWNhbCxcbiAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncGFubmluZycpIHtcbiAgICAgIGdlc3R1cmUucGFuVGltZSA9IERhdGUubm93KClcblxuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3Bhbm1vdmUnLCB7XG4gICAgICAgIGRpc3BsYWNlbWVudFg6IGRpc3BsYWNlbWVudFgsXG4gICAgICAgIGRpc3BsYWNlbWVudFk6IGRpc3BsYWNlbWVudFksXG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudCxcbiAgICAgICAgaXNWZXJ0aWNhbDogZ2VzdHVyZS5pc1ZlcnRpY2FsLFxuICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PSAyKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gW11cbiAgICB2YXIgY3VycmVudCA9IFtdXG4gICAgdmFyIGVsZW1lbnRzID0gW11cbiAgICB2YXIgdHJhbnNmb3JtXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LnRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbaV1cbiAgICAgIHZhciBnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2guaWRlbnRpZmllcl1cbiAgICAgIHBvc2l0aW9uLnB1c2goW2dlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRYLCBnZXN0dXJlLnN0YXJ0VG91Y2guY2xpZW50WV0pXG4gICAgICBjdXJyZW50LnB1c2goW3RvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFldKVxuICAgIH1cblxuICAgIGZvciAodmFyIHAgaW4gZ2VzdHVyZXMpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goZ2VzdHVyZXNbcF0uZWxlbWVudClcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm0gPSBjYWxjKFxuICAgICAgcG9zaXRpb25bMF1bMF0sXG4gICAgICBwb3NpdGlvblswXVsxXSxcbiAgICAgIHBvc2l0aW9uWzFdWzBdLFxuICAgICAgcG9zaXRpb25bMV1bMV0sXG4gICAgICBjdXJyZW50WzBdWzBdLFxuICAgICAgY3VycmVudFswXVsxXSxcbiAgICAgIGN1cnJlbnRbMV1bMF0sXG4gICAgICBjdXJyZW50WzFdWzFdXG4gICAgKVxuICAgIGZpcmVFdmVudChnZXRDb21tb25BbmNlc3RvcihlbGVtZW50c1swXSwgZWxlbWVudHNbMV0pLCAnZHVhbHRvdWNoJywge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICB0b3VjaGVzOiBldmVudC50b3VjaGVzLFxuICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogaGFuZGxlIHRvdWNoZW5kIGV2ZW50XG4gKlxuICogMS4gaWYgdGhlcmUgYXJlIHRvdyB0b3VjaCBwb2ludHMsIHRoZW4gdHJpZ2dlciAnZHVhbHRvdWNoZW5kJ+WmglxuICpcbiAqIDIuIHRyYXZlcnNlIGV2ZXJ5IHRvdWNoIHBpb25077yaXG4gKiA+IGlmIHRhcHBpbmcsIHRoZW4gdHJpZ2dlciAndGFwJy5cbiAqIElmIHRoZXJlIGlzIGEgdGFwIDMwMCBtaWxsaXNlY29uZHMgYmVmb3JlLCB0aGVuIGl0J3MgYSAnZG91YmxldGFwJy5cbiAqID4gaWYgcGFkZGluZywgdGhlbiBkZWNpZGUgdG8gdHJpZ2dlciAncGFuZW5kJyBvciAnc3dpcGUnXG4gKiA+IGlmIHByZXNzaW5nLCB0aGVuIHRyaWdnZXIgJ3ByZXNzZW5kJy5cbiAqXG4gKiAzLiByZW1vdmUgbGlzdGVuZXJzLlxuICpcbiAqIEBldmVudFxuICogQHBhcmFtICB7ZXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHRvdWNoZW5kSGFuZGxlcihldmVudCkge1xuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09IDIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXVxuICAgIGZvciAodmFyIHAgaW4gZ2VzdHVyZXMpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goZ2VzdHVyZXNbcF0uZWxlbWVudClcbiAgICB9XG4gICAgZmlyZUV2ZW50KGdldENvbW1vbkFuY2VzdG9yKGVsZW1lbnRzWzBdLCBlbGVtZW50c1sxXSksICdkdWFsdG91Y2hlbmQnLCB7XG4gICAgICB0b3VjaGVzOiBzbGljZS5jYWxsKGV2ZW50LnRvdWNoZXMpLFxuICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldXG4gICAgdmFyIGlkID0gdG91Y2guaWRlbnRpZmllclxuICAgIHZhciBnZXN0dXJlID0gZ2VzdHVyZXNbaWRdXG5cbiAgICBpZiAoIWdlc3R1cmUpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIpXG4gICAgICBnZXN0dXJlLnByZXNzaW5nSGFuZGxlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoZ2VzdHVyZS5zdGF0dXMgPT09ICd0YXBwaW5nJykge1xuICAgICAgZ2VzdHVyZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpXG4gICAgICAvLyBmaXJlIGNsaWNrLCBub3QgdGFwLlxuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3dlZXgkdGFwJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICB9KVxuXG4gICAgICBpZiAobGFzdFRhcCAmJiBnZXN0dXJlLnRpbWVzdGFtcCAtIGxhc3RUYXAudGltZXN0YW1wIDwgMzAwKSB7XG4gICAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdkb3VibGV0YXAnLCB7XG4gICAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGxhc3RUYXAgPSBnZXN0dXJlXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncGFubmluZycpIHtcbiAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpXG4gICAgICB2YXIgZHVyYXRpb24gPSBub3cgLSBnZXN0dXJlLnN0YXJ0VGltZVxuICAgICAgdmFyIGRpc3BsYWNlbWVudFggPSB0b3VjaC5jbGllbnRYIC0gZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFhcbiAgICAgIHZhciBkaXNwbGFjZW1lbnRZID0gdG91Y2guY2xpZW50WSAtIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRZXG5cbiAgICAgIHZhciB2ZWxvY2l0eSA9IE1hdGguc3FydChnZXN0dXJlLnZlbG9jaXR5WSAqIGdlc3R1cmUudmVsb2NpdHlZXG4gICAgICAgICsgZ2VzdHVyZS52ZWxvY2l0eVggKiBnZXN0dXJlLnZlbG9jaXR5WClcbiAgICAgIHZhciBpc1N3aXBlID0gdmVsb2NpdHkgPiAwLjUgJiYgKG5vdyAtIGdlc3R1cmUubGFzdFRpbWUpIDwgMTAwXG4gICAgICB2YXIgZXh0cmEgPSB7XG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgaXNTd2lwZTogaXNTd2lwZSxcbiAgICAgICAgdmVsb2NpdHlYOiBnZXN0dXJlLnZlbG9jaXR5WCxcbiAgICAgICAgdmVsb2NpdHlZOiBnZXN0dXJlLnZlbG9jaXR5WSxcbiAgICAgICAgZGlzcGxhY2VtZW50WDogZGlzcGxhY2VtZW50WCxcbiAgICAgICAgZGlzcGxhY2VtZW50WTogZGlzcGxhY2VtZW50WSxcbiAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICB0b3VjaGVzOiBldmVudC50b3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlczogZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50LFxuICAgICAgICBpc1ZlcnRpY2FsOiBnZXN0dXJlLmlzVmVydGljYWwsXG4gICAgICAgIGRpcmVjdGlvbjogZ2VzdHVyZS5kaXJlY3Rpb25cbiAgICAgIH1cblxuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3BhbmVuZCcsIGV4dHJhKVxuICAgICAgaWYgKGlzU3dpcGUpIHtcbiAgICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3N3aXBlJywgZXh0cmEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncHJlc3NpbmcnKSB7XG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncHJlc3NlbmQnLCB7XG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZGVsZXRlIGdlc3R1cmVzW2lkXVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmVIYW5kbGVyLCBmYWxzZSlcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRvdWNoZW5kSGFuZGxlciwgZmFsc2UpXG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0b3VjaGNhbmNlbEhhbmRsZXIsIGZhbHNlKVxuICB9XG59XG5cbi8qKlxuICogaGFuZGxlIHRvdWNoY2FuY2VsXG4gKlxuICogMS4gaWYgdGhlcmUgYXJlIHR3byB0b3VjaCBwb2ludHMsIHRoZW4gdHJpZ2dlciAnZHVhbHRvdWNoZW5kJ1xuICpcbiAqIDIuIHRyYXZlcnNlIGV2ZXJ0eSB0b3VjaCBwb2ludDpcbiAqID4gaWYgcGFubm5pZywgdGhlbiB0cmlnZ2VyICdwYW5lbmQnXG4gKiA+IGlmIHByZXNzaW5nLCB0aGVuIHRyaWdnZXIgJ3ByZXNzZW5kJ1xuICpcbiAqIDMuIHJlbW92ZSBsaXN0ZW5lcnNcbiAqXG4gKiBAZXZlbnRcbiAqIEBwYXJhbSAge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiB0b3VjaGNhbmNlbEhhbmRsZXIoZXZlbnQpIHtcblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PSAyKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW11cbiAgICBmb3IgKHZhciBwIGluIGdlc3R1cmVzKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGdlc3R1cmVzW3BdLmVsZW1lbnQpXG4gICAgfVxuICAgIGZpcmVFdmVudChnZXRDb21tb25BbmNlc3RvcihlbGVtZW50c1swXSwgZWxlbWVudHNbMV0pLCAnZHVhbHRvdWNoZW5kJywge1xuICAgICAgdG91Y2hlczogc2xpY2UuY2FsbChldmVudC50b3VjaGVzKSxcbiAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXVxuICAgIHZhciBpZCA9IHRvdWNoLmlkZW50aWZpZXJcbiAgICB2YXIgZ2VzdHVyZSA9IGdlc3R1cmVzW2lkXVxuXG4gICAgaWYgKCFnZXN0dXJlKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcikge1xuICAgICAgY2xlYXJUaW1lb3V0KGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyKVxuICAgICAgZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncGFubmluZycpIHtcbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5lbmQnLCB7XG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncHJlc3NpbmcnKSB7XG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncHJlc3NlbmQnLCB7XG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICAgIH0pXG4gICAgfVxuICAgIGRlbGV0ZSBnZXN0dXJlc1tpZF1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09PSAwKSB7XG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlSGFuZGxlciwgdHJ1ZSlcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRvdWNoZW5kSGFuZGxlciwgdHJ1ZSlcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRvdWNoY2FuY2VsSGFuZGxlciwgdHJ1ZSlcbiAgfVxufVxuXG5pZiAoIWlzSW5pdGlhbGl6ZWQpIHtcbiAgZG9jRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRvdWNoc3RhcnRIYW5kbGVyLCB0cnVlKVxuICBpc0luaXRpYWxpemVkID0gdHJ1ZVxufVxuIiwiY29uc3QgbGliID0gd2luZG93LmxpYiB8fCAod2luZG93LmxpYiA9IHt9KVxuXG4vKipcbiAqIFZlcnNpb24gY2xhc3MuXG4gKiBAY2xhc3MgbGliLmVudn5WZXJzaW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gdiAtIHZlcnNpb24gbnVtYmVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBWZXJzaW9uICh2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmFsJywge1xuICAgIHZhbHVlOiB2LnRvU3RyaW5nKCksXG4gICAgZW51bWVyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBsYXJnZXIgdGhhblxuICAgKiBAbWV0aG9kIGd0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2IC0gdmVyc2lvblxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJvZiBWZXJzaW9uXG4gICAqL1xuICB0aGlzLmd0ID0gZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gVmVyc2lvbi5jb21wYXJlKHRoaXMsIHYpID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvLlxuICAgKiBAbWV0aG9kIGd0ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdiAtIHZlcnNpb25cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyb2YgVmVyc2lvblxuICAgKi9cbiAgdGhpcy5ndGUgPSBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBWZXJzaW9uLmNvbXBhcmUodGhpcywgdikgPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIGxlc3MgdGhhbi5cbiAgICogQG1ldGhvZCBsdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdiAtIHZlcnNpb25cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyb2YgVmVyc2lvblxuICAgKi9cbiAgdGhpcy5sdCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIFZlcnNpb24uY29tcGFyZSh0aGlzLCB2KSA8IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8uXG4gICAqIEBtZXRob2QgbHRlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2IC0gdmVyc2lvblxuICAgKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJvZiBWZXJzaW9uXG4gICAqL1xuICB0aGlzLmx0ZSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIFZlcnNpb24uY29tcGFyZSh0aGlzLCB2KSA8PSAwXG4gIH1cblxuICAvKipcbiAgICogZXF1YWwgdG8uXG4gICAqIEBtZXRob2QgZXFcbiAgICogQHBhcmFtIHtTdHJpbmd9IHYgLSB2ZXJzaW9uXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGVxdWFsIHRvXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyb2YgVmVyc2lvblxuICAgKi9cbiAgdGhpcy5lcSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIFZlcnNpb24uY29tcGFyZSh0aGlzLCB2KSA9PT0gMFxuICB9XG59XG5cbi8qKlxuICogdmVyc2lvbiBudW1iZXIgc3RyaW5nLlxuICogQG1ldGhvZCB0b1N0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSBjdXJyZW50IHZlcnNpb24gbnVtYmVyIHN0cmluZy5cbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlcm9mIFZlcnNpb25cbiAqL1xuVmVyc2lvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnZhbFxufVxuXG4vKipcbiAqIHJldHVybiBjdXJyZW50IHZlcnNpb24gbnVtYmVyLlxuICogQG1ldGhvZCB2YWx1ZU9mXG4gKiBAcmV0dXJuIHtCb29sZWFufSB2ZXJzaW9uIG51bWJlclxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyb2YgVmVyc2lvblxuICovXG5WZXJzaW9uLnByb3RvdHlwZS52YWx1ZU9mID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCB2ID0gdGhpcy52YWwuc3BsaXQoJy4nKVxuICBjb25zdCByID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IG4gPSBwYXJzZUludCh2W2ldLCAxMClcbiAgICBpZiAoaXNOYU4obikpIHtcbiAgICAgIG4gPSAwXG4gICAgfVxuICAgIGxldCBzID0gbi50b1N0cmluZygpXG4gICAgaWYgKHMubGVuZ3RoIDwgNSkge1xuICAgICAgcyA9IEFycmF5KDYgLSBzLmxlbmd0aCkuam9pbignMCcpICsgc1xuICAgIH1cbiAgICByLnB1c2gocylcbiAgICBpZiAoci5sZW5ndGggPT09IDEpIHtcbiAgICAgIHIucHVzaCgnLicpXG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJzZUZsb2F0KHIuam9pbignJykpXG59XG5cbi8qKlxuICogY29tcGFyZSB0d28gdmVyc2lvbnMuXG4gKiBAbWV0aG9kIGNvbXBhcmVcbiAqIEBwYXJhbSB7U3RyaW5nfSB2MSAtIHZlcnNpb24xXG4gKiBAcGFyYW0ge1N0cmluZ30gdjIgLSB2ZXJzaW9uMlxuICogQHJldHVybiB7TnVtYmVyfSAwIGZvciBlcXVhbGl0ee+8jC0xIGZvciBsZXNzIHRoYW7vvIwxIGZvciBsYXJnZXIgdGhhbi5cbiAqIEBtZW1iZXJvZiBWZXJzaW9uXG4gKi9cblZlcnNpb24uY29tcGFyZSA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgdjEgPSB2MS50b1N0cmluZygpLnNwbGl0KCcuJylcbiAgdjIgPSB2Mi50b1N0cmluZygpLnNwbGl0KCcuJylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2MS5sZW5ndGggfHwgaSA8IHYyLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IG4xID0gcGFyc2VJbnQodjFbaV0sIDEwKVxuICAgIGxldCBuMiA9IHBhcnNlSW50KHYyW2ldLCAxMClcbiAgICBpZiAod2luZG93LmlzTmFOKG4xKSkge1xuICAgICAgbjEgPSAwXG4gICAgfVxuICAgIGlmICh3aW5kb3cuaXNOYU4objIpKSB7XG4gICAgICBuMiA9IDBcbiAgICB9XG4gICAgaWYgKG4xIDwgbjIpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICBlbHNlIGlmIChuMSA+IG4yKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgfVxuICByZXR1cm4gMFxufVxuXG4vKipcbiAqIOino+aekOWSjOaTjeS9nOeJiOacrOWPt1xuICogQG1ldGhvZCB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gdiAtIOmcgOimgeino+aekOeahOeJiOacrOWPt1xuICogQHJldHVybiB7bGliLmVudn5WZXJzaW9ufSBWZXJzb27lrp7kvotcbiAqIEBtZW1iZXJvZiBsaWJcbiAqL1xubGliLnZlcnNpb24gPSBmdW5jdGlvbiAodikge1xuICByZXR1cm4gbmV3IFZlcnNpb24odilcbn1cbiIsImNvbnN0IGxpYiA9IHdpbmRvdy5saWIgfHwgKHdpbmRvdy5saWIgPSB7fSlcbmNvbnN0IGVudiA9IGxpYi5lbnYgfHwgKGxpYi5lbnYgPSB7fSlcblxuY29uc3Qgc2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpXG5lbnYucGFyYW1zID0ge31cbmlmIChzZWFyY2gpIHtcbiAgY29uc3QgcGFyYW1zID0gc2VhcmNoLnNwbGl0KCcmJylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYXJhbXNbaV0gPSBwYXJhbXNbaV0uc3BsaXQoJz0nKVxuICAgIHRyeSB7XG4gICAgICBlbnYucGFyYW1zW3BhcmFtc1tpXVswXV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFyYW1zW2ldWzFdKVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgZW52LnBhcmFtc1twYXJhbXNbaV1bMF1dID0gcGFyYW1zW2ldWzFdXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgJy4vdmVyc2lvbidcbmltcG9ydCAnLi9wYXJhbXMnXG5cbmNvbnN0IGxpYiA9IHdpbmRvdy5saWIgfHwgKHdpbmRvdy5saWIgPSB7fSlcbmNvbnN0IGVudiA9IGxpYi5lbnYgfHwgKGxpYi5lbnYgPSB7fSlcblxuY29uc3QgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudFxubGV0IG1hdGNoXG5cbi8qKlxuICogb3NcbiAqL1xuXG5tYXRjaCA9IHVhLm1hdGNoKC9XaW5kb3dzXFxzUGhvbmVcXHMoPzpPU1xccyk/KFtcXGQuXSspLylcbmlmIChtYXRjaCkge1xuICAvKipcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQG1lbWJlcm9mIGxpYi5lbnZcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgLSBvcyBuYW1lLCBlLmcuIEFuZHJvaWQvQW5kcm9pZFBhZC9pUGhvbmUvaVBvZC9pUGFkL1dpbmRvd3MgUGhvbmUvdW5rbm93biwgZXRjLlxuICAgKiBAcHJvcGVydHkge2xpYi5lbnZ+VmVyc2lvbn0gdmVyc2lvbiAtIG9zIHZlcnNpb24uXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNXaW5kb3dzUGhvbmVcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0lQaG9uZSAtIGlzIGlQaG9uZS9pVG91Y2hcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0lQYWRcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0lPU1xuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzQW5kcm9pZFxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzQW5kcm9pZFBhZFxuICAgKi9cbiAgZW52Lm9zID0ge1xuICAgIG5hbWU6ICdXaW5kb3dzIFBob25lJyxcbiAgICBpc1dpbmRvd3NQaG9uZTogdHJ1ZSxcbiAgICB2ZXJzaW9uOiBtYXRjaFsxXVxuICB9XG59XG5lbHNlIGlmICghIXVhLm1hdGNoKC9TYWZhcmkvKSAmJiAobWF0Y2ggPSB1YS5tYXRjaCgvQW5kcm9pZFtcXHMvXShbXFxkLl0rKS8pKSkge1xuICBlbnYub3MgPSB7XG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxuXG4gIGlmICgodWEubWF0Y2goL01vYmlsZVxccytTYWZhcmkvKSkpIHtcbiAgICBlbnYub3MubmFtZSA9ICdBbmRyb2lkJ1xuICAgIGVudi5vcy5pc0FuZHJvaWQgPSB0cnVlXG4gIH1cbiAgZWxzZSB7XG4gICAgZW52Lm9zLm5hbWUgPSAnQW5kcm9pZFBhZCdcbiAgICBlbnYub3MuaXNBbmRyb2lkUGFkID0gdHJ1ZVxuICB9XG59XG5lbHNlIGlmICgobWF0Y2ggPSB1YS5tYXRjaCgvKGlQaG9uZXxpUGFkfGlQb2QpLykpKSB7XG4gIGNvbnN0IG5hbWUgPSBtYXRjaFsxXVxuXG4gIG1hdGNoID0gdWEubWF0Y2goL09TIChbXFxkXy5dKykgbGlrZSBNYWMgT1MgWC8pXG5cbiAgZW52Lm9zID0ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaXNJUGhvbmU6IChuYW1lID09PSAnaVBob25lJyB8fCBuYW1lID09PSAnaVBvZCcpLFxuICAgIGlzSVBhZDogbmFtZSA9PT0gJ2lQYWQnLFxuICAgIGlzSU9TOiB0cnVlLFxuICAgIHZlcnNpb246IG1hdGNoICYmIG1hdGNoWzFdLnNwbGl0KCdfJykuam9pbignLicpIHx8ICcnXG4gIH1cbn1cbmVsc2Uge1xuICBlbnYub3MgPSB7XG4gICAgbmFtZTogJ3Vua25vd24nLFxuICAgIHZlcnNpb246ICcwLjAuMCdcbiAgfVxufVxuXG5pZiAobGliLnZlcnNpb24pIHtcbiAgZW52Lm9zLnZlcnNpb24gPSBsaWIudmVyc2lvbihlbnYub3MudmVyc2lvbilcbn1cblxuLyoqXG4gKiBicm93c2VyXG4gKi9cblxubWF0Y2ggPSB1YS5tYXRjaCgvKD86VUNXRUJ8VUNCcm93c2VyXFwvKShbXFxkLl0rKS8pXG5cbmlmIChtYXRjaCkge1xuICAvKipcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQG1lbWJlcm9mIGVudlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSAtIGJyb3dzZXIgbmFtZe+8jGUuZy4gVUMvUVEvRmlyZWZveC9DaHJvbWUvQW5kcm9pZC9TYWZhcmkvaU9TIFdlYnZpZXcvQ2hyb21lIFdlYnZpZXcvSUUvSUVNb2JpbGUvdW5rbm93biwgZXRjLlxuICAgKiBAcHJvcGVydHkge2Vudn5WZXJzaW9ufSB2ZXJzaW9uIC0gYnJvd3NlciB2ZXJzaW9uLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzVUNcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc1FRXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNJRVxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzSUVNb2JpbGVcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0lFTGlrZVdlYmtpdFxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzQ2hyb21lXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNBbmRyb2lkXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNTYWZhcmlcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc1dlYnZpZXdcbiAgICovXG4gIGVudi5icm93c2VyID0ge1xuICAgIG5hbWU6ICdVQycsXG4gICAgaXNVQzogdHJ1ZSxcbiAgICB2ZXJzaW9uOiBtYXRjaFsxXVxuICB9XG59XG5lbHNlIGlmICgobWF0Y2ggPSB1YS5tYXRjaCgvTVFRQnJvd3NlclxcLyhbXFxkLl0rKS8pKSkge1xuICBlbnYuYnJvd3NlciA9IHtcbiAgICBuYW1lOiAnUVEnLFxuICAgIGlzUVE6IHRydWUsXG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxufVxuZWxzZSBpZiAoKG1hdGNoID0gdWEubWF0Y2goL0ZpcmVmb3hcXC8oW1xcZC5dKykvKSkpIHtcbiAgZW52LmJyb3dzZXIgPSB7XG4gICAgbmFtZTogJ0ZpcmVmb3gnLFxuICAgIGlzRmlyZWZveDogdHJ1ZSxcbiAgICB2ZXJzaW9uOiBtYXRjaFsxXVxuICB9XG59XG5lbHNlIGlmICgobWF0Y2ggPSB1YS5tYXRjaCgvTVNJRVxccyhbXFxkLl0rKS8pKVxuICB8fCAobWF0Y2ggPSB1YS5tYXRjaCgvSUVNb2JpbGVcXC8oW1xcZC5dKykvKSkpIHtcbiAgZW52LmJyb3dzZXIgPSB7XG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxuXG4gIGlmICh1YS5tYXRjaCgvSUVNb2JpbGUvKSkge1xuICAgIGVudi5icm93c2VyLm5hbWUgPSAnSUVNb2JpbGUnXG4gICAgZW52LmJyb3dzZXIuaXNJRU1vYmlsZSA9IHRydWVcbiAgfVxuICBlbHNlIHtcbiAgICBlbnYuYnJvd3Nlci5uYW1lID0gJ0lFJ1xuICAgIGVudi5icm93c2VyLmlzSUUgPSB0cnVlXG4gIH1cblxuICBpZiAodWEubWF0Y2goL0FuZHJvaWR8aVBob25lLykpIHtcbiAgICBlbnYuYnJvd3Nlci5pc0lFTGlrZVdlYmtpdCA9IHRydWVcbiAgfVxufVxuZWxzZSBpZiAoKG1hdGNoID0gdWEubWF0Y2goLyg/OkNocm9tZXxDcmlPUylcXC8oW1xcZC5dKykvKSkpIHtcbiAgZW52LmJyb3dzZXIgPSB7XG4gICAgbmFtZTogJ0Nocm9tZScsXG4gICAgaXNDaHJvbWU6IHRydWUsXG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxuXG4gIGlmICh1YS5tYXRjaCgvVmVyc2lvblxcL1tcXGQrLl0rXFxzKkNocm9tZS8pKSB7XG4gICAgZW52LmJyb3dzZXIubmFtZSA9ICdDaHJvbWUgV2VidmlldydcbiAgICBlbnYuYnJvd3Nlci5pc1dlYnZpZXcgPSB0cnVlXG4gIH1cbn1cbmVsc2UgaWYgKCEhdWEubWF0Y2goL1NhZmFyaS8pICYmIChtYXRjaCA9IHVhLm1hdGNoKC9BbmRyb2lkW1xccy9dKFtcXGQuXSspLykpKSB7XG4gIGVudi5icm93c2VyID0ge1xuICAgIG5hbWU6ICdBbmRyb2lkJyxcbiAgICBpc0FuZHJvaWQ6IHRydWUsXG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxufVxuZWxzZSBpZiAodWEubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvKSkge1xuICBpZiAodWEubWF0Y2goL1NhZmFyaS8pKSB7XG4gICAgbWF0Y2ggPSB1YS5tYXRjaCgvVmVyc2lvblxcLyhbXFxkLl0rKS8pXG4gICAgZW52LmJyb3dzZXIgPSB7XG4gICAgICBuYW1lOiAnU2FmYXJpJyxcbiAgICAgIGlzU2FmYXJpOiB0cnVlLFxuICAgICAgdmVyc2lvbjogbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJydcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgbWF0Y2ggPSB1YS5tYXRjaCgvT1MgKFtcXGRfLl0rKSBsaWtlIE1hYyBPUyBYLylcbiAgICBlbnYuYnJvd3NlciA9IHtcbiAgICAgIG5hbWU6ICdpT1MgV2VidmlldycsXG4gICAgICBpc1dlYnZpZXc6IHRydWUsXG4gICAgICB2ZXJzaW9uOiBtYXRjaCAmJiBtYXRjaFsxXS5yZXBsYWNlKC9fL2csICcuJykgfHwgJydcbiAgICB9XG4gIH1cbn1cbmVsc2Uge1xuICBlbnYuYnJvd3NlciA9IHtcbiAgICBuYW1lOiAndW5rbm93bicsXG4gICAgdmVyc2lvbjogJzAuMC4wJ1xuICB9XG59XG5cbmlmIChsaWIudmVyc2lvbikge1xuICBlbnYuYnJvd3Nlci52ZXJzaW9uID0gbGliLnZlcnNpb24oZW52LmJyb3dzZXIudmVyc2lvbilcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuLyoqXG4gKiBTdHJpY3Qgb2JqZWN0IHR5cGUgY2hlY2suIE9ubHkgcmV0dXJucyB0cnVlXG4gKiBmb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5jb25zdCBPQkpFQ1RfU1RSSU5HID0gJ1tvYmplY3QgT2JqZWN0XSdcbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gT0JKRUNUX1NUUklOR1xufVxuXG5jb25zdCBBUlJBWV9TVFJJTkcgPSAnW29iamVjdCBBcnJheV0nXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT09IEFSUkFZX1NUUklOR1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcidcbiAgICB8fCB0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnXG4gICAgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gbnVsbFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBpc0FycmF5XG59IGZyb20gJy4vdHlwZSdcbi8qKlxuICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LlxuICogdGhlIHJpZ2h0ZXN0IG9iamVjdCdzIHZhbHVlIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCAodG8sIC4uLmFyZ3MpIHtcbiAgaWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gdG9cbiAgfVxuICBhcmdzLmZvckVhY2goZnJvbSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgIHRvW2tleV0gPSBmcm9tW2tleV1cbiAgICB9XG4gIH0pXG4gIHJldHVybiB0b1xufVxuLyoqXG4gKiBNaXggdHJ1dGh5IG9yICcnIHByb3BlcnR5IHZhbHVlcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKiBtb3N0bHkgZm9yIG1lcmdpbmcgc3R5bGVzLiAodGhhdCdzIHdoeSAnJyBpcyBmYWxzeSBidXQgc3RpbGwgc2hvdWxkIGJlIGNvdW50ZWQgaW4uKVxuICogdGhlIHJpZ2h0ZXN0IG9iamVjdCdzIHZhbHVlIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZFRydXRoeSAodG8sIC4uLmFyZ3MpIHtcbiAgaWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gdG9cbiAgfVxuICBhcmdzLmZvckVhY2goZnJvbSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxldCBpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgaWYgKCgoaSA9IGZyb21ba2V5XSkgfHwgaSA9PT0gJycgfHwgaSA9PT0gMCkgJiYgaSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdG9ba2V5XSA9IGlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiB0b1xufVxuLyoqXG4gKiBNaXggc3BlY2lmaWVkIHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kS2V5cyAodG8sIGZyb20gPSB7fSwga2V5cykge1xuICAoa2V5cyB8fCBbXSkuZm9yRWFjaChrZXkgPT4ge1xuICAgIGZyb20gJiYgKHRvW2tleV0gPSBmcm9tW2tleV0pXG4gIH0pXG4gIHJldHVybiB0b1xufVxuLyoqXG4gKiBFeHRyYWN0IHNwZWNpZmllZCBwcm9wZXJ0aWVzIGZyb20gc3JjIHRvIHRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0S2V5cyAodG8sIGZyb20gPSB7fSwga2V5cykge1xuICBpZiAoIWZyb20pIHtcbiAgICByZXR1cm4gdG9cbiAgfVxuICAoa2V5cyB8fCBbXSkuZm9yRWFjaChrZXkgPT4ge1xuICAgIGZyb20gJiYgKHRvW2tleV0gPSBmcm9tW2tleV0pXG4gICAgZnJvbSAmJiAoZGVsZXRlIGZyb21ba2V5XSlcbiAgfSlcbiAgcmV0dXJuIHRvXG59XG4vKipcbiAqIFNpbXBsZSBiaW5kLCBmYXN0ZXIgdGhhbiBuYXRpdmVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGN0eFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kIChmbiwgY3R4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgIGNvbnN0IGwgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgcmV0dXJuIGwgPyBsID4gMSA/IGZuLmFwcGx5KGN0eCwgYXJndW1lbnRzKSA6IGZuLmNhbGwoY3R4LCBhKSA6IGZuLmNhbGwoY3R4KVxuICB9XG59XG4vKipcbiAqIE9ubHkgY2FsbCB0aGUgZnVuYyB0aGUgbGFzdCB0aW1lIGJlZm9yZSBpdCdzIG5vdCB0aGF0IGZyZXF1ZW50bHkgY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2UgKGZ1bmMsIHdhaXQpIHtcbiAgbGV0IHRpbWVySWRcbiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gbGF0ZXIgKCkge1xuICAgICAgdGltZXJJZCA9IG51bGxcbiAgICAgIGZ1bmMuYXBwbHkobnVsbCwgYXJncylcbiAgICB9LCB3YWl0KVxuICB9XG59XG4vKipcbiAqIE9ubHkgY2FsbCB0aGUgZnVuYyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgYSBzZXJpZXMgZnJlcXVlbnRseSBmdW5jdGlvbiBjYWxscyBoYXBwZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXByZXNzIChmdW5jLCB3YWl0KSB7XG4gIGxldCB0aW1lcklkXG5cbiAgZnVuY3Rpb24gbGF0ZXIgKCkge1xuICAgIHRpbWVySWQgPSBudWxsXG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRpbWVySWQpIHtcbiAgICAgIGZ1bmMuYXBwbHkoKVxuICAgIH1cbiAgICBjbGVhclRpbWVvdXQodGltZXJJZClcbiAgICB0aW1lcklkID0gc2V0VGltZW91dChsYXRlciwgd2FpdClcbiAgfVxufVxuLyoqXG4gKiBPbmx5IGNhbGwgdGhlIGZ1bmMgZXZlcnkgdGltZSBhZnRlciBhIHdhaXQgbWlsbGlzZWNvbmRzIGlmIGl0J3MgdG9vIGZyZXF1ZW50bHkgY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3R0bGUgKGZ1bmMsIHdhaXQsIGNhbGxMYXN0VGltZSkge1xuICBsZXQgbGFzdCA9IDBcbiAgbGV0IGxhc3RUaW1lciA9IG51bGxcbiAgY29uc3QgbGFzdFRpbWVEdXJhdGlvbiA9IHdhaXQgKyAod2FpdCA+IDI1ID8gd2FpdCA6IDI1KSAvLyBwbHVzIGhhbGYgd2FpdCB0aW1lLlxuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpc1xuICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIGlmICh0aW1lIC0gbGFzdCA+IHdhaXQpIHtcbiAgICAgIGlmIChjYWxsTGFzdFRpbWUpIHtcbiAgICAgICAgbGFzdFRpbWVyICYmIGNsZWFyVGltZW91dChsYXN0VGltZXIpXG4gICAgICAgIGxhc3RUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxhc3RUaW1lciA9IG51bGxcbiAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgICAgIH0sIGxhc3RUaW1lRHVyYXRpb24pXG4gICAgICB9XG4gICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgICBsYXN0ID0gdGltZVxuICAgIH1cbiAgfVxufVxuLy8gZGlyZWN0aW9uOiAnbCcgfCAncicsIGRlZmF1bHQgaXMgJ3InXG4vLyBudW06IGhvdyBtYW55IHRpbWVzIHRvIGxvb3AsIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXJcbmV4cG9ydCBmdW5jdGlvbiBsb29wQXJyYXkgKGFyciwgbnVtLCBkaXJlY3Rpb24pIHtcbiAgaWYgKCFpc0FycmF5KGFycikpIHtcbiAgICByZXR1cm5cbiAgfVxuICBsZXQgaXNMZWZ0ID0gKGRpcmVjdGlvbiArICcnKS50b0xvd2VyQ2FzZSgpID09PSAnbCdcbiAgY29uc3QgbGVuID0gYXJyLmxlbmd0aFxuICBudW0gPSBudW0gJSBsZW5cbiAgaWYgKG51bSA8IDApIHtcbiAgICBudW0gPSAtbnVtXG4gICAgaXNMZWZ0ID0gIWlzTGVmdFxuICB9XG4gIGlmIChudW0gPT09IDApIHtcbiAgICByZXR1cm4gYXJyXG4gIH1cbiAgbGV0IGxwLCBycFxuICBpZiAoaXNMZWZ0KSB7XG4gICAgbHAgPSBhcnIuc2xpY2UoMCwgbnVtKVxuICAgIHJwID0gYXJyLnNsaWNlKG51bSlcbiAgfVxuICBlbHNlIHtcbiAgICBscCA9IGFyci5zbGljZSgwLCBsZW4gLSBudW0pXG4gICAgcnAgPSBhcnIuc2xpY2UobGVuIC0gbnVtKVxuICB9XG4gIHJldHVybiBycC5jb25jYXQobHApXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGVkIHZlcnNpb24gb2YgYSBwdXJlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdXG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpXG4gIH1cbn1cbi8qKlxuICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsbWl0ZWQgc3RyaW5nLlxuICovXG5jb25zdCBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nXG5leHBvcnQgY29uc3QgY2FtZWxpemUgPSBjYWNoZWQoc3RyID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIChfLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpXG59KVxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsaXplS2V5cyAob2JqKSB7XG4gIGNvbnN0IHJlcyA9IHt9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIHJlc1tjYW1lbGl6ZShrZXkpXSA9IG9ialtrZXldXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuLyoqXG4gKiBDYXBpdGFsaXplIGEgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZSA9IGNhY2hlZChzdHIgPT4ge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KVxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG5jb25zdCBoeXBoZW5hdGVSRSA9IC8oW14tXSkoW0EtWl0pL2dcbmV4cG9ydCBjb25zdCBoeXBoZW5hdGUgPSBjYWNoZWQoc3RyID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnJDEtJDInKS5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59KVxuZXhwb3J0IGZ1bmN0aW9uIGh5cGhlbmF0ZUtleXMgKG9iaikge1xuICBjb25zdCByZXMgPSB7fVxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICByZXNbaHlwaGVuYXRlKGtleSldID0gb2JqW2tleV1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5jb25zdCB2ZW5kb3JzUmVnID0gL3dlYmtpdC18bW96LXxvLXxtcy0vXG5leHBvcnQgZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVLZXlzIChvYmopIHtcbiAgY29uc3QgcmVzID0ge31cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgY29uc3QgaGsgPSBoeXBoZW5hdGUoa2V5KS5yZXBsYWNlKHZlbmRvcnNSZWcsIGZ1bmN0aW9uICgkMCkge1xuICAgICAgcmV0dXJuICctJyArICQwXG4gICAgfSlcbiAgICByZXNbaGtdID0gb2JqW2tleV1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5leHBvcnQgZnVuY3Rpb24gY2FtZWxUb0tlYmFiIChuYW1lKSB7XG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKGcsIGcxKSB7XG4gICAgcmV0dXJuIGAtJHtnMS50b0xvd2VyQ2FzZSgpfWBcbiAgfSlcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRDc3MgKGNzcywgY3NzSWQsIHJlcGxhY2UpIHtcbiAgbGV0IHN0eWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3NzSWQpXG4gIGlmIChzdHlsZSAmJiByZXBsYWNlKSB7XG4gICAgc3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSlcbiAgICBzdHlsZSA9IG51bGxcbiAgfVxuICBpZiAoIXN0eWxlKSB7XG4gICAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgc3R5bGUudHlwZSA9ICd0ZXh0L2NzcydcbiAgICBjc3NJZCAmJiAoc3R5bGUuaWQgPSBjc3NJZClcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlKVxuICB9XG4gIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpXG59XG5leHBvcnQgZnVuY3Rpb24gbmV4dEZyYW1lIChjYWxsYmFjaykge1xuICBjb25zdCBydW5uZXIgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICB8fCAoY2IgPT4gc2V0VGltZW91dChjYiwgMTYpKVxuICBydW5uZXIoY2FsbGJhY2spXG59XG5leHBvcnQgZnVuY3Rpb24gdG9DU1NUZXh0IChvYmplY3QpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBvYmogPSBoeXBoZW5hdGVTdHlsZUtleXMob2JqZWN0KVxuICBsZXQgY3NzVGV4dCA9ICcnXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGNzc1RleHQgKz0gYCR7a2V5fToke29ialtrZXldfTtgXG4gIH1cbiAgcmV0dXJuIGNzc1RleHRcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi91dGlscy9mdW5jJ1xuXG4vKipcbiAqIHZpZXdwb3J0IHByaW9yaXR5OlxuICpcbiAqIDEuIG1ldGEgd2VleC12aWV3cG9ydCAoZGV2ZWxvcGVyIGN1c3RvbSlcbiAqIDIuIHNldFZpZXdwb3J0KGNvbmZpZykgOj0gY29uZmlnLndpZHRoIChwcml2YXRlIGNvZGUpIEBkZXByZWNhdGVkXG4gKiAzLiBwcm9jZXNzLmVudi5WSUVXUE9SVF9XSURUSCAoYnVpZCB0aW1lKVxuICpcbiAqL1xubGV0IGlzSW5pdGVkID0gZmFsc2VcbmNvbnN0IERFRkFVTFRfVklFV1BPUlRfV0lEVEggPSA3NTBcblxuLyoqXG4gKiBnZXQgdmlld3BvcnQgd2lkdGggZnJvbSB3ZWV4LXZpZXdwb3J0IG1ldGEuXG4gKi9cbmNvbnN0IGVudlZpZXdwb3J0V2lkdGggPSBwYXJzZUludChwcm9jZXNzLmVudi5WSUVXUE9SVF9XSURUSClcbmxldCB3aWR0aCA9ICFpc05hTihlbnZWaWV3cG9ydFdpZHRoKSAmJiBlbnZWaWV3cG9ydFdpZHRoID4gMFxuICA/IGVudlZpZXdwb3J0V2lkdGhcbiAgOiBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIXG5cbmxldCB3eFZpZXdwb3J0TWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIndlZXgtdmlld3BvcnRcIl0nKVxuY29uc3QgbWV0YVdpZHRoID0gd3hWaWV3cG9ydE1ldGEgJiYgcGFyc2VJbnQod3hWaWV3cG9ydE1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykpXG5pZiAobWV0YVdpZHRoICYmICFpc05hTihtZXRhV2lkdGgpICYmIG1ldGFXaWR0aCA+IDApIHtcbiAgd2lkdGggPSBtZXRhV2lkdGhcbn1cblxubGV0IGRwciA9IDBcbmxldCBzY3JlZW5XaWR0aCA9IDBcbmxldCBzY3JlZW5IZWlnaHQgPSAwXG5cbmNvbnN0IGluZm8gPSB7XG4gIGRwcixcbiAgc2NhbGU6IDAsXG4gIHJvb3RWYWx1ZTogMCxcbiAgcmVtOiAwLFxuICBkZXZpY2VXaWR0aDogMCxcbiAgZGV2aWNlSGVpZ2h0OiAwXG59XG5cbi8qKlxuICogc2V0IHJvb3QgZm9udC1zaXplIGZvciByZW0gdW5pdHMuIElmIGFscmVhZHkgYmVlbiBzZXQsIGp1c3Qgc2tpcCB0aGlzLlxuICovXG5mdW5jdGlvbiBzZXRSb290Rm9udCAod2lkdGgsIHZpZXdwb3J0V2lkdGgsIGZvcmNlKSB7XG4gIGNvbnN0IGRvYyA9IHdpbmRvdy5kb2N1bWVudFxuICBjb25zdCByZW0gPSB3aWR0aCAqIDc1MCAvIHZpZXdwb3J0V2lkdGggLyAxMFxuICBpZiAoIWRvYy5kb2N1bWVudEVsZW1lbnQpIHsgcmV0dXJuIH1cbiAgY29uc3Qgcm9vdEZvbnRTaXplID0gZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5mb250U2l6ZVxuICBpZiAoIXJvb3RGb250U2l6ZSB8fCBmb3JjZSkge1xuICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSByZW0gKyAncHgnXG4gIH1cbiAgaW5mby5yZW0gPSByZW1cbiAgaW5mby5yb290VmFsdWUgPSB2aWV3cG9ydFdpZHRoIC8gMTBcbn1cblxuZnVuY3Rpb24gc2V0TWV0YVZpZXdwb3J0ICh3aWR0aCkge1xuICBpZiAoIXd4Vmlld3BvcnRNZXRhKSB7XG4gICAgd3hWaWV3cG9ydE1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJylcbiAgICB3eFZpZXdwb3J0TWV0YS5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnd2VleC12aWV3cG9ydCcpXG4gICAgY29uc3QgZmlyc3RNZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YScpXG4gICAgY29uc3QgaGVhZCA9IGZpcnN0TWV0YSAmJiBmaXJzdE1ldGEucGFyZW50RWxlbWVudFxuICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkcmVuWzBdXG4gICAgZmlyc3RNZXRhXG4gICAgICA/IGhlYWQuaW5zZXJ0QmVmb3JlKHd4Vmlld3BvcnRNZXRhLCBmaXJzdE1ldGEpXG4gICAgICA6IGhlYWQuYXBwZW5kQ2hpbGQod3hWaWV3cG9ydE1ldGEpXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgbWV0YVdpZHRoID0gcGFyc2VJbnQod3hWaWV3cG9ydE1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykpXG4gICAgaWYgKG1ldGFXaWR0aCA9PT0gd2lkdGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuICB3eFZpZXdwb3J0TWV0YS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCB3aWR0aCArICcnKVxufVxuXG4vKipcbiAqIGV4cG9ydCB2aWV3cG9ydCBpbmZvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAodmlld3BvcnRXaWR0aCA9IHdpZHRoKSB7XG4gIGlmICghaXNJbml0ZWQpIHtcbiAgICBpc0luaXRlZCA9IHRydWVcblxuICAgIGNvbnN0IGRvYyA9IHdpbmRvdy5kb2N1bWVudFxuICAgIGlmICghZG9jKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbdnVlLXJlbmRlcl0gd2luZG93LmRvY3VtZW50IGlzIHVuZGZpbmVkLicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFkb2MuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbdnVlLXJlbmRlcl0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IGlzIHVuZGZpbmVkLicpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkcHIgPSBpbmZvLmRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvXG4gICAgc2NyZWVuV2lkdGggPSBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoXG4gICAgc2NyZWVuSGVpZ2h0ID0gZG9jLmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcblxuICAgIGNvbnN0IHJlc2V0RGV2aWNlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2NyZWVuSGVpZ2h0ID0gZG9jLmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgIGNvbnN0IGVudiA9IHdpbmRvdy53ZWV4ICYmIHdpbmRvdy53ZWV4LmNvbmZpZy5lbnZcbiAgICAgIGluZm8uZGV2aWNlSGVpZ2h0ID0gZW52LmRldmljZUhlaWdodCA9IHNjcmVlbkhlaWdodCAqIGRwclxuICAgIH1cblxuICAgIC8vIHNldCByb290IGZvbnQgZm9yIHJlbS5cbiAgICBzZXRSb290Rm9udChzY3JlZW5XaWR0aCwgdmlld3BvcnRXaWR0aClcbiAgICBzZXRNZXRhVmlld3BvcnQodmlld3BvcnRXaWR0aClcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNldERldmljZUhlaWdodClcblxuICAgIC8qKlxuICAgICAqIHdoeSBub3QgdG8gdXNlIHdpbmRvdy5zY3JlZW4ud2lkdGggdG8gZ2V0IHNjcmVlbldpZHRoID8gQmVjYXVzZSBpbiBzb21lXG4gICAgICogb2xkIHdlYmtpdCBicm93c2VyIG9uIGFuZHJvaWQgc3lzdGVtIGl0IGdldCB0aGUgZGV2aWNlIHBpeGVsIHdpZHRoLCB3aGljaFxuICAgICAqIGlzIHRoZSBzY3JlZW5XaWR0aCBtdWx0aXBseSBieSB0aGUgZGV2aWNlIHBpeGVsIHJhdGlvLlxuICAgICAqIGUuZy4gaXA2IC0+IGdldCAzNzUgZm9yIHZpcnR1YWwgc2NyZWVuIHdpZHRoLlxuICAgICAqL1xuICAgIGNvbnN0IHNjYWxlID0gc2NyZWVuV2lkdGggLyB2aWV3cG9ydFdpZHRoXG4gICAgLyoqXG4gICAgICogMS4gaWYgc2V0IGluaXRpYWwvbWF4aW11bS9taW1pbXVtLXNjYWxlIHNvbWUgaG93IHRoZSBwYWdlIHdpbGwgaGF2ZSBhIGJvdW5jZVxuICAgICAqIGVmZmVjdCB3aGVuIHVzZXIgZHJhZyB0aGUgcGFnZSB0b3dhcmRzIGhvcml6b250YWwgYXhpcy5cbiAgICAgKiAyLiBEdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zLCBub3QgdG8gdXNlIHZpZXdwb3J0IG1ldGEgYW55bW9yZS5cbiAgICAgKiAzLiB2aWV3cG9ydCBtZXRhIHNob3VsZCBhbHdheXMgYmU6XG4gICAgICogICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCJcbiAgICAgKiAgICAgIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsXG4gICAgICogICAgICBpbml0aWFsLXNjYWxlPTEsXG4gICAgICogICAgICBtYXhpbXVtLXNjYWxlPTEsXG4gICAgICogICAgICB1c2VyLXNjYWxhYmxlPW5vXCIgLz5cbiAgICAgKi9cbiAgICBleHRlbmQoaW5mbywge1xuICAgICAgc2NhbGUsXG4gICAgICByb290VmFsdWU6IHZpZXdwb3J0V2lkdGggLyAxMCxcbiAgICAgIGRldmljZVdpZHRoOiBzY3JlZW5XaWR0aCAqIGRwcixcbiAgICAgIGRldmljZUhlaWdodDogc2NyZWVuSGVpZ2h0ICogZHByXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBpbmZvXG59XG5cbi8qKlxuICogcmVzZXQgdmlld3BvcnQgd2lkdGggYW5kIHNjYWxlLlxuICogQHJldHVybiBuZXcgc2NhbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFZpZXdwb3J0ICh2aWV3cG9ydFdpZHRoKSB7XG4gIHNldFJvb3RGb250KHNjcmVlbldpZHRoLCB2aWV3cG9ydFdpZHRoLCB0cnVlKVxuICBzZXRNZXRhVmlld3BvcnQodmlld3BvcnRXaWR0aClcbiAgY29uc3QgbmV3U2NhbGUgPSBzY3JlZW5XaWR0aCAvIHZpZXdwb3J0V2lkdGhcbiAgaW5mby5zY2FsZSA9IG5ld1NjYWxlXG4gIHJldHVybiBuZXdTY2FsZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRJbmZvICgpIHtcbiAgcmV0dXJuIGluZm9cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5mdW5jdGlvbiBleHRlbmQgKHRvLCAuLi5hcmdzKSB7XG4gIGlmICghYXJncyB8fCBhcmdzLmxlbmd0aCA8PSAwKSB7IHJldHVybiB0byB9XG4gIGFyZ3MuZm9yRWFjaChmcm9tID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB7IHJldHVybiB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHRvXG59XG5cbi8vIGlmIHN1cHBvcnQgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMuXG5sZXQgX3N1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlXG50cnkge1xuICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgXyA9PiB7fSwge1xuICAgIGdldCBwYXNzaXZlICgpIHtcbiAgICAgIF9zdXBwb3J0c1Bhc3NpdmUgPSB0cnVlXG4gICAgfVxuICB9KVxufVxuY2F0Y2ggKGUpIHtcbiAgLy8gZG8gbm90aGluZy5cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Bhc3NpdmUgKCkge1xuICByZXR1cm4gX3N1cHBvcnRzUGFzc2l2ZVxufVxuXG4vKipcbiAqIENyZWF0ZSBFdmVudC5cbiAqIEBwYXJhbSB7RE9NU3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50ICh0YXJnZXQsIHR5cGUsIHByb3BzKSB7XG4gIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogZmFsc2UgfSlcblxuICBleHRlbmQoZXZlbnQsIHByb3BzKVxuICAvLyAgcGhhbnRvbWpzIGRvbid0IHN1cHBvcnQgY3VzdG9tZXIgZXZlbnRcbiAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigncGhhbnRvbWpzJykgIT09IC0xKSB7XG4gICAgcmV0dXJuIGV2ZW50XG4gIH1cbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICd0YXJnZXQnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHRhcmdldFxuICAgIH0pXG4gIH1cbiAgY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBleHRlbmQoe30sIGV2ZW50LCB7IHRhcmdldDogdGFyZ2V0IH0pXG4gIH1cbiAgcmV0dXJuIGV2ZW50XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYnViYmFibGUgRXZlbnQuXG4gKiBAcGFyYW0ge0RPTVN0cmluZ30gdHlwZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWJibGVzRXZlbnQgKHRhcmdldCwgdHlwZSwgcHJvcHMpIHtcbiAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQodHlwZSwgeyBidWJibGVzOiB0cnVlIH0pXG4gIGV4dGVuZChldmVudCwgcHJvcHMpXG4gIC8vICBwaGFudG9tanMgZG9uJ3Qgc3VwcG9ydCBjdXN0b21lciBldmVudFxuICBpZiAod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdwaGFudG9tanMnKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gZXZlbnRcbiAgfVxuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ3RhcmdldCcsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdGFyZ2V0XG4gICAgfSlcbiAgfVxuICBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGV4dGVuZCh7fSwgZXZlbnQsIHsgdGFyZ2V0OiB0YXJnZXQgfSlcbiAgfVxuICByZXR1cm4gZXZlbnRcbn1cblxuLyoqXG4gKiBDcmVhdGUgQ3VzdG9tIEV2ZW50LlxuICogQHBhcmFtIHtET01TdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3VzdG9tRXZlbnQgKHRhcmdldCwgdHlwZSwgcHJvcHMpIHtcbiAgLy8gY29tcGF0aWJpbGl0eTogaHR0cDovL2Nhbml1c2UuY29tLyNzZWFyY2g9Y3VzdG9tZXZlbnRcbiAgLy8gY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQodHlwZSlcbiAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICBldmVudC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIHRydWUsIHt9KVxuICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgZXh0ZW5kKGV2ZW50LCBwcm9wcylcblxuICAvLyBldmVudC50YXJnZXQgaXMgcmVhZG9ubHlcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICd0YXJnZXQnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHRhcmdldCB8fCBudWxsXG4gICAgfSlcbiAgfVxuICBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGV4dGVuZCh7fSwgZXZlbnQsIHsgdGFyZ2V0OiB0YXJnZXQgfHwgbnVsbCB9KVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50XG59XG5cbi8qKlxuICogZGlzcGF0Y2ggYSBldmVudCBvbiBhIEhUTUwgZWxlbWVudC5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbG1cbiAqIEBwYXJhbSAge0V2ZW50fSB0eXBlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgZXh0cmEgZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoTmF0aXZlRXZlbnQgKGVsbSwgdHlwZSwgZGF0YSkge1xuICBlbG0uZGlzcGF0Y2hFdmVudChjcmVhdGVFdmVudChlbG0sIHR5cGUsIGRhdGEpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwRm9ybUV2ZW50cyAoY29udGV4dCkge1xuICBjb25zdCBldmVudE1hcCA9IHt9XG4gIDtbJ2lucHV0JywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJywgJ3JldHVybiddLmZvckVhY2godHlwZSA9PiB7XG4gICAgZXZlbnRNYXBbdHlwZV0gPSBldmVudCA9PiB7XG4gICAgICBpZiAoY29udGV4dC4kZWwpIHtcbiAgICAgICAgZXZlbnQudmFsdWUgPSBjb250ZXh0LiRlbC52YWx1ZVxuICAgICAgICAvLyBmb3IgdGhlIHNha2Ugb2Ygdi1tb2RlbCwgYSBpbnB1dCBldmVudCBtdXN0IGJlIGVtaXR0ZWQuXG4gICAgICAgIGlmICh0eXBlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgY29udGV4dC4kZW1pdCh0eXBlLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGV2ZW50TWFwXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWFwRm9ybUV2ZW50c1xufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBoeXBoZW5hdGUgfSBmcm9tICcuL3V0aWxzJ1xuXG5jb25zdCBzY2FsZVN0eWxlcyA9IFtcbiAgJ3dpZHRoJyxcbiAgJ2hlaWdodCcsXG4gICdsZWZ0JyxcbiAgJ3JpZ2h0JyxcbiAgJ3RvcCcsXG4gICdib3R0b20nLFxuICAnYm9yZGVyJyxcbiAgJ2JvcmRlclJhZGl1cycsXG4gICdib3JkZXJXaWR0aCcsXG4gICdib3JkZXJMZWZ0JyxcbiAgJ2JvcmRlclJpZ2h0JyxcbiAgJ2JvcmRlclRvcCcsXG4gICdib3JkZXJCb3R0b20nLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyVG9wV2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnLFxuICAnbWFyZ2luJyxcbiAgJ21hcmdpbkxlZnQnLFxuICAnbWFyZ2luUmlnaHQnLFxuICAnbWFyZ2luVG9wJyxcbiAgJ21hcmdpbkJvdHRvbScsXG4gICdwYWRkaW5nJyxcbiAgJ3BhZGRpbmdMZWZ0JyxcbiAgJ3BhZGRpbmdSaWdodCcsXG4gICdwYWRkaW5nVG9wJyxcbiAgJ3BhZGRpbmdCb3R0b20nLFxuICAnZm9udFNpemUnLFxuICAnbGluZUhlaWdodCcsXG4gICd0cmFuc2Zvcm0nLFxuICAnd2Via2l0VHJhbnNmb3JtJyxcbiAgJ1dlYmtpdFRyYW5zZm9ybScsXG4gICdtb3pUcmFuc2Zvcm0nLFxuICAnTW96VHJhbnNmb3JtJyxcbiAgJ2l0ZW1TaXplJ1xuXVxuXG5jb25zdCB2ZW5kb3JSZWcgPSAvd2Via2l0fG1vei9pXG5mdW5jdGlvbiBoeXBoZW4gKGtleSkge1xuICByZXR1cm4gaHlwaGVuYXRlKGtleS5yZXBsYWNlKHZlbmRvclJlZywgZnVuY3Rpb24gKCQwKSB7XG4gICAgcmV0dXJuIGAtJHskMC50b0xvd2VyQ2FzZSgpfS1gXG4gIH0pKVxufVxuXG5mdW5jdGlvbiBnZXRBbGxTdHlsZXMgKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoc2NhbGVTdHlsZXMucmVkdWNlKGZ1bmN0aW9uIChwcmUsIGtleSkge1xuICAgIHByZVtrZXldID0gMVxuICAgIHByZVtoeXBoZW4oa2V5KV0gPSAxXG4gICAgcmV0dXJuIHByZVxuICB9LCB7fSkpXG59XG5cbmNvbnN0IGFsbFN0eWxlcyA9IGdldEFsbFN0eWxlcygpXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2Nyb2xsYWJsZVR5cGVzOiBbJ3Njcm9sbGVyJywgJ2xpc3QnLCAnd2F0ZXJmYWxsJywgJ3JlY3ljbGUtbGlzdCddLFxuICBnZXN0dXJlRXZlbnRzOiBbXG4gICAgJ3BhbnN0YXJ0JyxcbiAgICAncGFubW92ZScsXG4gICAgJ3BhbmVuZCcsXG4gICAgJ3N3aXBlJyxcbiAgICAnbG9uZ3ByZXNzJyxcbiAgICAndGFwJ1xuICBdLFxuICAvLyB0aGVzZSBjb21wb25lbnRzIHNob3VsZCBub3QgYmluZCBldmVudHMgd2l0aCAubmF0aXZlLlxuICB3ZWV4QnVpbHRJbkNvbXBvbmVudHM6IFtcbiAgICAnZGl2JyxcbiAgICAnY29udGFpbmVyJyxcbiAgICAndGV4dCcsXG4gICAgJ2ltYWdlJyxcbiAgICAnZ2lmJyxcbiAgICAnaW1nJyxcbiAgICAnY2VsbCcsXG4gICAgJ2EnXG4gIF0sXG4gIGJpbmRpbmdTdHlsZU5hbWVzRm9yUHgyUmVtOiBhbGxTdHlsZXNcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgdGhyb3R0bGUsIGV4dGVuZCB9IGZyb20gJy4vZnVuYydcbmltcG9ydCB7IGRpc3BhdGNoTmF0aXZlRXZlbnQgfSBmcm9tICcuL2V2ZW50J1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuLi9jb25maWcnXG5cbi8qKlxuICogd2hldGhlciBjdCBjb250YWlucyBlbC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWlucyAoY29udGFpbmVyLCB0YXJnZXQsIGluY2x1ZGVTZWxmKSB7XG4gIGlmIChpbmNsdWRlU2VsZiAmJiBjb250YWluZXIgPT09IHRhcmdldCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lci5jb250YWluc1xuICAgID8gY29udGFpbmVyLmNvbnRhaW5zKHRhcmdldCkgJiYgKGNvbnRhaW5lciAhPT0gdGFyZ2V0KVxuICAgIDogY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRhcmdldCkgJiAxNiAhPT0gMFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zaWRlQSAoZWwpIHtcbiAgaWYgKHR5cGVvZiBlbC5faW5zaWRlQSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVsLl9pbnNpZGVBXG4gIH1cbiAgbGV0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnRcbiAgY29uc3QgcGFyZW50cyA9IFtdXG4gIGNvbnN0IGNoZWNrUGFyZW50cyA9IGZ1bmN0aW9uIChpbnNpZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBwYXJlbnRzW2ldLl9pbnNpZGVBID0gaW5zaWRlXG4gICAgfVxuICB9XG4gIGNvbnN0IGNoZWNrID0gZnVuY3Rpb24gKGluc2lkZSkge1xuICAgIGVsLl9pbnNpZGVBID0gaW5zaWRlXG4gICAgY2hlY2tQYXJlbnRzKGluc2lkZSlcbiAgICByZXR1cm4gaW5zaWRlXG4gIH1cbiAgd2hpbGUgKHBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgIGlmIChwYXJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYScpIHtcbiAgICAgIHJldHVybiBjaGVjayh0cnVlKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmVudC5faW5zaWRlQSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gY2hlY2socGFyZW50Ll9pbnNpZGVBKVxuICAgIH1cbiAgICBwYXJlbnRzLnB1c2gocGFyZW50KVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlKVxufVxuXG4vKipcbiAqIGdldCBwYXJlbnQgc2Nyb2xsZXIgdkNvbXBvbmVudC5cbiAqIHJldHVybiBhIFZ1ZUNvbXBvbmVudCBvciBudWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50U2Nyb2xsZXIgKHZtKSB7XG4gIGlmICghdm0pIHJldHVybiBudWxsXG4gIGlmICh2bS5fcGFyZW50U2Nyb2xsZXIpIHtcbiAgICByZXR1cm4gdm0uX3BhcmVudFNjcm9sbGVyXG4gIH1cbiAgZnVuY3Rpb24gX2dldFBhcmVudFNjcm9sbGVyIChwYXJlbnQpIHtcbiAgICBpZiAoIXBhcmVudCkgeyByZXR1cm4gfVxuICAgIGlmIChjb25maWcuc2Nyb2xsYWJsZVR5cGVzLmluZGV4T2YocGFyZW50LndlZXhUeXBlKSA+IC0xKSB7XG4gICAgICB2bS5fcGFyZW50U2Nyb2xsZXIgPSBwYXJlbnRcbiAgICAgIHJldHVybiBwYXJlbnRcbiAgICB9XG4gICAgcmV0dXJuIF9nZXRQYXJlbnRTY3JvbGxlcihwYXJlbnQuJHBhcmVudClcbiAgfVxuICByZXR1cm4gX2dldFBhcmVudFNjcm9sbGVyKHZtLiRwYXJlbnQpXG59XG5cbi8qKlxuICogZ2V0IHNjcm9sbGVyJ3MgZWxlbWVudC5cbiAqIEBwYXJhbSB2bSB7SFRNTEVsZW1lbnQgfCBWdWVDT21wb25lbnR9IHZtIG9yIGVsZW1lbnQuXG4gKiByZXR1cm4gdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFNjcm9sbGVyRWxlbWVudCAodm0pIHtcbiAgaWYgKCF2bSkgeyByZXR1cm4gbnVsbCB9XG4gIGNvbnN0IGVsID0gdm0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHZtIDogdm0uJGVsXG4gIGlmICghZWwgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsgcmV0dXJuIH1cbiAgaWYgKHZtLl9wYXJlbnRTY3JvbGxlcikge1xuICAgIHJldHVybiB2bS5fcGFyZW50U2Nyb2xsZXJcbiAgfVxuICBmdW5jdGlvbiBfZ2V0UGFyZW50U2Nyb2xsZXIgKHBhcmVudCkge1xuICAgIGlmICghcGFyZW50KSB7IHJldHVybiB9XG4gICAgY29uc3QgdGFnTmFtZSA9IHBhcmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICBpZiAodGFnTmFtZSA9PT0gJ2JvZHknXG4gICAgICB8fCAodGFnTmFtZSA9PT0gJ21haW4nXG4gICAgICAmJiBjb25maWcuc2Nyb2xsYWJsZVR5cGVzLmluZGV4T2YocGFyZW50LmdldEF0dHJpYnV0ZSgnd2VleC10eXBlJykpID4gLTEpXG4gICAgKSB7XG4gICAgICB2bS5fcGFyZW50U2Nyb2xsZXIgPSBwYXJlbnRcbiAgICAgIHJldHVybiBwYXJlbnRcbiAgICB9XG4gICAgcmV0dXJuIF9nZXRQYXJlbnRTY3JvbGxlcihwYXJlbnQucGFyZW50RWxlbWVudClcbiAgfVxuICByZXR1cm4gX2dldFBhcmVudFNjcm9sbGVyKGVsKVxufVxuXG5mdW5jdGlvbiBob3Jpem9udGFsQmFsYW5jZSAocmVjdCwgY3RSZWN0KSB7XG4gIHJldHVybiByZWN0LmxlZnQgPCBjdFJlY3QucmlnaHQgJiYgcmVjdC5yaWdodCA+IGN0UmVjdC5sZWZ0XG59XG5cbmZ1bmN0aW9uIHZlcnRpY2FsQmFsYW5jZSAocmVjdCwgY3RSZWN0KSB7XG4gIHJldHVybiByZWN0LnRvcCA8IGN0UmVjdC5ib3R0b20gJiYgcmVjdC5ib3R0b20gPiBjdFJlY3QudG9wXG59XG5cbi8qKlxuICogcmV0dXJuIGEgZGF0YSBhcnJheSB3aXRoIHR3byBib29sZWFuIHZhbHVlLCB3aGljaCBhcmU6XG4gKiAxLiB2aXNpYmxlIGluIGN1cnJlbnQgY3QncyB2aWV3cG9ydC5cbiAqIDIuIHZpc2libGUgd2l0aCBvZmZzZXQgaW4gY3VycmVudCBjdCdzIHZpZXdwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW50ZXJzZWN0aW9uIChyZWN0LCBjdFJlY3QsIGRpciwgb2Zmc2V0KSB7XG4gIGRpciA9IGRpciB8fCAndXAnXG4gIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGRpciA9PT0gJ2xlZnQnIHx8IGRpciA9PT0gJ3JpZ2h0J1xuICBjb25zdCBpc1ZlcnRpY2FsID0gZGlyID09PSAndXAnIHx8IGRpciA9PT0gJ2Rvd24nXG4gIGlmIChpc0hvcml6b250YWwgJiYgIXZlcnRpY2FsQmFsYW5jZShyZWN0LCBjdFJlY3QpKSB7XG4gICAgcmV0dXJuIFtmYWxzZSwgZmFsc2VdXG4gIH1cbiAgaWYgKGlzVmVydGljYWwgJiYgIWhvcml6b250YWxCYWxhbmNlKHJlY3QsIGN0UmVjdCkpIHtcbiAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZV1cbiAgfVxuICBvZmZzZXQgPSBvZmZzZXQgPyBwYXJzZUludChvZmZzZXQpICogd2VleC5jb25maWcuZW52LnNjYWxlIDogMFxuICBzd2l0Y2ggKGRpcikge1xuICAgIGNhc2UgJ3VwJzpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHJlY3QudG9wIDwgY3RSZWN0LmJvdHRvbSAmJiByZWN0LmJvdHRvbSA+IGN0UmVjdC50b3AsXG4gICAgICAgIHJlY3QudG9wIDwgY3RSZWN0LmJvdHRvbSArIG9mZnNldCAmJiByZWN0LmJvdHRvbSA+IGN0UmVjdC50b3AgLSBvZmZzZXRcbiAgICAgIF1cbiAgICBjYXNlICdkb3duJzpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHJlY3QuYm90dG9tID4gY3RSZWN0LnRvcCAmJiByZWN0LnRvcCA8IGN0UmVjdC5ib3R0b20sXG4gICAgICAgIHJlY3QuYm90dG9tID4gY3RSZWN0LnRvcCAtIG9mZnNldCAmJiByZWN0LnRvcCA8IGN0UmVjdC5ib3R0b20gKyBvZmZzZXRcbiAgICAgIF1cbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHJlY3QubGVmdCA8IGN0UmVjdC5yaWdodCAmJiByZWN0LnJpZ2h0ID4gY3RSZWN0LmxlZnQsXG4gICAgICAgIHJlY3QubGVmdCA8IGN0UmVjdC5yaWdodCArIG9mZnNldCAmJiByZWN0LnJpZ2h0ID4gY3RSZWN0LmxlZnQgLSBvZmZzZXRcbiAgICAgIF1cbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gW1xuICAgICAgICByZWN0LnJpZ2h0ID4gY3RSZWN0LmxlZnQgJiYgcmVjdC5sZWZ0IDwgY3RSZWN0LnJpZ2h0LFxuICAgICAgICByZWN0LnJpZ2h0ID4gY3RSZWN0LmxlZnQgLSBvZmZzZXQgJiYgcmVjdC5sZWZ0IDwgY3RSZWN0LnJpZ2h0ICsgb2Zmc2V0XG4gICAgICBdXG4gIH1cbn1cblxuLyoqXG4gKiBpc0VsZW1lbnRWaXNpYmxlXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGVsICAgIGEgZG9tIGVsZW1lbnQuXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGNvbnRhaW5lciAgb3B0aW9uYWwsIHRoZSBjb250YWluZXIgb2YgdGhpcyBlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudFZpc2libGUgKGVsLCBjb250YWluZXIsIGRpciwgb2Zmc2V0KSB7XG4gIGlmICghZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7IHJldHVybiBmYWxzZSB9XG4gIGNvbnN0IGJvZHlSZWN0ID0ge1xuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGJvdHRvbTogd2luZG93LmlubmVySGVpZ2h0LFxuICAgIHJpZ2h0OiB3aW5kb3cuaW5uZXJXaWR0aFxuICB9XG4gIGNvbnN0IGN0UmVjdCA9IChjb250YWluZXIgPT09IHdpbmRvdyB8fCBjb250YWluZXIgPT09IGRvY3VtZW50LmJvZHkpXG4gICAgPyBib2R5UmVjdCA6IGNvbnRhaW5lclxuICAgICAgPyBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBib2R5UmVjdFxuICByZXR1cm4gaGFzSW50ZXJzZWN0aW9uKGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBjdFJlY3QsIGRpciwgb2Zmc2V0KVxufVxuXG4vLyB0byB0cmlnZ2VyIHRoZSBhcHBlYXIvZGlzYXBwZWFyIGV2ZW50LlxuZnVuY3Rpb24gdHJpZ2dlckFwcGVhckV2ZW50IChlbG0sIGV2dCwgZGlyKSB7XG4gIGRpc3BhdGNoTmF0aXZlRXZlbnQoZWxtLCBldnQsIHtcbiAgICBkaXJlY3Rpb246IGRpclxuICB9KVxufVxuXG4vKipcbiAqIGdldCBhbGwgZXZlbnQgbGlzdGVuZXJzLiBpbmNsdWRpbmcgYm91bmQgaGFuZGxlcnMgaW4gYWxsIHBhcmVudCB2bm9kZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJzIChjb250ZXh0KSB7XG4gIGxldCB2bm9kZSA9IGNvbnRleHQuJHZub2RlXG4gIGNvbnN0IGhhbmRsZXJzID0ge31cbiAgY29uc3QgYXR0YWNoZWRWbm9kZXMgPSBbXVxuICB3aGlsZSAodm5vZGUpIHtcbiAgICBhdHRhY2hlZFZub2Rlcy5wdXNoKHZub2RlKVxuICAgIHZub2RlID0gdm5vZGUucGFyZW50XG4gIH1cbiAgYXR0YWNoZWRWbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAodm5vZGUpIHtcbiAgICBjb25zdCBwYXJlbnRMaXN0ZW5lcnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMubGlzdGVuZXJzXG4gICAgY29uc3QgZGF0YU9uID0gdm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLm9uXG4gICAgZXh0ZW5kKGhhbmRsZXJzLCBwYXJlbnRMaXN0ZW5lcnMsIGRhdGFPbilcbiAgfSlcbiAgcmV0dXJuIGhhbmRsZXJzXG59XG5cbmZ1bmN0aW9uIGdldEFwcGVhck9mZnNldCAoZWwpIHtcbiAgcmV0dXJuIGVsICYmIGVsLmdldEF0dHJpYnV0ZSgnYXBwZWFyLW9mZnNldCcpXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdhdGNoQXBwZWFyTGlzdCAoY29udGFpbmVyKSB7XG4gIGNvbnRhaW5lci5fd2F0Y2hBcHBlYXJMaXN0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoXG4gICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3ZWV4LWFwcGVhcl0nKSlcbn1cblxuLyoqXG4gKiBpbmplY3QgcmVtb3ZlQ2hpbGQgZnVuY3Rpb24gdG8gd2F0Y2ggZGlzYXBwZWFyIGFuZCBvZmZzZXREaXNhcHBlYXIgZXZlbnRzLlxuICovXG5pZiAoIXdpbmRvdy5fcm1JbmplY3RlZCkge1xuICB3aW5kb3cuX3JtSW5qZWN0ZWQgPSB0cnVlXG4gIGNvbnN0IG5hdGl2ZVJlbW92ZSA9IEhUTUxFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZFxuICBIVE1MRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICBlbC5fdmlzaWJsZSAmJiB0cmlnZ2VyQXBwZWFyRXZlbnQoZWwsICdkaXNhcHBlYXInLCBudWxsKVxuICAgIGVsLl9vZmZzZXRWaXNpYmxlICYmIHRyaWdnZXJBcHBlYXJFdmVudChlbCwgJ29mZnNldERpc2FwcGVhcicsIG51bGwpXG4gICAgbmF0aXZlUmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoIGVsZW1lbnQncyB2aXNpYmlsaXR5IHRvIHRlbGwgd2hldGhlciBzaG91bGQgdHJpZ2dlciBhIGFwcGVhci9kaXNhcHBlYXJcbiAqIGV2ZW50IGluIHNjcm9sbCBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2hBcHBlYXIgKGNvbnRleHQsIGZpcmVOb3cpIHtcbiAgY29uc3QgZWwgPSBjb250ZXh0ICYmIGNvbnRleHQuJGVsXG4gIGlmICghZWwgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsgcmV0dXJuIH1cblxuICBsZXQgaXNXaW5kb3cgPSBmYWxzZVxuICBjb25zdCBjb250YWluZXIgPSBnZXRQYXJlbnRTY3JvbGxlckVsZW1lbnQoY29udGV4dClcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoY29udGFpbmVyID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgaXNXaW5kb3cgPSB0cnVlXG4gIH1cbiAgLyoqXG4gICAqIENvZGUgYmVsb3cgd2lsbCBvbmx5IGV4ZWMgb25jZSBmb3IgYmluZGluZyBzY3JvbGwgaGFuZGxlciBmb3IgcGFyZW50IGNvbnRhaW5lci5cbiAgICovXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gY29udGFpbmVyLl9zY3JvbGxIYW5kbGVyXG4gIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgIHNjcm9sbEhhbmRsZXIgPSBjb250YWluZXIuX3Njcm9sbEhhbmRsZXIgPSBldmVudCA9PiB7XG4gICAgICB1cGRhdGVXYXRjaEFwcGVhckxpc3QoY29udGFpbmVyKVxuICAgICAgLyoqXG4gICAgICAgKiBkZXRlY3Qgc2Nyb2xsaW5nIGRpcmVjdGlvbi5cbiAgICAgICAqIGRpcmVjdGlvbiBvbmx5IHN1cHBvcnQgdXAgJiBkb3duIHlldC5cbiAgICAgICAqIFRPRE86IGRpcmVjdGlvbiBzdXBwb3J0IGxlZnQgJiByaWdodC5cbiAgICAgICAqL1xuICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gaXNXaW5kb3cgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiBjb250YWluZXIuc2Nyb2xsVG9wXG4gICAgICBjb25zdCBwcmVUb3AgPSBjb250YWluZXIuX2xhc3RTY3JvbGxUb3BcbiAgICAgIGNvbnRhaW5lci5fbGFzdFNjcm9sbFRvcCA9IHNjcm9sbFRvcFxuICAgICAgY29uc3QgZGlyID0gKHNjcm9sbFRvcCA8IHByZVRvcFxuICAgICAgICA/ICdkb3duJyA6IHNjcm9sbFRvcCA+IHByZVRvcFxuICAgICAgICAgID8gJ3VwJyA6IGNvbnRhaW5lci5fcHJldkRpcmVjdGlvbikgfHwgbnVsbFxuICAgICAgY29udGFpbmVyLl9wcmV2RGlyZWN0aW9uID0gZGlyXG4gICAgICBjb25zdCB3YXRjaEFwcGVhckxpc3QgPSBjb250YWluZXIuX3dhdGNoQXBwZWFyTGlzdCB8fCBbXVxuICAgICAgY29uc3QgbGVuID0gd2F0Y2hBcHBlYXJMaXN0Lmxlbmd0aFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBlbCA9IHdhdGNoQXBwZWFyTGlzdFtpXVxuICAgICAgICBjb25zdCBhcHBlYXJPZmZzZXQgPSBnZXRBcHBlYXJPZmZzZXQoZWwpXG4gICAgICAgIGNvbnN0IHZpc2libGVEYXRhID0gaXNFbGVtZW50VmlzaWJsZShlbCwgY29udGFpbmVyLCBkaXIsIGFwcGVhck9mZnNldClcbiAgICAgICAgZGV0ZWN0QXBwZWFyKGVsLCB2aXNpYmxlRGF0YSwgZGlyKVxuICAgICAgfVxuICAgIH1cbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGUoc2Nyb2xsSGFuZGxlciwgMTAwLCB0cnVlKSlcbiAgfVxuICBpZiAoZmlyZU5vdykge1xuICAgIGNvbnRleHQuJG5leHRUaWNrKHNjcm9sbEhhbmRsZXIpXG4gIH1cbn1cblxuLyoqXG4gKiBkZWNpZGUgd2hldGhlciB0byB0cmlnZ2VyIGEgYXBwZWFyL2Rpc2FwcGVhciBldmVudC5cbiAqIEBwYXJhbSB7VnVlQ29tcG9uZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZpc2libGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEFwcGVhciAoZWwsIHZpc2libGVEYXRhLCBkaXIgPSBudWxsLCBhcHBlYXJPZmZzZXQpIHtcbiAgaWYgKCFlbCkgeyByZXR1cm4gfVxuICBjb25zdCBbdmlzaWJsZSwgb2Zmc2V0VmlzaWJsZV0gPSB2aXNpYmxlRGF0YVxuICAvKipcbiAgICogTm8gbWF0dGVyIGl0J3MgYmluZGluZyBhcHBlYXIvZGlzYXBwZWFyIG9yIGJvdGggb2YgdGhlbS4gQWx3YXlzXG4gICAqIHNob3VsZCB0ZXN0IGl0J3MgdmlzaWJpbGl0eSBhbmQgY2hhbmdlIHRoZSBlbC5fdmlzaWJsZS5cbiAgICogSWYgbmVpZ2hlciBoYXMgYmVlbiBib3VuZCwgdGhlbiBpZ25vcmUgaXQuXG4gICAqL1xuICAvKipcbiAgICogaWYgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYXBwZWFyZWQgZm9yIG9uY2UgeWV0LCB0aGVuIGl0IHNob3VsZG4ndCB0cmlnZ2VyXG4gICAqIGEgZGlzYXBwZWFyIGV2ZW50IGF0IGFsbC5cbiAgICovXG4gIGlmIChlbC5fYXBwZWFyZWRPbmNlIHx8IHZpc2libGUpIHtcbiAgICBpZiAoZWwuX3Zpc2libGUgIT09IHZpc2libGUpIHtcbiAgICAgIGVsLl92aXNpYmxlID0gdmlzaWJsZVxuICAgICAgaWYgKHZpc2libGUgJiYgIWVsLl9hcHBlYXJlZE9uY2UpIHtcbiAgICAgICAgZWwuX2FwcGVhcmVkT25jZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2dE5hbWUgPSB2aXNpYmxlID8gJ2FwcGVhcicgOiAnZGlzYXBwZWFyJ1xuICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZShgZGF0YS1ldnQtJHtldnROYW1lfWApID09PSAnJykge1xuICAgICAgICB0cmlnZ2VyQXBwZWFyRXZlbnQoZWwsIGV2dE5hbWUsIGRpcilcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGVsLl9vZmZzZXRBcHBlYXJlZE9uY2UgfHwgb2Zmc2V0VmlzaWJsZSkge1xuICAgIGlmIChlbC5fb2Zmc2V0VmlzaWJsZSAhPT0gb2Zmc2V0VmlzaWJsZSkge1xuICAgICAgZWwuX29mZnNldFZpc2libGUgPSBvZmZzZXRWaXNpYmxlXG4gICAgICBpZiAob2Zmc2V0VmlzaWJsZSAmJiAhZWwuX29mZnNldEFwcGVhcmVkT25jZSkge1xuICAgICAgICBlbC5fb2Zmc2V0QXBwZWFyZWRPbmNlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgY29uc3QgZXZ0ID0gb2Zmc2V0VmlzaWJsZSA/IFsnb2Zmc2V0LWFwcGVhcicsICdvZmZzZXRBcHBlYXInXSA6IFsnb2Zmc2V0LWRpc2FwcGVhcicsICdvZmZzZXREaXNhcHBlYXInXVxuICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZShgZGF0YS1ldnQtJHtldnRbMF19YCkgPT09ICcnKSB7XG4gICAgICAgIHRyaWdnZXJBcHBlYXJFdmVudChlbCwgZXZ0WzFdLCBkaXIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNFbGVtZW50VmlzaWJsZSB9IGZyb20gJy4vY29tcG9uZW50J1xuaW1wb3J0IHsgZGlzcGF0Y2hOYXRpdmVFdmVudCB9IGZyb20gJy4vZXZlbnQnXG5pbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJy4vZnVuYydcblxuY29uc3QgbGF6eWxvYWRBdHRyID0gJ2RhdGEtaW1nLXNyYydcbmNvbnN0IHBsYWNlaG9sZGVyQXR0ciA9ICdwbGFjZWhvbGRlcidcblxuZnVuY3Rpb24gcHJlTG9hZEltZyAoc3JjLFxuICBsb2FkQ2FsbGJhY2ssXG4gIGVycm9yQ2FsbGJhY2spIHtcbiAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcbiAgaW1nLm9ubG9hZCA9IGxvYWRDYWxsYmFjayA/IGxvYWRDYWxsYmFjay5iaW5kKGltZykgOiBudWxsXG4gIGltZy5vbmVycm9yID0gZXJyb3JDYWxsYmFjayA/IGVycm9yQ2FsbGJhY2suYmluZChpbWcpIDogbnVsbFxuICBpbWcuc3JjID0gc3JjXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNyYyAoaXRlbSwgc3JjLCBwbGFjZWhvbGRlclNyYykge1xuICBpZiAoIXNyYykgeyByZXR1cm4gfVxuICBmdW5jdGlvbiBmaW5hbGxDYiAoKSB7XG4gICAgZGVsZXRlIGl0ZW0uX3NyY19sb2FkaW5nXG4gIH1cblxuICBpZiAod2luZG93Ll9wcm9jZXNzSW1nU3JjKSB7XG4gICAgc3JjID0gd2luZG93Ll9wcm9jZXNzSW1nU3JjKHNyYywgaXRlbSlcbiAgICBpZiAocGxhY2Vob2xkZXJTcmMpIHtcbiAgICAgIHBsYWNlaG9sZGVyU3JjID0gd2luZG93Ll9wcm9jZXNzSW1nU3JjKHBsYWNlaG9sZGVyU3JjLCBpdGVtKVxuICAgIH1cbiAgfVxuXG4gIGlmIChpdGVtLl9zcmNfbG9hZGluZyA9PT0gc3JjKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKipcbiAgICogMS4gYXBwbHkgc3JjIGltbWVkaWF0ZWx5IGluIGNhc2UgamF2c2NyaXB0IGJsb2NrcyB0aGUgaW1hZ2UgbG9hZGluZ1xuICAgKiAgYmVmb3JlIG5leHQgdGljay5cbiAgICovXG4gIGl0ZW0uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke3NyYyB8fCAnJ30pYFxuICBpdGVtLnJlbW92ZUF0dHJpYnV0ZShsYXp5bG9hZEF0dHIpXG4gIC8qKlxuICAgKiAyLiB0aGVuIGxvYWQgdGhlIGltZyBzcmMgd2l0aCBJbWFnZSBjb25zdHJ1Y3RvciAoYnV0IHdvdWxkIG5vdCBwb3N0XG4gICAqICBhIHJlcXVlc3QgYWdhaW4pLCBqdXN0IHRvIHRyaWdnZXIgdGhlIGxvYWQgZXZlbnQuXG4gICAqL1xuICBpdGVtLl9zcmNfbG9hZGluZyA9IHNyY1xuICBwcmVMb2FkSW1nKHNyYywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke3NyYyB8fCAnJ30pYFxuICAgIGNvbnN0IHsgd2lkdGg6IG5hdHVyYWxXaWR0aCwgaGVpZ2h0OiBuYXR1cmFsSGVpZ2h0IH0gPSB0aGlzXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHNpemU6IHsgbmF0dXJhbFdpZHRoLCBuYXR1cmFsSGVpZ2h0IH1cbiAgICB9XG4gICAgZGlzcGF0Y2hOYXRpdmVFdmVudChpdGVtLCAnbG9hZCcsIHBhcmFtcylcbiAgICBmaW5hbGxDYigpXG4gIH0sIGZ1bmN0aW9uIChldnQpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIHNpemU6IHsgbmF0dXJhbFdpZHRoOiAwLCBuYXR1cmFsSGVpZ2h0OiAwIH1cbiAgICB9XG4gICAgZGlzcGF0Y2hOYXRpdmVFdmVudChpdGVtLCAnbG9hZCcsIHBhcmFtcylcbiAgICBpZiAocGxhY2Vob2xkZXJTcmMpIHtcbiAgICAgIHByZUxvYWRJbWcocGxhY2Vob2xkZXJTcmMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKCR7cGxhY2Vob2xkZXJTcmMgfHwgJyd9KWBcbiAgICAgIH0pXG4gICAgfVxuICAgIGZpbmFsbENiKClcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0Q3RTY3JvbGxlciAoZWwpIHtcbiAgaWYgKCFlbCkgeyByZXR1cm4gfVxuICBsZXQgc2Nyb2xsZXIgPSBlbC5fcHRTY3JvbGxlclxuICBpZiAoIXNjcm9sbGVyKSB7XG4gICAgbGV0IHB0ID0gZWwucGFyZW50RWxlbWVudFxuICAgIHdoaWxlIChwdCAmJiBwdCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgaWYgKChwdC5jbGFzc05hbWUgKyAnJyB8fCAnJykubWF0Y2goL3dlZXgtbGlzdHx3ZWV4LXNjcm9sbGVyfHdlZXgtd2F0ZXJmYWxsLykpIHtcbiAgICAgICAgc2Nyb2xsZXIgPSBwdFxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgcHQgPSBwdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHNjcm9sbGVyID0gcHRcbiAgICBlbC5fcHRTY3JvbGxlciA9IHB0XG4gIH1cbiAgcmV0dXJuIHNjcm9sbGVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJlTGF6eWxvYWQgKGVsLCBpZ25vcmVWaXNpYmlsaXR5KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGVsKSkge1xuICAgIHJldHVybiBlbC5mb3JFYWNoKGN0ID0+IGZpcmVMYXp5bG9hZChjdCkpXG4gIH1cbiAgZWwgPSBlbCB8fCBkb2N1bWVudC5ib2R5XG4gIGlmICghZWwpIHsgcmV0dXJuIH1cbiAgbGV0IGltZ3MgPSAoZWwgfHwgZG9jdW1lbnQuYm9keSkucXVlcnlTZWxlY3RvckFsbChgWyR7bGF6eWxvYWRBdHRyfV1gKVxuICBpZiAoZWwuZ2V0QXR0cmlidXRlKGxhenlsb2FkQXR0cikpIHsgaW1ncyA9IFtlbF0gfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGltZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbWcgPSBpbWdzW2ldXG4gICAgaWYgKHR5cGVvZiBpZ25vcmVWaXNpYmlsaXR5ID09PSAnYm9vbGVhbicgJiYgaWdub3JlVmlzaWJpbGl0eSkge1xuICAgICAgYXBwbHlTcmMoaW1nLCBpbWcuZ2V0QXR0cmlidXRlKGxhenlsb2FkQXR0ciksIGltZy5nZXRBdHRyaWJ1dGUocGxhY2Vob2xkZXJBdHRyKSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNFbGVtZW50VmlzaWJsZShpbWcsIGdldEN0U2Nyb2xsZXIoZWwpKVswXSkge1xuICAgICAgYXBwbHlTcmMoaW1nLCBpbWcuZ2V0QXR0cmlidXRlKGxhenlsb2FkQXR0ciksIGltZy5nZXRBdHRyaWJ1dGUocGxhY2Vob2xkZXJBdHRyKSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBjYWNoZSBhIHRocm90dGxlIGxhenlsb2FkIGZ1bmN0aW9uIGZvciBldmVyeSBjb250YWluZXIgZWxlbWVudFxuICogb25jZSBmb3IgZGlmZmVyZW50IHdhaXQgdGltZXMgc2VwYXJhdGUuXG4gKiAgIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhpcyBjYWNoZTpcbiAqICAgICAgY2FjaGU6IHtcbiAqICAgICAgICBlbC5pZDoge1xuICogICAgICAgICAgd2FpdDogdGhyb3R0bGVkRnVuY3Rpb24gKCkgeyAuLi4gfVxuICogICAgICAgIH1cbiAqICAgICAgfVxuICovXG5jb25zdCBjYWNoZSA9IHt9XG5sZXQgX3VpZCA9IDFcbmV4cG9ydCBmdW5jdGlvbiBnZXRUaHJvdHRsZUxhenlsb2FkICh3YWl0ID0gMTYsIGVsID0gZG9jdW1lbnQuYm9keSkge1xuICBsZXQgaWQgPSArKGVsICYmIGVsLmRhdGFzZXQudGhyb3R0bGVJZClcbiAgaWYgKGlzTmFOKGlkKSB8fCBpZCA8PSAwKSB7XG4gICAgaWQgPSBfdWlkKytcbiAgICBlbCAmJiBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhyb3R0bGUtaWQnLCBpZCArICcnKVxuICB9XG5cbiAgIWNhY2hlW2lkXSAmJiAoY2FjaGVbaWRdID0ge30pXG4gIGNvbnN0IHRocm90dGxlZCA9IGNhY2hlW2lkXVt3YWl0XSB8fFxuICAgIChjYWNoZVtpZF1bd2FpdF0gPSB0aHJvdHRsZShcbiAgICAgIGZpcmVMYXp5bG9hZC5iaW5kKHRoaXMsIGVsKSxcbiAgICAgIHBhcnNlRmxvYXQod2FpdCksXG4gICAgICAvLyB0cnVlIGZvciBjYWxsTGFzdFRpbWUuXG4gICAgICAvLyB0byB0cmlnZ2VyIG9uY2UgbW9yZSB0aW1lIGFmdGVyIHRoZSBsYXN0IHRocm90dGxlZCBmdW5jdGlvbiBjYWxsZWQgd2l0aCBhIGxpdHRsZSBtb3JlIGRlbGF5LlxuICAgICAgdHJ1ZSlcbiAgICApXG4gIHJldHVybiB0aHJvdHRsZWRcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJy4uL2NvbmZpZydcbmltcG9ydCB7IGNhbWVsaXplIH0gZnJvbSAnLi9mdW5jJ1xuY29uc3QgeyBiaW5kaW5nU3R5bGVOYW1lc0ZvclB4MlJlbSB9ID0gY29uZmlnXG5cbi8vIHdoZXRoZXIgdG8gc3VwcG9ydCB1c2luZyAwLjVweCB0byBwYWludCAxcHggd2lkdGggYm9yZGVyLlxubGV0IF9zdXBwb3J0SGFpcmxpbmVzXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydEhhaXJsaW5lcyAoKSB7XG4gIGlmICh0eXBlb2YgX3N1cHBvcnRIYWlybGluZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW9cbiAgICBpZiAoZHByICYmIGRwciA+PSAyICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29uc3QgZG9jRWxtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICBjb25zdCB0ZXN0RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGNvbnN0IGZha2VCb2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9keScpXG4gICAgICBjb25zdCBiZWZvcmVOb2RlID0gZG9jRWxtLmZpcnN0RWxlbWVudENoaWxkIHx8IGRvY0VsbS5maXJzdENoaWxkXG4gICAgICB0ZXN0RWxtLnN0eWxlLmJvcmRlciA9ICcwLjVweCBzb2xpZCB0cmFuc3BhcmVudCdcbiAgICAgIGZha2VCb2R5LmFwcGVuZENoaWxkKHRlc3RFbG0pXG4gICAgICBkb2NFbG0uaW5zZXJ0QmVmb3JlKGZha2VCb2R5LCBiZWZvcmVOb2RlKVxuICAgICAgX3N1cHBvcnRIYWlybGluZXMgPSB0ZXN0RWxtLm9mZnNldEhlaWdodCA9PT0gMVxuICAgICAgZG9jRWxtLnJlbW92ZUNoaWxkKGZha2VCb2R5KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIF9zdXBwb3J0SGFpcmxpbmVzID0gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9zdXBwb3J0SGFpcmxpbmVzXG59XG5cbmxldCBzdXBwb3J0ID0gbnVsbFxuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydFN0aWNreSAoKSB7XG4gIGlmIChzdXBwb3J0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRcbiAgfVxuICBjb25zdCBlbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGNvbnN0IGVsZW1lbnRTdHlsZSA9IGVsZW1lbnQuc3R5bGVcbiAgZWxlbWVudFN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246LXdlYmtpdC1zdGlja3k7cG9zaXRpb246c3RpY2t5OydcbiAgc3VwcG9ydCA9IGVsZW1lbnRTdHlsZS5wb3NpdGlvbi5pbmRleE9mKCdzdGlja3knKSAhPT0gLTFcbiAgcmV0dXJuIHN1cHBvcnRcbn1cblxuLyoqXG4gKiBnZXQgdHJhbnNmb3JtT2JqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2Zvcm1PYmogKGVsbSkge1xuICBsZXQgc3R5bGVPYmogPSB7fVxuICBpZiAoIWVsbSkgeyByZXR1cm4gc3R5bGVPYmogfVxuICBjb25zdCB0cmFuc2Zvcm1TdHIgPSBlbG0uc3R5bGUud2Via2l0VHJhbnNmb3JtXG4gICAgfHwgZWxtLnN0eWxlLm1velRyYW5zZm9ybVxuICAgIHx8IGVsbS5zdHlsZS50cmFuc2Zvcm1cbiAgaWYgKHRyYW5zZm9ybVN0ciAmJiB0cmFuc2Zvcm1TdHIubWF0Y2goLyg/OiAqKD86dHJhbnNsYXRlfHJvdGF0ZXxzY2FsZSlbXihdKlxcKFteKF0rXFwpKSsvaSkpIHtcbiAgICBzdHlsZU9iaiA9IHRyYW5zZm9ybVN0ci50cmltKCkucmVwbGFjZSgvLCArL2csICcsJykuc3BsaXQoJyAnKS5yZWR1Y2UoZnVuY3Rpb24gKHByZSwgc3RyKSB7XG4gICAgICBbJ3RyYW5zbGF0ZScsICdzY2FsZScsICdyb3RhdGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmIChuZXcgUmVnRXhwKG5hbWUsICdpJykudGVzdChzdHIpKSB7XG4gICAgICAgICAgcHJlW25hbWVdID0gc3RyXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm4gcHJlXG4gICAgfSwge30pXG4gIH1cbiAgcmV0dXJuIHN0eWxlT2JqXG59XG5cbi8qKlxuICogdHJhbnNsYXRlIGEgdHJhbnNmb3JtIHN0cmluZyBmcm9tIGEgdHJhbnNmb3JtT2JqLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNmb3JtU3RyIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKGZ1bmN0aW9uIChwcmUsIGtleSkge1xuICAgIHJldHVybiBwcmUgKyBvYmpba2V5XSArICcgJ1xuICB9LCAnJylcbn1cblxuLyoqXG4gKiBhZGQgdHJhbnNmb3JtIHN0eWxlIHRvIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbG1cbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZTogdHJhbnNmb3JtIG9iamVjdCwgZm9ybWF0IGlzIGxpa2UgdGhpczpcbiAqICAge1xuICogICAgIHRyYW5zbGF0ZTogJ3RyYW5zbGF0ZTNkKDJweCwgMnB4LCAycHgpJyxcbiAqICAgICBzY2FsZTogJ3NjYWxlKDAuMiknLFxuICogICAgIHJvdGF0ZTogJ3JvdGF0ZSgzMGRlZyknXG4gKiAgIH1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVwbGFjZTogd2hldGhlciB0byByZXBsYWNlIGFsbCB0cmFuc2Zvcm0gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFRyYW5zZm9ybSAoZWxtLCBzdHlsZSwgcmVwbGFjZSkge1xuICBpZiAoIXN0eWxlKSB7IHJldHVybiB9XG4gIGxldCBzdHlsZU9iaiA9IHt9XG4gIGlmICghcmVwbGFjZSkge1xuICAgIHN0eWxlT2JqID0gZ2V0VHJhbnNmb3JtT2JqKGVsbSlcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBzdHlsZSkge1xuICAgIGNvbnN0IHZhbCA9IHN0eWxlW2tleV1cbiAgICBpZiAodmFsKSB7XG4gICAgICBzdHlsZU9ialtrZXldID0gdmFsXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc1N0ciA9IGdldFRyYW5zZm9ybVN0cihzdHlsZU9iailcbiAgZWxtLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHJlc1N0clxuICBlbG0uc3R5bGUubW96VHJhbnNmb3JtID0gcmVzU3RyXG4gIGVsbS5zdHlsZS50cmFuc2Zvcm0gPSByZXNTdHJcbn1cblxuLyoqXG4gKiBjb3B5IGEgdHJhbnNmb3JtIGJlaGF2aW91ciBmcm9tIG9uZSBlbGVtZW50IHRvIGFub3RoZXIuXG4gKiBrZXkgY291bGQgYmU6ICd0cmFuc2xhdGUnIHwgJ3NjYWxlJyB8ICdyb3RhdGUnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VHJhbnNmb3JtIChmcm9tLCB0bywga2V5KSB7XG4gIGxldCBzdHJcbiAgaWYgKCFrZXkpIHtcbiAgICBzdHIgPSBmcm9tLnN0eWxlLndlYmtpdFRyYW5zZm9ybVxuICAgICAgfHwgZnJvbS5zdHlsZS5tb3pUcmFuc2Zvcm1cbiAgICAgIHx8IGZyb20uc3R5bGUudHJhbnNmb3JtXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgZnJvbU9iaiA9IGdldFRyYW5zZm9ybU9iaihmcm9tKVxuICAgIGlmICghZnJvbU9ialtrZXldKSB7IHJldHVybiB9XG4gICAgY29uc3QgdG9PYmogPSBnZXRUcmFuc2Zvcm1PYmoodG8pXG4gICAgdG9PYmpba2V5XSA9IGZyb21PYmpba2V5XVxuICAgIHN0ciA9IGdldFRyYW5zZm9ybVN0cih0b09iailcbiAgfVxuICB0by5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHJcbiAgdG8uc3R5bGUubW96VHJhbnNmb3JtID0gc3RyXG4gIHRvLnN0eWxlLnRyYW5zZm9ybSA9IHN0clxufVxuXG4vKipcbiAqIGdldCBjb2xvcidzIHIsIGcsIGIgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3Igc3VwcG9ydCBhbGwga2luZHMgb2YgdmFsdWUgb2YgY29sb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZ2IgKGNvbG9yKSB7XG4gIGNvbnN0IGhheFJlZyA9IC8jKFtcXGRhLWZBLUZdezJ9KShbXFxkYS1mQS1GXXsyfSkoW1xcZGEtZkEtRl17Mn0pL1xuICBjb25zdCByZ2JSZWcgPSAvcmdiXFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKVxcKS9cbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keVxuICBzcGFuLnN0eWxlLmNzc1RleHQgPSBgY29sb3I6ICR7Y29sb3J9OyB3aWR0aDogMHB4OyBoZWlnaHQ6IDBweDtgXG4gIGJvZHkgJiYgYm9keS5hcHBlbmRDaGlsZChzcGFuKVxuICBjb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNwYW4pLmNvbG9yICsgJydcbiAgYm9keSAmJiBib2R5LnJlbW92ZUNoaWxkKHNwYW4pXG5cbiAgbGV0IG1hdGNoXG4gIG1hdGNoID0gY29sb3IubWF0Y2goaGF4UmVnKVxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQobWF0Y2hbMV0sIDE2KSxcbiAgICAgIGc6IHBhcnNlSW50KG1hdGNoWzJdLCAxNiksXG4gICAgICBiOiBwYXJzZUludChtYXRjaFszXSwgMTYpXG4gICAgfVxuICB9XG4gIG1hdGNoID0gY29sb3IubWF0Y2gocmdiUmVnKVxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQobWF0Y2hbMV0pLFxuICAgICAgZzogcGFyc2VJbnQobWF0Y2hbMl0pLFxuICAgICAgYjogcGFyc2VJbnQobWF0Y2hbM10pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogZ2V0IHN0eWxlIHNoZWV0IHdpdGggb3duZXIgbm9kZSdzIGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgb3duZXIgbm9kZSBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlU2hlZXRCeUlkIChpZCkge1xuICBpZiAoIWlkKSB7IHJldHVybiB9XG4gIGNvbnN0IHN0eWxlU2hlZXRzID0gZG9jdW1lbnQuc3R5bGVTaGVldHNcbiAgY29uc3QgbGVuID0gc3R5bGVTaGVldHMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBzdHlsZVNoZWV0ID0gc3R5bGVTaGVldHNbaV1cbiAgICBpZiAoc3R5bGVTaGVldC5vd25lck5vZGUuaWQgPT09IGlkKSB7XG4gICAgICByZXR1cm4gc3R5bGVTaGVldFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDaGlsZHJlblRvdGFsV2lkdGggKGNoaWxkcmVuKSB7XG4gIGNvbnN0IGxlbiA9IGNoaWxkcmVuLmxlbmd0aFxuICBsZXQgdG90YWwgPSAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB0b3RhbCArPSBjaGlsZHJlbltpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICB9XG4gIHJldHVybiB0b3RhbFxufVxuLyoqXG4gKiBnZXQgdG90YWwgY29udGVudCB3aWR0aCBvZiB0aGUgZWxlbWVudC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZ2VXaWR0aCAoZWxtKSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gZWxtLmNoaWxkcmVuXG4gIGlmICghY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gIH1cbiAgaWYgKCFSYW5nZSkge1xuICAgIHJldHVybiBnZXRDaGlsZHJlblRvdGFsV2lkdGgoY2hpbGRyZW4pXG4gIH1cbiAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gIGlmICghcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKSB7XG4gICAgcmV0dXJuIGdldENoaWxkcmVuVG90YWxXaWR0aChjaGlsZHJlbilcbiAgfVxuICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxtKVxuICByZXR1cm4gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbn1cblxuLyoqXG4gKiBweDJyZW0gYW5kIGNhbWVsaXplIGtleXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZU9iamVjdDJyZW0gKHN0eWxlLCByb290VmFsdWUpIHtcbiAgY29uc3Qgb2JqID0ge31cbiAgZm9yIChjb25zdCBrIGluIHN0eWxlKSB7XG4gICAgY29uc3QgY2FtSyA9IGNhbWVsaXplKGspXG4gICAgaWYgKGJpbmRpbmdTdHlsZU5hbWVzRm9yUHgyUmVtLmluZGV4T2YoY2FtSykgPiAtMSkge1xuICAgICAgb2JqW2NhbUtdID0gcHgycmVtKHN0eWxlW2tdICsgJycsIHJvb3RWYWx1ZSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBvYmpbY2FtS10gPSBzdHlsZVtrXVxuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBweDJyZW0gKHB4LCByb290VmFsdWUpIHtcbiAgcmV0dXJuIHB4LnJlcGxhY2UoLyhbKy1dP1xcZCsoPzouXFxkKik/KShbcHx3XXgpL2csIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgaWYgKCQyID09PSAnd3gnKSB7IC8vICd3eCcgLT4gcHhcbiAgICAgIHJldHVybiAkMSArICdweCdcbiAgICB9XG4gICAgZWxzZSB7ICAvLyAncHgnIC0+IHJlbVxuICAgICAgY29uc3QgcHhWYWwgPSBwYXJzZUZsb2F0KCQxKVxuICAgICAgY29uc3Qgc2lnbiA9IHB4VmFsID4gMFxuICAgICAgICA/IDEgOiBweFZhbCA8IDAgP1xuICAgICAgICAgIC0xIDogMFxuICAgICAgaWYgKE1hdGguYWJzKHB4VmFsKSA8PSAxKSB7XG4gICAgICAgIHJldHVybiBzdXBwb3J0SGFpcmxpbmVzKClcbiAgICAgICAgICA/IGAke3NpZ24gKiAwLjV9cHhgXG4gICAgICAgICAgOiBgJHtzaWduICogMX1weGBcbiAgICAgIH1cbiAgICAgIHJldHVybiBweFZhbFxuICAgICAgICAvIChyb290VmFsdWUgfHwgd2luZG93LndlZXguY29uZmlnLmVudi5yZW0pXG4gICAgICAgICsgJ3JlbSdcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW0ycHggKHJlbSwgcm9vdFZhbHVlKSB7XG4gIHJldHVybiByZW0ucmVwbGFjZSgvKFsrLV0/XFxkKyg/Oi5cXGQqKT8pcmVtL2csIGZ1bmN0aW9uICgkMCwgJDEpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCgkMSlcbiAgICAgICogKHJvb3RWYWx1ZSB8fCB3aW5kb3cud2VleC5jb25maWcuZW52LnJlbSlcbiAgICAgICsgJ3B4J1xuICB9KVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2Z1bmMnXG5leHBvcnQgKiBmcm9tICcuL2V2ZW50J1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnQnXG5leHBvcnQgKiBmcm9tICcuL2xhenlsb2FkJ1xuZXhwb3J0ICogZnJvbSAnLi9zdHlsZSdcbmV4cG9ydCAqIGZyb20gJy4vdHlwZSdcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICcuLi9saWIvZW52ZCdcblxuaW1wb3J0IHsgaW5pdCBhcyBpbml0Vmlld3BvcnQgfSBmcm9tICcuL3ZpZXdwb3J0J1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbHMnXG5cbi8qKlxuICogZ2V0IFdYRW52aXJvbm1lbnQgaW5mby5cbiAqIEBwYXJhbSAge29iamVjdH0gdmlld3BvcnRJbmZvOiBpbmZvIGFib3V0IHZpZXdwb3J0LlxuICogQHBhcmFtICB7b2JqZWN0fSBlbnZJbmZvOiBpbmZvIHBhcnNlZCBmcm9tIGxpYi5lbnYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RW52ICh2aWV3cG9ydEluZm8sIGVudkluZm8pIHtcbiAgY29uc3QgYnJvd3Nlck5hbWUgPSBlbnZJbmZvLmJyb3dzZXIgPyBlbnZJbmZvLmJyb3dzZXIubmFtZSA6IG5hdmlnYXRvci5hcHBOYW1lXG4gIGNvbnN0IGJyb3dzZXJWZXJzaW9uID0gZW52SW5mby5icm93c2VyID8gZW52SW5mby5icm93c2VyLnZlcnNpb24udmFsIDogbnVsbFxuICBsZXQgb3NOYW1lID0gZW52SW5mby5vcy5uYW1lXG4gIGlmIChvc05hbWUubWF0Y2goLyhpUGhvbmV8aVBhZHxpUG9kKS9pKSkge1xuICAgIG9zTmFtZSA9ICdpT1MnXG4gIH1cbiAgZWxzZSBpZiAob3NOYW1lLm1hdGNoKC9BbmRyb2lkL2kpKSB7XG4gICAgb3NOYW1lID0gJ2FuZHJvaWQnXG4gIH1cbiAgY29uc3Qgb3NWZXJzaW9uID0gZW52SW5mby5vcy52ZXJzaW9uLnZhbFxuICBjb25zdCBlbnYgPSB7XG4gICAgcGxhdGZvcm06ICdXZWInLFxuICAgIHdlZXhWZXJzaW9uOiAncHJvY2Vzcy5lbnYuV0VFWF9WRVJTSU9OJyxcbiAgICBsYXlvdXREaXJlY3Rpb246ICdsdHInLFxuICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICBhcHBOYW1lOiBicm93c2VyTmFtZSxcbiAgICBhcHBWZXJzaW9uOiBicm93c2VyVmVyc2lvbixcbiAgICBvc05hbWUsXG4gICAgb3NWZXJzaW9uLFxuICAgIGRldmljZU1vZGVsOiBlbnZJbmZvLm9zLm5hbWUgfHwgbnVsbFxuICB9XG4gIC8qKlxuICAgKiB2aWV3cG9ydEluZm86IHNjYWxlLCBkZXZpY2VXaWR0aCwgZGV2aWNlSGVpZ2h0LiBkcHJcbiAgICovXG4gIHJldHVybiBleHRlbmQodmlld3BvcnRJbmZvLCBlbnYpXG59XG5cbi8vIGNvbnN0IHZpZXdwb3J0SW5mbyA9IGluaXRWaWV3cG9ydCgpXG5cbi8vIDc1MCBieSBkZWZhdWx0IGN1cnJlbnRseVxuLy8gY29uc3Qgc2NhbGUgPSB2aWV3cG9ydEluZm8uc2NhbGVcblxuLy8gY29uc3QgdW5pdHMgPSB7XG4vLyAgIFJFTTogMTIgKiBzY2FsZSxcbi8vICAgVlc6IHZpZXdwb3J0SW5mby5kZXZpY2VXaWR0aCAvIDEwMCxcbi8vICAgVkg6IHZpZXdwb3J0SW5mby5kZXZpY2VIZWlnaHQgLyAxMDAsXG4vLyAgIFZNSU46IE1hdGgubWluKHZpZXdwb3J0SW5mby5kZXZpY2VXaWR0aCwgdmlld3BvcnRJbmZvLmRldmljZUhlaWdodCkgLyAxMDAsXG4vLyAgIFZNQVg6IE1hdGgubWF4KHZpZXdwb3J0SW5mby5kZXZpY2VXaWR0aCwgdmlld3BvcnRJbmZvLmRldmljZUhlaWdodCkgLyAxMDAsXG4vLyAgIENNOiA5NiAvIDIuNTQgKiBzY2FsZSxcbi8vICAgTU06IDk2IC8gMjUuNCAqIHNjYWxlLFxuLy8gICBROiA5NiAvIDI1LjQgLyA0ICogc2NhbGUsXG4vLyAgIElOOiA5NiAqIHNjYWxlLFxuLy8gICBQVDogOTYgLyA3MiAqIHNjYWxlLFxuLy8gICBQQzogOTYgLyA2ICogc2NhbGUsXG4vLyAgIFBYOiBzY2FsZVxuLy8gfVxuXG4vLyBPYmplY3QuZnJlZXplKHVuaXRzKVxuLy8gT2JqZWN0LmZyZWV6ZShlbnYpXG5cbi8vIHdpbmRvdy5DU1NfVU5JVCA9IHVuaXRzXG53aW5kb3cuV1hFbnZpcm9ubWVudCA9IGluaXRFbnYoaW5pdFZpZXdwb3J0KCksIHdpbmRvdy5saWIuZW52KVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgVnVlICovXG5cbmltcG9ydCAnLi93eC1lbnYnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi91dGlscydcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuXG5jb25zdCB3ZWV4TW9kdWxlcyA9IHt9XG5jb25zdCBfcm9vdHMgPSBbXVxuXG5jb25zdCB3ZWV4ID0ge1xuICBfX3Z1ZV9fOiBudWxsLFxuICB1dGlscyxcbiAgLy8gdW5pdHM6IHdpbmRvdy5DU1NfVU5JVCxcbiAgY29uZmlnOiB7XG4gICAgZW52OiB3aW5kb3cuV1hFbnZpcm9ubWVudCxcbiAgICBidW5kbGVVcmw6IGxvY2F0aW9uLmhyZWZcbiAgfSxcblxuICBfY29tcG9uZW50czoge30sXG4gIF9tb2R1bGVzOiB3ZWV4TW9kdWxlcyxcblxuICBfbWV0YToge1xuICAgIG1vdW50ZWQ6IHt9LFxuICAgIHVwZGF0ZWQ6IHt9LFxuICAgIGRlc3Ryb3llZDoge30sXG4gICAgcmVxdWlyZWRNb2R1bGVzOiB7fSxcbiAgICBhcGlDYWxsZWQ6IHt9LFxuICAgIHBlcmY6IHt9XG4gIH0sXG5cbiAgZG9jdW1lbnQ6IHtcbiAgICBib2R5OiB7fVxuICB9LFxuXG4gIHJlcXVpcmVNb2R1bGUgKG1vZHVsZU5hbWUpIHtcbiAgICBjb25zdCBtZXRhTW9kID0gd2VleC5fbWV0YS5yZXF1aXJlZE1vZHVsZXNcbiAgICBpZiAoIW1ldGFNb2RbbW9kdWxlTmFtZV0pIHtcbiAgICAgIG1ldGFNb2RbbW9kdWxlTmFtZV0gPSAwXG4gICAgfVxuICAgIG1ldGFNb2RbbW9kdWxlTmFtZV0rK1xuICAgIHJldHVybiB3ZWV4TW9kdWxlc1ttb2R1bGVOYW1lXVxuICB9LFxuXG4gIHJlZ2lzdGVyTW9kdWxlICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJBcGlNb2R1bGUoLi4uYXJncylcbiAgfSxcblxuICBzdXBwb3J0IChmZWF0dXJlID0gJycpIHtcbiAgICBjb25zdCBtYXRjaCA9IChmZWF0dXJlICsgJycpLm1hdGNoKC9AKGNvbXBvbmVudHxtb2R1bGUpXFwvKFxcdyspKC5cXHcrKT8vKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgdHlwZSA9IG1hdGNoWzFdXG4gICAgICBjb25zdCBtb2QgPSBtYXRjaFsyXVxuICAgICAgbGV0IG1ldGhvZCA9IG1hdGNoWzNdXG4gICAgICBtZXRob2QgPSBtZXRob2QgJiYgbWV0aG9kLnJlcGxhY2UoL15cXC4vLCAnJylcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdjb21wb25lbnQnOlxuICAgICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fY29tcG9uZW50c1ttb2RdICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgfHwgY29uZmlnLndlZXhCdWlsdEluQ29tcG9uZW50cy5pbmRleE9mKG1vZCkgPj0gMFxuICAgICAgICBjYXNlICdtb2R1bGUnOlxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHdlZXhNb2R1bGVzW21vZF1cbiAgICAgICAgICByZXR1cm4gbW9kdWxlICYmIG1ldGhvZCA/ICEhbW9kdWxlW21ldGhvZF0gOiAhIW1vZHVsZVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3Z1ZS1yZW5kZXJdIGludmFsaWQgYXJndW1lbnQgZm9yIHdlZXguc3VwcG9ydDogJHtmZWF0dXJlfWApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfSxcblxuICBzdXBwb3J0cyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcG9ydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH0sXG5cbiAgaXNSZWdpc3RlcmVkTW9kdWxlIChtb2R1bGVOYW1lLCBtZXRob2ROYW1lKSB7XG4gICAgY29uc3QgZmVhdHVyZSA9IG1ldGhvZE5hbWUgPyBgJHttb2R1bGVOYW1lfS4ke21ldGhvZE5hbWV9YCA6IG1vZHVsZU5hbWVcbiAgICByZXR1cm4gdGhpcy5zdXBwb3J0KCdAbW9kdWxlLycgKyBmZWF0dXJlKVxuICB9LFxuXG4gIGlzUmVnaXN0ZXJlZENvbXBvbmVudCAoY29tcG9uZW50TmFtZSkge1xuICAgIHJldHVybiB0aGlzLnN1cHBvcnQoJ0Bjb21wb25lbnQvJyArIGNvbXBvbmVudE5hbWUpXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbmV3IHZ1ZSBpbnN0YW5jZSBpbiB0aGlzIHdlZXggaW5zdGFuY2UuIFB1dCBpdHMgcm9vdCBlbGVtZW50IGludG8gd2VleC5kb2N1bWVudC5ib2R5LmNoaWxkcmVuLCBzb1xuICAgKiB0aGF0IHVzZXIgY2FuIHVzZSB3ZWV4LmRvY3VtZW50LmJvZHkgdG8gd2FsayB0aHJvdWdoIGFsbCBkb20gc3RydWN0dXJlcyBpbiBhbGwgdnVlIGluc3RhbmNlcyBpbiB0aGUgcGFnZS5cbiAgICovXG4gIHJlZ2lzdGVyVnVlSW5zdGFuY2UgKGluc3RhbmNlKSB7XG4gICAgaWYgKCFpbnN0YW5jZSBpbnN0YW5jZW9mIFZ1ZSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFt2dWUtcmVuZGVyXSByZWdpc3RlclZ1ZUluc3RhbmNlOiBpbnZhbGlkIGluc3RhbmNlLCBub3QgYSB2dWUgaW5zdGFuY2UuYClcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCByb290ID0gaW5zdGFuY2UuJHJvb3RcbiAgICBpZiAoIXJvb3QgfHwgIXJvb3QuJGVsKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW3Z1ZS1yZW5kZXJdIHJlZ2lzdGVyVnVlSW5zdGFuY2U6IGluc3RhbmNlIGhhcyBubyByb290LmApXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5kb2N1bWVudC5ib2R5LmNoaWxkcmVuLnB1c2gocm9vdC4kZWwpXG4gIH0sXG5cbiAgLy8gQGRlcHJlY2F0ZWRcbiAgcmVxdWlyZSAoLi4uYXJncykge1xuICAgIGNvbnNvbGUubG9nKGBbVnVlIFJlbmRlcl0gXCJ3ZWV4LnJlcXVpcmVcIiBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFwid2VleC5yZXF1aXJlTW9kdWxlXCIgaW5zdGVhZC5gKVxuICAgIHJldHVybiB0aGlzLnJlcXVpcmVNb2R1bGUoLi4uYXJncylcbiAgfSxcblxuICAvLyBAZGVwcmVjYXRlZFxuICAvLyBUT0RPOiByZW5hbWUgdG8gcmVnaXN0ZXJNb2R1bGVcbiAgcmVnaXN0ZXJBcGlNb2R1bGUgKG5hbWUsIG1vZHVsZSwgbWV0YSkge1xuICAgIGlmICghd2VleE1vZHVsZXNbbmFtZV0pIHtcbiAgICAgIHdlZXhNb2R1bGVzW25hbWVdID0ge31cbiAgICB9XG4gICAgaWYgKCEhbWV0YSAmJiBtZXRhLnJlZ2lzdGVyVHlwZSA9PT0gJ2Fzc2lnbm1lbnQnKSB7XG4gICAgICB3ZWV4TW9kdWxlc1tuYW1lXSA9IG1vZHVsZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vZHVsZSkge1xuICAgICAgICBpZiAobW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB3ZWV4TW9kdWxlc1tuYW1lXVtrZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGVkID0gd2VleC5fbWV0YS5hcGlDYWxsZWRcbiAgICAgICAgICAgIGlmICghY2FsbGVkW25hbWVdKSB7XG4gICAgICAgICAgICAgIGNhbGxlZFtuYW1lXSA9IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjYWxsZWRNb2QgPSBjYWxsZWRbbmFtZV1cbiAgICAgICAgICAgIGlmICghY2FsbGVkTW9kW2tleV0pIHtcbiAgICAgICAgICAgICAgY2FsbGVkTW9kW2tleV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsZWRNb2Rba2V5XSsrXG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlW2tleV0uYXBwbHkod2VleCwgYXJndW1lbnRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZWdpc3RlckNvbXBvbmVudCAobmFtZSwgY29tcG9uZW50KSB7XG4gICAgaWYgKCF0aGlzLl9fdnVlX18pIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygnW1Z1ZSBSZW5kZXJdIFZ1ZSBpcyBub3QgZm91bmQuIFBsZWFzZSBpbXBvcnQgVnVlLmpzIGJlZm9yZSByZWdpc3RlciBhIGNvbXBvbmVudC4nKVxuICAgIH1cbiAgICB0aGlzLl9jb21wb25lbnRzW25hbWVdID0gMFxuICAgIGlmIChjb21wb25lbnQuX2Nzcykge1xuICAgICAgY29uc3QgY3NzID0gY29tcG9uZW50Ll9jc3MucmVwbGFjZSgvXFxiWystXT9bXFxkLl0rcmVtOz9cXGIvZywgZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobSkgKiA3NSAqIHdlZXguY29uZmlnLmVudi5zY2FsZSArICdweCdcbiAgICAgIH0pXG4gICAgICB1dGlscy5hcHBlbmRDc3MoY3NzLCBgd2VleC1jbXAtJHtuYW1lfWApXG4gICAgICBkZWxldGUgY29tcG9uZW50Ll9jc3NcbiAgICB9XG4gICAgdGhpcy5fX3Z1ZV9fLmNvbXBvbmVudChuYW1lLCBjb21wb25lbnQpXG4gIH0sXG5cbiAgLy8gQGRlcHJlY2F0ZWRcbiAgZ2V0Um9vdCAoKSB7fSxcblxuICAvLyBAZGVwcmVjYXRlZFxuICBzZW5kZXI6IHtcbiAgICBwZXJmb3JtQ2FsbGJhY2sgKGNhbGxiYWNrLCBkYXRhLCBrZWVwQWxpdmUpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfSxcblxuICAvLyBAZGVwcmVjYXRlZFxuICBpbnN0YWxsIChtb2R1bGUpIHtcbiAgICBtb2R1bGUuaW5pdCh0aGlzKVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3ZWV4LmRvY3VtZW50LmJvZHksICdjaGlsZHJlbicsIHtcbiAgZ2V0ICgpIHsgcmV0dXJuIF9yb290cyB9XG59KVxuXG47IFsnb24nLCAnb25jZScsICdvZmYnLCAnZW1pdCddLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICB3ZWV4W21ldGhvZF0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fdnVlKSB7XG4gICAgICB0aGlzLl92dWUgPSBuZXcgdGhpcy5fX3Z1ZV9fKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Z1ZVtgJCR7bWV0aG9kfWBdKC4uLmFyZ3MpXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IHdlZXhcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtcbiAgLy8gY2FtZWxpemVLZXlzLFxuICAvLyBoeXBoZW5hdGVLZXlzLFxuICBleHRlbmQsXG4gIGV4dGVuZFRydXRoeVxuICAvLyB0cmltQ29tbWVudCxcbiAgLy8gbm9ybWFsaXplU3R5bGUsXG4gIC8vIGF1dG9QcmVmaXgsXG4gIC8vIGlzQXJyYXksXG4gIC8vIGdldFBhcmVudFNjcm9sbGVyLFxuICAvLyBzdXBwb3J0U3RpY2t5LFxuICAvLyBhcHBlbmRDc3Ncbn0gZnJvbSAnLi4vdXRpbHMnXG5cbmZ1bmN0aW9uIGdldElubGluZVN0eWxlICh2bm9kZSkge1xuICBjb25zdCBkYXRhID0gdm5vZGUuZGF0YSB8fCB7fVxuICByZXR1cm4gZXh0ZW5kVHJ1dGh5KHt9LCBkYXRhLnN0YXRpY1N0eWxlLCBkYXRhLnN0eWxlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbXBvbmVudFN0eWxlIChjb250ZXh0KSB7XG4gIHJldHVybiBnZXRDb21wb25lbnRJbmxpbmVTdHlsZShjb250ZXh0KVxuICAvLyByZXR1cm4gZ2V0Q29tcG9uZW50U3R5bGUoY29udGV4dCwgdHJ1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudElubGluZVN0eWxlIChjb250ZXh0KSB7XG4gIGxldCB2bm9kZSA9IGNvbnRleHQgJiYgY29udGV4dC4kdm5vZGVcbiAgaWYgKCF2bm9kZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1t2dWUtcmVuZGVyXSBnZXRDb21wb25lbnRTdHlsZSBmYWlsZWQ6IG5vICR2bm9kZSBpbiBjb250ZXh0LicpXG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9XG4gIGNvbnN0IHN0eWxlID0ge31cbiAgd2hpbGUgKHZub2RlKSB7XG4gICAgZXh0ZW5kKHN0eWxlLCBnZXRJbmxpbmVTdHlsZSh2bm9kZSkpXG4gICAgdm5vZGUgPSB2bm9kZS5wYXJlbnRcbiAgfVxuICByZXR1cm4gc3R5bGVcbn1cblxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIHRyYW5zZm9ybSAoc3R5bGUpIHtcbiAgICBjb25zdCBsaW5lcyA9IHN0eWxlLmxpbmVzXG4gICAgaWYgKGxpbmVzID4gMCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3R5bGUsIHtcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcycsXG4gICAgICAgIFdlYmtpdExpbmVDbGFtcDogbGluZXNcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBzdHlsZVxuICB9XG59XG4iLCJjb25zdCB0YWdNYXAgPSB7XG4gIHRleHQ6IHJlcXVpcmUoJy4vdGV4dCcpXG59XG5cbmV4cG9ydHMuZ2V0VHJhbnNmb3JtZXIgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHJldHVybiB0YWdNYXBbdGFnXVxufVxuIiwiY29uc3QgeyBnZXRDb21waWxlciB9ID0gcmVxdWlyZSgnLi9jb21waWxlcicpXG5jb25zdCB7IGdldFRyYW5zZm9ybWVyIH0gPSByZXF1aXJlKCcuL3RyYW5zZm9ybWVyJylcblxuZXhwb3J0cy5nZXRDb21waWxlciA9IGdldENvbXBpbGVyXG5leHBvcnRzLmdldFRyYW5zZm9ybWVyID0gZ2V0VHJhbnNmb3JtZXJcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgZ2V0VHJhbnNmb3JtZXIgfSBmcm9tICd3eHYtdHJhbnNmb3JtZXInXG5pbXBvcnQge1xuICBpc0FycmF5LFxuICBpc0RlZixcbiAgaXNQcmltaXRpdmUsXG4gIGRpc3BhdGNoTmF0aXZlRXZlbnRcbn0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJy4uL2NvbmZpZydcblxuY29uc3Qge1xuICB3ZWV4QnVpbHRJbkNvbXBvbmVudHNcbn0gPSBjb25maWdcblxuY29uc3QgYXBwZWFyRXZlbnRzTWFwID0ge1xuICBhcHBlYXI6ICdhcHBlYXInLFxuICBkaXNhcHBlYXI6ICdkaXNhcHBlYXInLFxuICBvZmZzZXRBcHBlYXI6ICdvZmZzZXQtYXBwZWFyJyxcbiAgb2Zmc2V0RGlzYXBwZWFyOiAnb2Zmc2V0LWRpc2FwcGVhcidcbn1cblxuLyoqXG4gKiByZW1vdmUgdGV4dCBub2RlcyBpbiB0aGUgbm9kZXMgYXJyYXkuXG4gKiBAcGFyYW0gIHtBcnJheX0gbm9kZXNcbiAqIEByZXR1cm4ge0FycmF5fSBub2RlcyB3aXRob3V0IHRleHQgbm9kZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltVGV4dFZOb2RlcyAodm5vZGVzKSB7XG4gIGlmIChpc0FycmF5KHZub2RlcykpIHtcbiAgICByZXR1cm4gdm5vZGVzLmZpbHRlcih2bm9kZSA9PiAhIXZub2RlLnRhZylcbiAgfVxuICByZXR1cm4gdm5vZGVzXG59XG5cbi8qKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIG1ldGhvZCB0byB0cmFuc2Zvcm0gYXJncyBwYXNzZWQgdG8gY3JlYXRlRWxlbWVudFxuICogZm9yIHJlbmRlciBmdW5jdGlvbi5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gc2hvdWxkIHNoYXJlIHdpdGggcHJlY29tcGlsZXIuXG5jb25zdCBtZXRhTWFwID0ge1xuICBmaWd1cmU6IFsnaW1nJywgJ2ltYWdlJywgJ2dpZicsICdmaWd1cmUnXSxcbiAgcDogWyd0ZXh0JywgJ3AnXSxcbiAgZGl2OiBbJ2NvbnRhaW5lcicsICdkaXYnXSxcbiAgc2VjdGlvbjogWydjZWxsJywgJ2NlbGwtc2xvdCddLFxuICAncmVjeWNsZS1saXN0JzogWydyZWN5Y2xlLWxpc3QnXVxufVxuXG5jb25zdCBjaGVja01hcCA9IE9iamVjdC5rZXlzKG1ldGFNYXApLnJlZHVjZShmdW5jdGlvbiAocHJlLCB0YXJnZXRUYWcpIHtcbiAgY29uc3QgdGFnQXJyID0gbWV0YU1hcFt0YXJnZXRUYWddXG4gIHRhZ0Fyci5mb3JFYWNoKGZ1bmN0aW9uIChmcm9tVGFnKSB7XG4gICAgcHJlW2Zyb21UYWddID0gdGFyZ2V0VGFnXG4gIH0pXG4gIHJldHVybiBwcmVcbn0sIHt9KVxuXG5jb25zdCBfc3RkVGFnTWFwID0ge1xuICBwOiAndGV4dCcsXG4gIGZpZ3VyZTogJ2ltYWdlJyxcbiAgc2VjdGlvbjogJ2NlbGwnXG59XG5mdW5jdGlvbiBnZXRTdGRUYWcgKHRhZykge1xuICBjb25zdCBzdGRUYWcgPSBfc3RkVGFnTWFwW3RhZ11cbiAgcmV0dXJuIHN0ZFRhZyB8fCB0YWdcbn1cblxuY29uc3QgcHJlY29tcGlsZWRDbGFzc01hcCA9IHtcbiAgZGl2OiB7XG4gICAgJ3dlZXgtY3QnOiB0cnVlLFxuICAgICd3ZWV4LWRpdic6IHRydWVcbiAgfSxcbiAgaW1hZ2U6IHtcbiAgICAnd2VleC1lbCc6IHRydWUsXG4gICAgJ3dlZXgtaW1hZ2UnOiB0cnVlXG4gIH0sXG4gIHRleHQ6IHtcbiAgICAnd2VleC1lbCc6IHRydWUsXG4gICAgJ3dlZXgtdGV4dCc6IHRydWVcbiAgfSxcbiAgY2VsbDoge1xuICAgICd3ZWV4LWN0JzogdHJ1ZSxcbiAgICAnd2VleC1jZWxsJzogdHJ1ZVxuICB9LFxuICBhOiB7XG4gICAgJ3dlZXgtY3QnOiB0cnVlLFxuICAgICd3ZWV4LWEnOiB0cnVlXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcmVjb21waWxlZCAodGFnKSB7XG4gIHJldHVybiBjb25maWcud2VleEJ1aWx0SW5Db21wb25lbnRzLmluZGV4T2YodGFnKSA+IC0xXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1SZW5kZXIgKGN0eCwgaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHRhZyxcbiAgICBkYXRhLFxuICAgIGNoaWxkcmVuLFxuICAgIG5vcm1hbGl6YXRpb25UeXBlLFxuICAgIGFsd2F5c05vcm1hbGl6ZVxuICApIHtcbiAgICBpZiAoaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlblxuICAgICAgY2hpbGRyZW4gPSBkYXRhXG4gICAgICBkYXRhID0ge31cbiAgICB9XG4gICAgaWYgKCFpc0RlZihkYXRhKSkge1xuICAgICAgZGF0YSA9IHt9XG4gICAgfVxuICAgIGlmIChpc0RlZihkYXRhLmlzKSkge1xuICAgICAgdGFnID0gZGF0YS5pc1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSB0cmFuc2Zvcm1EYXRhKHRoaXMsIGRhdGEsIHRhZylcbiAgICAgIHRhZyA9IHRyYW5zZm9ybVRhZyh0aGlzLCB0YWcpXG4gICAgfVxuICAgIGVsc2UgeyAgLy8gZGlyZWN0IGNvbXBvbmVudCBvcHRpb25zIC8gY29uc3RydWN0b3JcbiAgICAgIGRhdGEgPSB0cmFuc2Zvcm1EYXRhKHRoaXMsIGRhdGEsIHVuZGVmaW5lZClcbiAgICB9XG4gICAgcmV0dXJuIGguY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICB0YWcsXG4gICAgICBkYXRhLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBub3JtYWxpemF0aW9uVHlwZSxcbiAgICAgIGFsd2F5c05vcm1hbGl6ZVxuICAgIClcbiAgfS5iaW5kKGN0eClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVRhZyAoY3R4LCB0YWcpIHtcbiAgY29uc3QgZWxlbWVudFRhZyA9IGNoZWNrTWFwW3RhZ11cbiAgcmV0dXJuIGVsZW1lbnRUYWcgfHwgdGFnXG59XG5cbi8qKlxuICogVGVsbCB3aGV0aGVyIGEgZWxlbWVudCBpcyBjb250YWluZWQgaW4gYSBlbGVtZW50IHdobyBoYXNcbiAqIGEgYXR0cmlidXRlICdidWJibGUnPXRydWUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICovXG4vLyBmdW5jdGlvbiBpbkJ1YmJsZSAoZWwpIHtcbi8vICAgaWYgKHR5cGVvZiBlbC5faW5CdWJibGUgPT09ICdib29sZWFuJykge1xuLy8gICAgIHJldHVybiBlbC5faW5CdWJibGVcbi8vICAgfVxuLy8gICBjb25zdCBwYXJlbnRzID0gW11cbi8vICAgbGV0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnRcbi8vICAgbGV0IGluQnViYmxlXG4vLyAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4vLyAgICAgaWYgKHR5cGVvZiBwYXJlbnQuX2luQnViYmxlID09PSAnYm9vbGVhbicpIHtcbi8vICAgICAgIGluQnViYmxlID0gcGFyZW50Ll9pbkJ1YmJsZVxuLy8gICAgICAgYnJlYWtcbi8vICAgICB9XG4vLyAgICAgY29uc3QgYXR0ciA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoJ2J1YmJsZScpXG4vLyAgICAgaWYgKGF0dHIgIT09ICcnKSB7XG4vLyAgICAgICBpbkJ1YmJsZSA9IGF0dHIgPT09IHRydWUgfHwgYXR0ciA9PT0gJ3RydWUnXG4vLyAgICAgICBicmVha1xuLy8gICAgIH1cbi8vICAgICBwYXJlbnRzLnB1c2gocGFyZW50KVxuLy8gICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50XG4vLyAgIH1cbi8vICAgZWwuX2luQnViYmxlID0gaW5CdWJibGVcbi8vICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYXJlbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuLy8gICAgIHBhcmVudHNbaV0uX2luQnViYmxlID0gaW5CdWJibGVcbi8vICAgfVxuLy8gICByZXR1cm4gaW5CdWJibGVcbi8vIH1cblxuZnVuY3Rpb24gYmluZEV2ZW50cyAoY3R4LCBldnRzLCBhdHRycywgdGFnLCBhcHBlYXJBdHRhY2hlZCkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBldnRzKSB7XG4gICAgY29uc3QgYXBwZWFyRXZ0TmFtZSA9IGFwcGVhckV2ZW50c01hcFtrZXldXG4gICAgaWYgKGFwcGVhckV2dE5hbWUpIHtcbiAgICAgIGF0dHJzW2BkYXRhLWV2dC0ke2FwcGVhckV2dE5hbWV9YF0gPSAnJ1xuICAgICAgaWYgKCFhcHBlYXJBdHRhY2hlZC52YWx1ZSkge1xuICAgICAgICBhcHBlYXJBdHRhY2hlZC52YWx1ZSA9IHRydWVcbiAgICAgICAgYXR0cnNbJ3dlZXgtYXBwZWFyJ10gPSAnJ1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGF0dHJzW2BkYXRhLWV2dC0ke2tleX1gXSA9ICcnXG4gICAgICBpZiAoa2V5ICE9PSAnY2xpY2snKSB7XG4gICAgICAgIC8vIHNob3VsZCBzdG9wIHByb3BhZ2F0aW9uIGJ5IGRlZmF1bHQuXG4gICAgICAgIC8vIFRPRE86IHNob3VsZCB0ZXN0IGluQnViYmxlIGZpcnN0LlxuICAgICAgICBjb25zdCBoYW5kbGVyID0gZXZ0c1trZXldXG4gICAgICAgIGlmIChpc0FycmF5KGV2dHNba2V5XSkpIHtcbiAgICAgICAgICBoYW5kbGVyLnVuc2hpZnQoY3R4LiRzdG9wUHJvcGFnYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZXZ0c1trZXldID0gW2N0eC4kc3RvcFByb3BhZ2F0aW9uLCBoYW5kbGVyXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChldnRzLmNsaWNrKSB7XG4gICAgZXZ0cy53ZWV4JHRhcCA9IGV2dHMuY2xpY2tcbiAgICBldnRzLmNsaWNrID0gY3R4LiRzdG9wT3V0ZXJBXG4gIH1cbiAgaWYgKGV2dHMuc2Nyb2xsKSB7XG4gICAgZXZ0cy53ZWV4JHNjcm9sbCA9IGV2dHMuc2Nyb2xsXG4gICAgZGVsZXRlIGV2dHMuc2Nyb2xsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtT24gKGN0eCwgZGF0YSwgdGFnKSB7XG4gIGxldCB7IG9uLCBuYXRpdmVPbiB9ID0gZGF0YVxuICBpZiAod2VleEJ1aWx0SW5Db21wb25lbnRzLmluZGV4T2YodGFnKSA+IC0xKSB7XG4gICAgLyoqXG4gICAgICogZm9yIGRpdiwgaW1hZ2UsIHRleHQsIGNlbGwsIGEsIC4uLlxuICAgICAqIHVzZXIgc2hvdWxkIGJpbmQgYWxsIGV2ZW50cyB3aXRob3V0IC5uYXRpdmUuXG4gICAgICovXG4gICAgbmF0aXZlT24gPSBudWxsXG4gICAgZGVsZXRlIGRhdGEubmF0aXZlT25cbiAgfVxuICBpZiAoaXNEZWYod2VleC5fY29tcG9uZW50c1t0YWddKSkge1xuICAgIC8qKlxuICAgICAqIGZvciBzbGlkZXIsIGxpc3QsIC4uLlxuICAgICAqIHVzZXIgc2hvdWxkIGJpbmQgZXZlbnRzIHdpdGhvdXQgLm5hdGl2ZS5cbiAgICAgKiBpbiBvdXIgZXZlbnRzIGhhbmRsaW5nLCBhbGwgZXZlbnRzIHNob3VsZCB0cmFuc2ZlciB0b1xuICAgICAqIC5uYXRpdmUgYmluZGluZy5cbiAgICAgKi9cbiAgICBkZWxldGUgZGF0YS5uYXRpdmVPblxuICAgIG5hdGl2ZU9uID0gbnVsbFxuICAgIGlmIChvbikge1xuICAgICAgbmF0aXZlT24gPSBkYXRhLm5hdGl2ZU9uID0gb25cbiAgICB9XG4gICAgb24gPSBudWxsXG4gICAgZGVsZXRlIGRhdGEub25cbiAgfVxuXG4gIGxldCBhdHRycyA9IGRhdGEuYXR0cnNcbiAgaWYgKCFhdHRycykge1xuICAgIGF0dHJzID0gZGF0YS5hdHRycyA9IHt9XG4gIH1cblxuICBjb25zdCBhcHBlYXJBdHRhY2hlZCA9IHtcbiAgICB2YWx1ZTogZmFsc2VcbiAgfVxuICBpZiAob24pIHtcbiAgICBiaW5kRXZlbnRzKGN0eCwgb24sIGF0dHJzLCB0YWcsIGFwcGVhckF0dGFjaGVkKVxuICB9XG4gIGlmIChuYXRpdmVPbikge1xuICAgIGJpbmRFdmVudHMoY3R4LCBuYXRpdmVPbiwgYXR0cnMsIHRhZywgYXBwZWFyQXR0YWNoZWQpXG4gIH1cblxuICAvKipcbiAgICogYmluZGluZyBhIHdlZXgkdGFwIHRvIDxhPiBlbGVtZW50IHRvIHN0b3AgcHJvcGFnYXRpb24gaWYgdGhlcmVcbiAgICogaXMgbm8gYnViYmxlcz10cnVlIGZsYWcgc2hvd2luZyBvbiBwYXJlbnRzLlxuICAgKi9cbiAgaWYgKHRhZyA9PT0gJ2EnKSB7XG4gICAgaWYgKCFvbikge1xuICAgICAgb24gPSBkYXRhLm9uID0ge31cbiAgICB9XG4gICAgLy8gaWYgKCFjaGVja0J1YmJsZShlbCkpIHtcbiAgICBsZXQgZXZ0ID0gb25bJ3dlZXgkdGFwJ11cbiAgICBpZiAoIWV2dCkge1xuICAgICAgb25bJ3dlZXgkdGFwJ10gPSBjdHguJHN0b3BQcm9wYWdhdGlvblxuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV2dCkpIHtcbiAgICAgIGV2dC51bnNoaWZ0KGN0eC4kc3RvcFByb3BhZ2F0aW9uKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV2dCA9IFtjdHguJHN0b3BQcm9wYWdhdGlvbiwgZXZ0XVxuICAgIH1cbiAgICAvLyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtQ2xhc3MgKGRhdGEsIHRhZykge1xuICBsZXQgeyBjbGFzczogY2xhc3NEYXRhIH0gPSBkYXRhXG4gIGNvbnN0IHRhZ0NsYXNzT2JqID0gcHJlY29tcGlsZWRDbGFzc01hcFt0YWddXG4gIGlmICghY2xhc3NEYXRhKSB7XG4gICAgY2xhc3NEYXRhID0gZGF0YS5jbGFzcyA9IFtdXG4gIH1cbiAgaWYgKGNsYXNzRGF0YSAmJiBpc0FycmF5KGNsYXNzRGF0YSkpIHtcbiAgICBkYXRhLmNsYXNzID0gY2xhc3NEYXRhLmNvbmNhdChPYmplY3Qua2V5cyh0YWdDbGFzc09iaikpXG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIGNsYXNzRGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBPYmplY3QuYXNzaWduKGNsYXNzRGF0YSwgdGFnQ2xhc3NPYmopXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtU3R5bGUgKGN0eCwgZGF0YSwgdGFnKSB7XG4gIGNvbnN0IHsgc3R5bGUgfSA9IGRhdGFcbiAgaWYgKCFzdHlsZSkgeyByZXR1cm4gfVxuICBjb25zdCB0cmFuc2Zvcm1lciA9IGdldFRyYW5zZm9ybWVyKGdldFN0ZFRhZyh0YWcpKVxuICBpZiAodHJhbnNmb3JtZXIpIHtcbiAgICBkYXRhLnN0eWxlID0gY3R4Ll9weDJyZW0odHJhbnNmb3JtZXIudHJhbnNmb3JtKHN0eWxlKSwgNzUpXG4gIH1cbiAgZWxzZSB7XG4gICAgZGF0YS5zdHlsZSA9IGN0eC5fcHgycmVtKHN0eWxlLCA3NSlcbiAgfVxufVxuXG4vKipcbiAqIHRyYW5zZm9ybUF0dHJzOlxuICogIC0gYWRkIHdlZXgtdHlwZSBhdHRycyBmb3IgcHJlY29tcGlsZWRUYWdzLlxuICogIC0gaW1hZ2UucmVzaXplOiB0cmFuc2Zvcm0gdG8gZGlyZWN0aXZlIHdlZXgtcmVzaXplLlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1BdHRycyAoZGF0YSwgdGFnKSB7XG4gIGxldCB7IGF0dHJzLCBkaXJlY3RpdmVzIH0gPSBkYXRhXG4gIGlmICghYXR0cnMpIHtcbiAgICBhdHRycyA9IGRhdGEuYXR0cnMgPSB7fVxuICB9XG4gIGF0dHJzWyd3ZWV4LXR5cGUnXSA9IHRhZ1xuICBpZiAodGFnID09PSAnaW1hZ2UnIHx8IHRhZyA9PT0gJ2dpZicpIHtcbiAgICBjb25zdCB7IHNyYywgcmVzaXplIH0gPSBhdHRyc1xuICAgIGlmIChzcmMpIHtcbiAgICAgIGF0dHJzWydkYXRhLWltZy1zcmMnXSA9IHNyY1xuICAgIH1cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICBpZiAoIWRpcmVjdGl2ZXMpIHtcbiAgICAgICAgZGlyZWN0aXZlcyA9IGRhdGEuZGlyZWN0aXZlcyA9IFtdXG4gICAgICB9XG4gICAgICBkaXJlY3RpdmVzLnB1c2goe1xuICAgICAgICBuYW1lOiAnd2VleC1yZXNpemUnLFxuICAgICAgICB2YWx1ZTogYXR0cnMucmVzaXplXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtRGF0YSAoY3R4LCBkYXRhLCB0YWcpIHtcbiAgaWYgKGlzQXJyYXkoZGF0YSkpIHtcbiAgICAvLyBwYXJhbWV0ZXIgZGF0YSBpcyBvbW1pdGVkLlxuICAgIHJldHVybiBkYXRhXG4gIH1cbiAgY29uc3QgaXNQID0gaXNQcmVjb21waWxlZCh0YWcpXG4gIC8vIGNsYXNzXG4gIGlzUCAmJiB0cmFuc2Zvcm1DbGFzcyhkYXRhLCB0YWcpXG4gIC8vIHN0eWxlXG4gIHRyYW5zZm9ybVN0eWxlKGN0eCwgZGF0YSwgdGFnKVxuICAvLyBhdHRyc1xuICBpc1AgJiYgdHJhbnNmb3JtQXR0cnMoZGF0YSwgdGFnKVxuICAvLyBvblxuICB0cmFuc2Zvcm1PbihjdHgsIGRhdGEsIHRhZylcbiAgcmV0dXJuIGRhdGFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcE5hdGl2ZUV2ZW50cyAoY3R4LCBtYXApIHtcbiAgY29uc3QgZXZlbnRNYXAgPSB7fVxuICBmb3IgKGNvbnN0IG9yaWdFdmVudCBpbiBtYXApIHtcbiAgICBldmVudE1hcFtvcmlnRXZlbnRdID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgY29uc3QgZWwgPSBldnQudGFyZ2V0XG4gICAgICBkaXNwYXRjaE5hdGl2ZUV2ZW50KGVsLCBtYXBbb3JpZ0V2ZW50XSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV2ZW50TWFwXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vc3R5bGUnXG5leHBvcnQgKiBmcm9tICcuL25vZGUnXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIGdldFRocm90dGxlTGF6eWxvYWQsXG4gIHdhdGNoQXBwZWFyLFxuICBkZWJvdW5jZVxufSBmcm9tICcuLi91dGlscydcblxuaW1wb3J0IGNvbmZpZyBmcm9tICcuLi9jb25maWcnXG5jb25zdCBzY3JvbGxhYmxlVHlwZXMgPSBjb25maWcuc2Nyb2xsYWJsZVR5cGVzXG5cbmxldCBsYXp5bG9hZFdhdGNoZWQgPSBmYWxzZVxuZnVuY3Rpb24gd2F0Y2hMYXp5bG9hZCAoKSB7XG4gIGxhenlsb2FkV2F0Y2hlZCA9IHRydWVcbiAgOyBbXG4gICAgJ3Njcm9sbCcsXG4gICAgLy8gJ3RyYW5zaXRpb25lbmQnLFxuICAgIC8vICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAvLyAnYW5pbWF0aW9uZW5kJyxcbiAgICAvLyAnd2Via2l0QW5pbWF0aW9uRW5kJyxcbiAgICAncmVzaXplJ1xuICBdLmZvckVhY2goZXZ0ID0+IHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGdldFRocm90dGxlTGF6eWxvYWQoMjUsIGRvY3VtZW50LmJvZHkpKVxuICB9KVxuICAvKipcbiAgICogSW4gY2FzZSB0aGUgdXNlcnMgdXNlIHRoZSBib2R5J3Mgb3ZlcmZsb3cgdG8gc2Nyb2xsLiBUaGVuIHRoZSBzY3JvbGxcbiAgICogZXZlbnQgd291bGQgbm90IGJlIHRyaWdnZXJlZCBvbiB0aGUgd2luZG93IG9iamVjdCBidXQgb24gdGhlIGJvZHkuXG4gICAqL1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGdldFRocm90dGxlTGF6eWxvYWQoMjUsIGRvY3VtZW50LmJvZHkpKVxufVxuXG5sZXQgaWRDbnQgPSAwXG5sZXQgYXBwZWFyV2F0Y2hlZCA9IGZhbHNlXG5cbi8qKlxuICogZHVyaW5nIHVwZGF0aW5nLCB0aGUgYXBwZWFyIHdhdGNoZXIgYmluZGluZyBvbiB0aGUgYXBwZWFyV2F0Y2hlZCBjb250ZXh0XG4gKiBzaG91bGQgYmUgdHJpZ2dlcmVkIHdpdGhpbiBhIGRlYm91bmNlZCB3cmFwcGVyLlxuICogSWYgdGhlIHVwZGF0aW5nIGludGVydmFsIGlzIHNob3J0ZXIgdGhlbiA1MCBtcywgdGhlbiB0aGUgYXBwZWFyIGV2ZW50cyB3aWxsXG4gKiBpZ25vcmUgdGhlIGNoYW5nZSBpbiB0aGUgcHJldmlvdXMgNTAgbXMgZHVlIHRvIHRoZSBkZWJvdW5jZSB3cmFwcGVyLlxuICovXG5jb25zdCBkZWJvdW5jZWRXYXRjaEFwcGVhciA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgd2F0Y2hBcHBlYXIoYXBwZWFyV2F0Y2hlZCwgdHJ1ZSlcbn0sIDUwKVxuXG4vKipcbiAqIGlmIGl0J3MgYSBzY3JvbGxhYmxlIHRhZywgdGhlbiB3YXRjaCBhcHBlYXIgZXZlbnRzIGZvciBpdC5cbiAqL1xuZnVuY3Rpb24gd2F0Y2hBcHBlYXJGb3JTY3JvbGxhYmxlcyAodGFnTmFtZSwgY29udGV4dCkge1xuICAvLyB3aGVuIHRoaXMgaXMgYSBzY3JvbGxlci9saXN0L3dhdGVyZmFsbFxuICBpZiAoc2Nyb2xsYWJsZVR5cGVzLmluZGV4T2YodGFnTmFtZSkgPiAtMSkge1xuICAgIGNvbnN0IHNkID0gY29udGV4dC5zY3JvbGxEaXJlY3Rpb25cbiAgICBpZiAoIXNkIHx8IHNkICE9PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIGFwcGVhcldhdGNoZWQgPSBjb250ZXh0XG4gICAgICB3YXRjaEFwcGVhcihjb250ZXh0LCB0cnVlKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgaWYgKCFsYXp5bG9hZFdhdGNoZWQpIHtcbiAgICAgIHdhdGNoTGF6eWxvYWQoKVxuICAgIH1cbiAgfSxcblxuICB1cGRhdGVkICgpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuJGVsXG4gICAgaWYgKCFlbCB8fCBlbC5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLl9yb290SWQpIHtcbiAgICAgIGlmIChlbC5jbGFzc05hbWUuaW5kZXhPZignd2VleC1yb290JykgPD0gLTEpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnd2VleC1yb290JylcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnd2VleC1jdCcpXG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS13eC1yb290LWlkJywgdGhpcy5fcm9vdElkKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhZ05hbWUgPSB0aGlzLiRvcHRpb25zICYmIHRoaXMuJG9wdGlvbnMuX2NvbXBvbmVudFRhZ1xuICAgIGNvbnN0IG1ldGFVcCA9IHdlZXguX21ldGEudXBkYXRlZFxuICAgIGlmICghbWV0YVVwW3RhZ05hbWVdKSB7XG4gICAgICBtZXRhVXBbdGFnTmFtZV0gPSAwXG4gICAgfVxuICAgIG1ldGFVcFt0YWdOYW1lXSsrXG4gICAgLy8gd2lsbCBjaGVjayBhcHBlYXJpbmcgd2hlbiBubyBvdGhlciBjaGFuZ2VzIGluIGxhdGVzdCA1MG1zLlxuICAgIGRlYm91bmNlZFdhdGNoQXBwZWFyKClcbiAgICAvKipcbiAgICAgKiBzaW5jZSB0aGUgdXBkYXRpbmcgb2YgY29tcG9uZW50IG1heSBhZmZlY3QgdGhlIGxheW91dCwgdGhlIGxhenlsb2FkaW5nIHNob3VsZFxuICAgICAqIGJlIGZpcmVkLlxuICAgICAqL1xuICAgIHRoaXMuX2ZpcmVMYXp5bG9hZCgpXG4gIH0sXG5cbiAgbW91bnRlZCAoKSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuJG9wdGlvbnMgJiYgdGhpcy4kb3B0aW9ucy5fY29tcG9uZW50VGFnXG4gICAgY29uc3QgZWwgPSB0aGlzLiRlbFxuICAgIGlmICghZWwgfHwgZWwubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdlZXguX2NvbXBvbmVudHNbdGFnTmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB3ZWV4Ll9jb21wb25lbnRzW3RhZ05hbWVdKytcbiAgICB9XG4gICAgY29uc3QgbWV0YU10ID0gd2VleC5fbWV0YS5tb3VudGVkXG4gICAgaWYgKCFtZXRhTXRbdGFnTmFtZV0pIHtcbiAgICAgIG1ldGFNdFt0YWdOYW1lXSA9IDBcbiAgICB9XG4gICAgbWV0YU10W3RhZ05hbWVdKytcblxuICAgIHdhdGNoQXBwZWFyRm9yU2Nyb2xsYWJsZXModGFnTmFtZSwgdGhpcylcblxuICAgIC8vIHdoZW4gdGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIFZ1ZSBpbnN0YW5jZS5cbiAgICBpZiAodGhpcyA9PT0gdGhpcy4kcm9vdCkge1xuICAgICAgY29uc3Qgcm9vdElkID0gYHd4LXJvb3QtJHtpZENudCsrfWBcbiAgICAgIGlmICghd2VleC5fcm9vdCkge1xuICAgICAgICB3ZWV4Ll9yb290ID0ge31cbiAgICAgIH1cbiAgICAgIHdlZXguX3Jvb3Rbcm9vdElkXSA9IHRoaXNcbiAgICAgIHRoaXMuX3Jvb3RJZCA9IHJvb3RJZFxuICAgICAgaWYgKGVsLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnd2VleC1yb290JylcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3dlZXgtY3QnKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXd4LXJvb3QtaWQnLCByb290SWQpXG5cbiAgICAgIC8qKlxuICAgICAgICogdGhlcmUncyBubyBzY3JvbGxhYmxlIGNvbXBvbmVudCBpbiB0aGlzIHBhZ2UuIFRoYXQgaXMgdG8gc2F5LFxuICAgICAgICogdGhlIHBhZ2UgaXMgdXNpbmcgYm9keSBzY3JvbGxpbmcgaW5zdGVhZCBvZiBzY3JvbGxhYmUgY29tcG9uZW50cy5cbiAgICAgICAqIFRoZW4gdGhlIGFwcGVhciB3YXRjaGVyIHNob3VsZCBiZSBhdHRhY2hlZCBvbiB0aGUgYm9keS5cbiAgICAgICAqL1xuICAgICAgaWYgKCFhcHBlYXJXYXRjaGVkKSB7XG4gICAgICAgIGFwcGVhcldhdGNoZWQgPSB0aGlzXG4gICAgICAgIHdhdGNoQXBwZWFyKHRoaXMsIHRydWUpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ZpcmVMYXp5bG9hZChlbClcbiAgICB9XG5cbiAgICAvLyBnaXZlIHdhcm5pbmcgZm9yIG5vdCB1c2luZyAkcHJvY2Vzc1N0eWxlIGluIHZ1ZS1sb2FkZXIgY29uZmlnLlxuICAgIC8vIGlmICghd2FybmVkICYmICF3aW5kb3cuX3N0eWxlX3Byb2Nlc3NpbmdfYWRkZWQpIHtcbiAgICAvLyAgIHdhcm5Qcm9jZXNzU3R5bGUoKVxuICAgIC8vIH1cbiAgfSxcblxuICBkZXN0cm95ZWQgKCkge1xuICAgIGNvbnN0IGVsID0gdGhpcy4kZWxcbiAgICBpZiAoIWVsIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLyoqXG4gICAgICogaWYgdGhlIGRlc3Ryb3llZCBlbGVtZW50IGlzIGFib3ZlIGFub3RoZXIgcGFuZWwgd2l0aCBpbWFnZXMgaW5zaWRlLCBhbmQgdGhlIGltYWdlc1xuICAgICAqIG1vdmVkIGludG8gdGhlIHZpZXdwb3J0LCB0aGVuIHRoZSBsYXp5bG9hZGluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICAgICAqL1xuICAgIGlmICh0aGlzLl9yb290SWQpIHtcbiAgICAgIGRlbGV0ZSB3ZWV4Ll9yb290W3RoaXMuX3Jvb3RJZF1cbiAgICAgIGRlbGV0ZSB0aGlzLl9yb290SWRcbiAgICB9XG4gICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuJG9wdGlvbnMgJiYgdGhpcy4kb3B0aW9ucy5fY29tcG9uZW50VGFnXG4gICAgaWYgKHR5cGVvZiB3ZWV4Ll9jb21wb25lbnRzW3RhZ05hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2VleC5fY29tcG9uZW50c1t0YWdOYW1lXS0tXG4gICAgfVxuICAgIGNvbnN0IG1ldGFEcyA9IHdlZXguX21ldGEuZGVzdHJveWVkXG4gICAgaWYgKCFtZXRhRHNbdGFnTmFtZV0pIHtcbiAgICAgIG1ldGFEc1t0YWdOYW1lXSA9IDBcbiAgICB9XG4gICAgbWV0YURzW3RhZ05hbWVdKytcbiAgICB0aGlzLl9maXJlTGF6eWxvYWQoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfZmlyZUxhenlsb2FkIChlbCkge1xuICAgICAgZ2V0VGhyb3R0bGVMYXp5bG9hZCgyNSwgZWwgfHwgZG9jdW1lbnQuYm9keSkoKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5zaWRlQSB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1ldGhvZHM6IHtcbiAgICAvLyBkZXByZWNhdGVkLlxuICAgICRzdG9wT3V0dGVyQSAoZSkge1xuICAgICAgcmV0dXJuIHRoaXMuJHN0b3BPdXRlckEoZSlcbiAgICB9LFxuXG4gICAgJHN0b3BPdXRlckEgKGUpIHtcbiAgICAgIGlmIChlICYmIGUucHJldmVudERlZmF1bHQgJiYgZS50YXJnZXQpIHtcbiAgICAgICAgaWYgKGluc2lkZUEoZS50YXJnZXQpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJHN0b3BQcm9wYWdhdGlvbiAoZSkge1xuICAgICAgaWYgKGUgJiYgZS5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldFRyYW5zZm9ybWVyIH0gZnJvbSAnd3h2LXRyYW5zZm9ybWVyJ1xuaW1wb3J0IHsgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuLi9jb25maWcnXG5jb25zdCB7IGJpbmRpbmdTdHlsZU5hbWVzRm9yUHgyUmVtIH0gPSBjb25maWdcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtZXRob2RzOiB7XG4gICAgX3B4MnJlbSAodmFsdWUsIHJvb3RWYWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSArICcnKS5yZXBsYWNlKC9bKy1dP1xcZCsoPzouXFxkKik/W3B3XXgvZ2ksIGZ1bmN0aW9uICgkMCkge1xuICAgICAgICAgIHJldHVybiB3ZWV4LnV0aWxzLnB4MnJlbSgkMCwgcm9vdFZhbHVlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHdlZXgudXRpbHMucHgycmVtKHZhbHVlICsgJycsIHJvb3RWYWx1ZSlcbiAgICAgIH1cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrKVxuICAgICAgICAgICAgJiYgYmluZGluZ1N0eWxlTmFtZXNGb3JQeDJSZW0uaW5kZXhPZihrKSA+IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2YWx1ZVtrXSA9IHdlZXgudXRpbHMucHgycmVtKHZhbHVlW2tdICsgJycsIHJvb3RWYWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICB0aGlzLl9weDJyZW0odmFsdWVbaV0sIHJvb3RWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX3Byb2Nlc3NFeGNsdXNpdmVTdHlsZSAoc3R5bGVPYmosIHJvb3RWYWx1ZSwgdGFnTmFtZSkge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBnZXRUcmFuc2Zvcm1lcih0YWdOYW1lKVxuICAgICAgcmV0dXJuIHRoaXMuX3B4MnJlbShcbiAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHN0eWxlT2JqKSxcbiAgICAgICAgcm9vdFZhbHVlXG4gICAgICApXG4gICAgfSxcblxuICAgIF9nZXRQYXJlbnRSZWN0ICgpIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy4kZWxcbiAgICAgIGNvbnN0IHBhcmVudCA9IGVsICYmIGVsLnBhcmVudEVsZW1lbnRcbiAgICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gaW5wdXQgYW5kIHRleHRhcmUgaGFzIHNvbWUgY29tbW9uIGFwaSBhbmQgZXZlbnRcbmltcG9ydCB7IGV4dGVuZCwgZGlzcGF0Y2hOYXRpdmVFdmVudCB9IGZyb20gJy4uL3V0aWxzJ1xuXG5jb25zdCBmaW5kRW50ZXJLZXlUeXBlID0gZnVuY3Rpb24gKGtleSkge1xuICBjb25zdCBrZXlzID0gWydkZWZhdWx0JywgJ2dvJywgJ25leHQnLCAnc2VhcmNoJywgJ3NlbmQnXVxuICBpZiAoa2V5cy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgIHJldHVybiBrZXlcbiAgfVxuICByZXR1cm4gJ2RvbmUnXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWV0aG9kczoge1xuICAgIGZvY3VzICgpIHtcbiAgICAgIHRoaXMuJGVsICYmIHRoaXMuJGVsLmZvY3VzKClcbiAgICB9LFxuICAgIGJsdXIgKCkge1xuICAgICAgdGhpcy4kZWwgJiYgdGhpcy4kZWwuYmx1cigpXG4gICAgfSxcblxuICAgIHNldFNlbGVjdGlvblJhbmdlIChzdGFydCwgZW5kKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLiRlbC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdnVlLXJlbmRlcl0gc2V0U2VsZWN0aW9uUmFuZ2UgaXMgbm90IHN1cHBvcnRlZC5gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFNlbGVjdGlvblJhbmdlIChjYWxsYmFjaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgIGNvbnN0IHN0ciA9IHNlbGVjdGlvbi50b1N0cmluZygpXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gdGhpcy4kZWwudmFsdWUuaW5kZXhPZihzdHIpXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvblN0YXJ0ID09PSAtMSA/IHNlbGVjdGlvblN0YXJ0IDogc2VsZWN0aW9uU3RhcnQgKyBzdHIubGVuZ3RoXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHtcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICBzZWxlY3Rpb25FbmRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG5ldyBFcnJvcignW3Z1ZS1yZW5kZXJdIGdldFNlbGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkLicpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRFZGl0U2VsZWN0aW9uUmFuZ2UgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmdldFNlbGVjdGlvblJhbmdlKGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICAvLyBzdXBwb3J0IGVudGVyIGtleSBldmVudFxuICAgIGNyZWF0ZUtleWJvYXJkRXZlbnQgKGV2ZW50cykge1xuICAgICAgY29uc3QgY3VzdG9tS2V5VHlwZSA9IHRoaXMucmV0dXJuS2V5VHlwZVxuICAgICAgaWYgKGN1c3RvbUtleVR5cGUpIHtcbiAgICAgICAgY29uc3Qga2V5Ym9hcmRFdmVudHMgPSB7XG4gICAgICAgICAgJ2tleXVwJzogZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gZXYua2V5Q29kZVxuICAgICAgICAgICAgbGV0IGtleSA9IGV2LmtleVxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICAgIGlmICgha2V5IHx8IGtleS50b0xvd2VyQ2FzZSgpID09PSAndGFiJykge1xuICAgICAgICAgICAgICAgIGtleSA9ICduZXh0J1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpc3BhdGNoTmF0aXZlRXZlbnQoZXYudGFyZ2V0LCAncmV0dXJuJywge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICByZXR1cm5LZXlUeXBlOiBmaW5kRW50ZXJLZXlUeXBlKGN1c3RvbUtleVR5cGUpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBldi50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnRzID0gZXh0ZW5kKGV2ZW50cywga2V5Ym9hcmRFdmVudHMpXG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnRzXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIGdldFBhcmVudFNjcm9sbGVyXG59IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRlc3Ryb3llZCAoKSB7XG4gICAgaWYgKCF0aGlzLl9zdGlja3lBZGRlZCkgeyByZXR1cm4gfVxuICAgIGNvbnN0IHNjcm9sbGVyID0gZ2V0UGFyZW50U2Nyb2xsZXIodGhpcylcbiAgICBpZiAoIXNjcm9sbGVyKSB7IHJldHVybiB9XG4gICAgZGVsZXRlIHNjcm9sbGVyLl9zdGlja3lDaGlsZHJlblt0aGlzLl91aWRdXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9hZGRTdGlja3kgKCkge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxuICAgICAgaWYgKCFlbCB8fCBlbC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbdnVlLXJlbmRlcl0gJGVsIGRvZXNuJ3QgZXhpc3QgdG8gYWRkIHN0aWNreS5gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnc3RpY2t5JylcbiAgICAgIGlmICghdGhpcy5fcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBlbC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BsYWNlaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgICB0aGlzLl9wbGFjZWhvbGRlci5zdHlsZS53aWR0aCA9IHRoaXMuJGVsLm9mZnNldFdpZHRoICsgJ3B4J1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuc3R5bGUuaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0ICsgJ3B4J1xuICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fcGxhY2Vob2xkZXIsIHRoaXMuJGVsKVxuICAgIH0sXG5cbiAgICBfcmVtb3ZlU3RpY2t5ICgpIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy4kZWxcbiAgICAgIGlmICghZWwgfHwgZWwubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW3Z1ZS1yZW5kZXJdICRlbCBkb2Vzbid0IGV4aXN0IHRvIHJlbW92ZSBzdGlja3kuYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3N0aWNreScpXG4gICAgICBpZiAodGhpcy5fcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9wbGFjZWhvbGRlcilcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gbnVsbFxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgYmFzZSBmcm9tICcuL2Jhc2UnXG5pbXBvcnQgZXZlbnQgZnJvbSAnLi9ldmVudCdcbmltcG9ydCBzdHlsZSBmcm9tICcuL3N0eWxlJ1xuaW1wb3J0IGlucHV0Q29tbW9uIGZyb20gJy4vaW5wdXQtY29tbW9uJ1xuaW1wb3J0IHN0aWNreSBmcm9tICcuL3N0aWNreSdcblxuZXhwb3J0IHtcbiAgYmFzZSxcbiAgZXZlbnQsXG4gIHN0eWxlLFxuICBpbnB1dENvbW1vbixcbiAgc3RpY2t5XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB3ZWV4IGZyb20gJy4vaW5zdGFuY2UnXG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gJy4uL2NvcmUnXG5cbmltcG9ydCB7IGlucHV0Q29tbW9uIH0gZnJvbSAnLi4vbWl4aW5zJ1xuXG53aW5kb3cuZ2xvYmFsID0gd2luZG93XG53aW5kb3cud2VleCA9IHdlZXhcblxud2VleC5fc3R5bGVNYXAgPSB7fVxuXG47IFsnZ2V0Q29tcG9uZW50SW5saW5lU3R5bGUnLFxuICAnZXh0cmFjdENvbXBvbmVudFN0eWxlJyxcbiAgJ21hcE5hdGl2ZUV2ZW50cycsXG4gICd0cmltVGV4dFZOb2RlcyddXG4gIC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICB3ZWV4W21ldGhvZF0gPSBjb3JlW21ldGhvZF0uYmluZCh3ZWV4KVxuICB9KVxuXG53ZWV4Lm1peGlucyA9IHtcbiAgaW5wdXRDb21tb25cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtcbiAgdHJhbnNmb3JtUmVuZGVyXG59IGZyb20gJy4uL2NvcmUvbm9kZSdcbmltcG9ydCB7IGlzRGVmIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmxldCBfaW5pdGVkID0gZmFsc2VcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgaWYgKF9pbml0ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBfaW5pdGVkID0gdHJ1ZVxuICAgIGNvbnN0IFZ1ZSA9IHdlZXguX192dWVfX1xuICAgIGNvbnN0IF9yZW5kZXIgPSBWdWUucHJvdG90eXBlLl9yZW5kZXJcbiAgICBWdWUucHJvdG90eXBlLl9yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgd2VleFJlbmRlciA9IHRoaXMuX3dlZXhSZW5kZXJcbiAgICAgIGNvbnN0IHRhZyA9IHRoaXMuJG9wdGlvbnMgJiYgdGhpcy4kb3B0aW9ucy5fY29tcG9uZW50VGFnXG4gICAgICBpZiAoXG4gICAgICAgICF3ZWV4UmVuZGVyXG4gICAgICAgICYmICFpc0RlZih3ZWV4Ll9jb21wb25lbnRzW3RhZ10pXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgb3JpZ1JlbmRlciA9IHRoaXMuJG9wdGlvbnMucmVuZGVyXG4gICAgICAgIHdlZXhSZW5kZXIgPSB0aGlzLl93ZWV4UmVuZGVyID0gZnVuY3Rpb24gKGgsIC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZ1JlbmRlci5jYWxsKHRoaXMsIHRyYW5zZm9ybVJlbmRlcih0aGlzLCBoKSwgLi4uYXJncylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRvcHRpb25zLnJlbmRlciA9IHdlZXhSZW5kZXJcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcmVuZGVyLmNhbGwodGhpcylcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICcuLi9zdHlsZXMvcmVzZXQuY3NzJ1xuaW1wb3J0ICcuLi9zdHlsZXMvYmFzZS5jc3MnXG5cbmltcG9ydCAnY29yZS1qcy9mbi9hcnJheS9mcm9tJ1xuaW1wb3J0ICdjb3JlLWpzL2ZuL29iamVjdC9hc3NpZ24nXG5pbXBvcnQgJ2NvcmUtanMvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2YnXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZydcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJ1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UnXG5cbmltcG9ydCAnLi4vbGliL2dlc3R1cmUnXG5pbXBvcnQgJy4vZ2xvYmFsJ1xuaW1wb3J0IHJlbmRlckZ1bmN0aW9uUGx1Z2luIGZyb20gJy4vcmVuZGVyLWZ1bmN0aW9uJ1xuXG5pZiAoZ2xvYmFsLlZ1ZSkge1xuICBzZXRWdWUoZ2xvYmFsLlZ1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFZ1ZSAodnVlKSB7XG4gIGlmICghdnVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbVnVlIFJlbmRlcl0gVnVlIG5vdCBmb3VuZC4gUGxlYXNlIG1ha2Ugc3VyZSB2dWUgMi54IHJ1bnRpbWUgaXMgaW1wb3J0ZWQuJylcbiAgfVxuICBpZiAoZ2xvYmFsLndlZXguX192dWVfXykge1xuICAgIHJldHVyblxuICB9XG4gIGdsb2JhbC53ZWV4Ll9fdnVlX18gPSB2dWVcbiAgd2VleC5pbnN0YWxsKHJlbmRlckZ1bmN0aW9uUGx1Z2luKVxuICBjb25zb2xlLmxvZyhgW1Z1ZSBSZW5kZXJdIGluc3RhbGwgVnVlICR7dnVlLnZlcnNpb259LmApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdlZXhcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHdlZXggZnJvbSAnLi93ZWV4J1xuaW1wb3J0IHsgc2V0VnVlIH0gZnJvbSAnLi93ZWV4J1xuaW1wb3J0IHsgYmFzZSwgZXZlbnQsIHN0eWxlLCBzdGlja3kgfSBmcm9tICcuL21peGlucydcblxuLyoqXG4gKiBpbml0IHdlZXguXG4gKiBAcGFyYW0gIHtWdWUkMn0gVnVlOiBWdWUgQ29uc3RydWN0b3IuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnM6IGV4dGVuZCB3ZWV4IHBsdWdpbnMuXG4gKiAgICAgICAgIC0gY29tcG9uZW50cy5cbiAqICAgICAgICAgLSBtb2R1bGVzLlxuICovXG5sZXQgX2luaXRlZCA9IGZhbHNlXG5mdW5jdGlvbiBpbml0IChWdWUvKiwgb3B0aW9ucyA9IHt9Ki8pIHtcbiAgaWYgKF9pbml0ZWQpIHsgcmV0dXJuIH1cbiAgX2luaXRlZCA9IHRydWVcblxuICBzZXRWdWUoVnVlKVxuXG4gIFZ1ZS5wcm90b3R5cGUuJGdldENvbmZpZyA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oJ1tWdWUgUmVuZGVyXSBcInRoaXMuJGdldENvbmZpZ1wiIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgXCJ3ZWV4LmNvbmZpZ1wiIGluc3RlYWQuJylcbiAgICByZXR1cm4gd2VleC5jb25maWdcbiAgfVxuXG4gIGNvbnN0IGh0bWxSZWdleCA9IC9eaHRtbDovaVxuICBWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSB0YWcgPT4gaHRtbFJlZ2V4LnRlc3QodGFnKVxuICBWdWUuY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lID0gdGFnID0+IHRhZy5yZXBsYWNlKGh0bWxSZWdleCwgJycpXG5cbiAgZnVuY3Rpb24gaXNXZWV4VGFnICh0YWcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdlZXguX2NvbXBvbmVudHNbdGFnXSAhPT0gJ3VuZGVmaW5lZCdcbiAgfVxuICBjb25zdCBvbGRHZXRUYWdOYW1lc3BhY2UgPSBWdWUuY29uZmlnLmdldFRhZ05hbWVzcGFjZVxuICBWdWUuY29uZmlnLmdldFRhZ05hbWVzcGFjZSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICBpZiAoaXNXZWV4VGFnKHRhZykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gb2xkR2V0VGFnTmFtZXNwYWNlKHRhZylcbiAgfVxuXG4gIFZ1ZS5taXhpbihiYXNlKVxuICBWdWUubWl4aW4oZXZlbnQpXG4gIFZ1ZS5taXhpbihzdHlsZSlcbiAgVnVlLm1peGluKHN0aWNreSlcbn1cblxuLy8gYXV0byBpbml0IGluIGRpc3QgbW9kZS5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuVnVlKSB7XG4gIGluaXQod2luZG93LlZ1ZSlcbn1cblxud2VleC5pbml0ID0gaW5pdFxuXG5leHBvcnQgZGVmYXVsdCB3ZWV4XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IElucHV0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnQgdi1tb2RlbCBvbmx5IGlmIHZ1ZSB2ZXJzaW9uIGlzIGxhcmdlciB0aGFuIDIuMi4wXG4gKi9cbmltcG9ydCB7IGdldENvbXBvbmVudElubGluZVN0eWxlIH0gZnJvbSAnLi4vLi4vY29yZSdcblxubGV0IG1hcEZvcm1FdmVudHMsIGFwcGVuZENzc1xuXG5jb25zdCBJRF9QUkVGSVhfUExBQ0VIT0xERVJfQ09MT1IgPSAnd2lwdF9wbGNfJ1xuY29uc3QgSURfUFJFRklYX0lOUFVUID0gJ3dpcHRfJ1xubGV0IGlkQ291bnQgPSAwXG5cbmZ1bmN0aW9uIHNldFBsYWNlaG9sZGVyQ29sb3IgKGlucHV0Vm0sIHBsYWNlaG9sZGVyQ29sb3IpIHtcbiAgaWYgKCFwbGFjZWhvbGRlckNvbG9yKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgdmVuZG9ycyA9IFtcbiAgICAnOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyJyxcbiAgICAnOi1tb3otcGxhY2Vob2xkZXInLFxuICAgICc6Oi1tb3otcGxhY2Vob2xkZXInLFxuICAgICc6LW1zLWlucHV0LXBsYWNlaG9sZGVyJyxcbiAgICAnOnBsYWNlaG9sZGVyLXNob3duJ1xuICBdXG4gIGNvbnN0IGlkID0gaW5wdXRWbS5faWRcbiAgYXBwZW5kQ3NzKFxuICAgIHZlbmRvcnMubWFwKGZ1bmN0aW9uICh2ZW5kb3IsIGlkeCkge1xuICAgICAgcmV0dXJuIGAjJHtJRF9QUkVGSVhfSU5QVVR9JHtpZH0ke3ZlbmRvcnNbaWR4XX17Y29sb3I6JHtwbGFjZWhvbGRlckNvbG9yfTt9YFxuICAgIH0pLmpvaW4oJycpLFxuICAgIGAke0lEX1BSRUZJWF9QTEFDRUhPTERFUl9DT0xPUn0ke2lkfWAsXG4gICAgdHJ1ZSlcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1N0eWxlICh2bSkge1xuICBjb25zdCBzdHlsZXMgPSBnZXRDb21wb25lbnRJbmxpbmVTdHlsZSh2bSlcbiAgY29uc3QgcGhDb2xvciA9IHN0eWxlcy5wbGFjZWhvbGRlckNvbG9yIHx8IHN0eWxlc1sncGxhY2Vob2xkZXItY29sb3InXVxuICBpZiAocGhDb2xvcikge1xuICAgIHNldFBsYWNlaG9sZGVyQ29sb3Iodm0sIHBoQ29sb3IpXG4gIH1cbiAgcmV0dXJuIHN0eWxlc1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dCAod2VleCkge1xuICBjb25zdCB7IGlucHV0Q29tbW9uIH0gPSB3ZWV4Lm1peGluc1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtaW5wdXQnLFxuICAgIG1peGluczogW2lucHV0Q29tbW9uXSxcbiAgICBwcm9wczoge1xuICAgICAgdHlwZToge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGRlZmF1bHQ6ICd0ZXh0JyxcbiAgICAgICAgdmFsaWRhdG9yICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnZW1haWwnLCAnbnVtYmVyJywgJ3Bhc3N3b3JkJywgJ3NlYXJjaCcsICd0ZWwnLCAndGV4dCcsICd1cmwnLCAnZGF0ZScsXG4gICAgICAgICAgICAnZGF0ZXRpbWUnLCAndGltZSdcbiAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHR5cGU6XG4gICAgICAgICAgICAvLyBidXR0b24sIGNoZWNrYm94LCBjb2xvciwgZmlsZSwgaGlkZGVuLCBpbWFnZSxcbiAgICAgICAgICAgIC8vIG1vbnRoLCByYWRpbywgcmFuZ2UsIHJlc2V0LCBzdWJtaXQsIHdlZWssXG4gICAgICAgICAgXS5pbmRleE9mKHZhbHVlKSAhPT0gLTFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZhbHVlOiBTdHJpbmcsXG4gICAgICBwbGFjZWhvbGRlcjogU3RyaW5nLFxuICAgICAgZGlzYWJsZWQ6IHtcbiAgICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgYXV0b2ZvY3VzOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSxcbiAgICAgIG1heGxlbmd0aDogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIHJldHVybktleVR5cGU6IFN0cmluZ1xuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIGlmICghdGhpcy5faWQpIHtcbiAgICAgICAgdGhpcy5faWQgPSBpZENvdW50KytcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2ZW50cyA9IG1hcEZvcm1FdmVudHModGhpcylcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdodG1sOmlucHV0Jywge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICd3ZWV4LXR5cGUnOiAnaW5wdXQnLFxuICAgICAgICAgIGlkOiBgJHtJRF9QUkVGSVhfSU5QVVR9JHt0aGlzLl9pZH1gLFxuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogKHRoaXMuZGlzYWJsZWQgIT09ICdmYWxzZScgJiYgdGhpcy5kaXNhYmxlZCAhPT0gZmFsc2UpLFxuICAgICAgICAgIGF1dG9mb2N1czogKHRoaXMuYXV0b2ZvY3VzICE9PSAnZmFsc2UnICYmIHRoaXMuYXV0b2ZvY3VzICE9PSBmYWxzZSksXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICAgICAgbWF4bGVuZ3RoOiB0aGlzLm1heGxlbmd0aCxcbiAgICAgICAgICAncmV0dXJuS2V5VHlwZSc6IHRoaXMucmV0dXJuS2V5VHlwZVxuICAgICAgICB9LFxuICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIG9uOiB0aGlzLmNyZWF0ZUtleWJvYXJkRXZlbnQoZXZlbnRzKSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWlucHV0IHdlZXgtZWwnLFxuICAgICAgICBzdGF0aWNTdHlsZTogcHJvY2Vzc1N0eWxlKHRoaXMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICBtYXBGb3JtRXZlbnRzID0gd2VleC51dGlscy5tYXBGb3JtRXZlbnRzXG4gICAgYXBwZW5kQ3NzID0gd2VleC51dGlscy5hcHBlbmRDc3NcblxuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2lucHV0JywgZ2V0SW5wdXQod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICcuL3N0eWxlLmNzcydcblxuZnVuY3Rpb24gZ2V0U3dpdGNoICh3ZWV4KSB7XG4gIGNvbnN0IHsgZXh0cmFjdENvbXBvbmVudFN0eWxlIH0gPSB3ZWV4XG4gIGNvbnN0IHsgZGlzcGF0Y2hOYXRpdmVFdmVudCB9ID0gd2VleC51dGlsc1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtc3dpdGNoJyxcbiAgICBwcm9wczoge1xuICAgICAgY2hlY2tlZDoge1xuICAgICAgICB0eXBlOiBbQm9vbGVhbiwgU3RyaW5nXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlZDoge1xuICAgICAgICB0eXBlOiBbQm9vbGVhbiwgU3RyaW5nXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICAvLyBCb3JkZXIgY29sb3IgIHdoZW4gdGhlIHN3aXRjaCBpcyB0dXJuZWQgb2ZmXG4gICAgICB0aW50Q29sb3I6IFN0cmluZyxcbiAgICAgIC8vIEJhY2tncm91bmQgY29sb3Igd2hlbiB0aGUgc3dpdGNoIGlzIHR1cm5lZCBvbi5cbiAgICAgIG9uVGludENvbG9yOiBTdHJpbmcsXG4gICAgICAvLyBDb2xvciBvZiB0aGUgZm9yZWdyb3VuZCBzd2l0Y2ggZ3JpcC5cbiAgICAgIHRodW1iVGludENvbG9yOiBTdHJpbmdcbiAgICB9LFxuICAgIGRhdGEgKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNDaGVja2VkOiAodGhpcy5jaGVja2VkICE9PSAnZmFsc2UnICYmIHRoaXMuY2hlY2tlZCAhPT0gZmFsc2UpLFxuICAgICAgICBpc0Rpc2FibGVkOiAodGhpcy5kaXNhYmxlZCAhPT0gJ2ZhbHNlJyAmJiB0aGlzLmRpc2FibGVkICE9PSBmYWxzZSlcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICB3cmFwcGVyQ2xhc3MgKCkge1xuICAgICAgICBjb25zdCBjbGFzc0FycmF5ID0gWyd3ZWV4LWVsJywgJ3dlZXgtc3dpdGNoJ11cbiAgICAgICAgdGhpcy5pc0NoZWNrZWQgJiYgY2xhc3NBcnJheS5wdXNoKCd3ZWV4LXN3aXRjaC1jaGVja2VkJylcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkICYmIGNsYXNzQXJyYXkucHVzaCgnd2VleC1zd2l0Y2gtZGlzYWJsZWQnKVxuICAgICAgICByZXR1cm4gY2xhc3NBcnJheS5qb2luKCcgJylcbiAgICAgIH0sXG4gICAgICBtZXJnZVN0eWxlICgpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgICAgY29uc3QgeyB0aW50Q29sb3IsIG9uVGludENvbG9yLCBpc0NoZWNrZWQsIGlzRGlzYWJsZWQgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIWlzQ2hlY2tlZCAmJiB0aW50Q29sb3IpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdGludENvbG9yLFxuICAgICAgICAgICAgYm94U2hhZG93OiBgJHt0aW50Q29sb3J9IDAgMCAwIDAgaW5zZXRgXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NoZWNrZWQgJiYgb25UaW50Q29sb3IpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9uVGludENvbG9yLFxuICAgICAgICAgICAgY29sb3I6IG9uVGludENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9uVGludENvbG9yLFxuICAgICAgICAgICAgYm94U2hhZG93OiBgJHtvblRpbnRDb2xvcn0gMCAwIDAgMC41MzMzMzNyZW0gaW5zZXRgXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlzRGlzYWJsZWQgJiYgT2JqZWN0LmFzc2lnbihzdHlsZSwge1xuICAgICAgICAgIG9wYWNpdHk6IDAuM1xuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBzdHlsZVxuICAgICAgfSxcbiAgICAgIHNtYWxsU3R5bGUgKCkge1xuICAgICAgICBjb25zdCB7IHRodW1iVGludENvbG9yIH0gPSB0aGlzXG4gICAgICAgIGxldCBzbWFsbFN0eWxlID0ge31cblxuICAgICAgICBpZiAodGh1bWJUaW50Q29sb3IpIHtcbiAgICAgICAgICBzbWFsbFN0eWxlID0ge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogdGh1bWJUaW50Q29sb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNtYWxsU3R5bGVcbiAgICAgIH1cbiAgICB9LFxuICAgIG1ldGhvZHM6IHtcbiAgICAgIHRvZ2dsZSAoKSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGUgZXZlbnRzXG4gICAgICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSAhdGhpcy5pc0NoZWNrZWRcbiAgICAgICAgICBkaXNwYXRjaE5hdGl2ZUV2ZW50KHRoaXMuJGVsLCAnY2hhbmdlJywgeyB2YWx1ZTogdGhpcy5pc0NoZWNrZWQgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtb3VudGVkICgpIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy4kZWxcbiAgICAgIGlmIChlbCAmJiBlbC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBpZiAoIXRoaXMuX3JlbW92ZUNsaWNrSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBldnQgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2dnbGUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9yZW1vdmVDbGlja0hhbmRsZXIgPSBlbC5yZW1vdmVFdmVudExpc3RlbmVyLmJpbmQoZWwsICd3ZWV4JHRhcCcsIGhhbmRsZXIpXG4gICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2VleCR0YXAnLCBoYW5kbGVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGJlZm9yZURlc3Ryb3kgKCkge1xuICAgICAgY29uc3Qgcm0gPSB0aGlzLl9yZW1vdmVDbGlja0hhbmRsZXJcbiAgICAgIGlmIChybSkge1xuICAgICAgICBybSgpXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9yZW1vdmVDbGlja0hhbmRsZXJcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdzd2l0Y2gnIH0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICAgICAgc3RhdGljU3R5bGU6IHRoaXMubWVyZ2VTdHlsZVxuICAgICAgfSwgW2NyZWF0ZUVsZW1lbnQoJ3NtYWxsJywge1xuICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtc3dpdGNoLWlubmVyJyxcbiAgICAgICAgc3RhdGljU3R5bGU6IHRoaXMuc21hbGxTdHlsZVxuICAgICAgfSldKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdzd2l0Y2gnLCBnZXRTd2l0Y2god2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBERUZBVUxUX09GRlNFVF9BQ0NVUkFDWSA9IDEwXG5jb25zdCBERUZBVUxUX0xPQURNT1JFX09GRlNFVCA9IDBcblxuZnVuY3Rpb24gZ2V0VGhyb3R0bGVkU2Nyb2xsIChjb250ZXh0KSB7XG4gIGNvbnN0IHNjYWxlID0gd2VleC5jb25maWcuZW52LnNjYWxlXG4gIGlmICghY29udGV4dC5fdGhyb3R0bGVTY3JvbGwpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gY29udGV4dC4kcmVmcy53cmFwcGVyXG4gICAgY29uc3QgaW5uZXIgPSBjb250ZXh0LiRyZWZzLmlubmVyXG4gICAgbGV0IHByZU9mZnNldCA9IChjb250ZXh0LnNjcm9sbERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICA/IHdyYXBwZXIuc2Nyb2xsTGVmdFxuICAgICAgOiB3cmFwcGVyLnNjcm9sbFRvcClcbiAgICAgIHx8IDBcbiAgICBjb250ZXh0Ll90aHJvdHRsZVNjcm9sbCA9IHdlZXgudXRpbHMudGhyb3R0bGUoZnVuY3Rpb24gKGV2dCkge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gY29udGV4dC5zY3JvbGxEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHdyYXBwZXIuc2Nyb2xsTGVmdFxuICAgICAgICA6IHdyYXBwZXIuc2Nyb2xsVG9wXG4gICAgICBjb25zdCBpbmRlbnQgPSBwYXJzZUludChjb250ZXh0Lm9mZnNldEFjY3VyYWN5KSAqIHNjYWxlXG4gICAgICBmdW5jdGlvbiB0cmlnZ2VyU2Nyb2xsICgpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGlubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGNvbnN0IGV2dE9iaiA9IHtcbiAgICAgICAgICBjb250ZW50U2l6ZTogeyB3aWR0aDogcmVjdC53aWR0aCwgaGVpZ2h0OiByZWN0LmhlaWdodCB9LFxuICAgICAgICAgIGNvbnRlbnRPZmZzZXQ6IHtcbiAgICAgICAgICAgIHg6IHdyYXBwZXIuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogcG9zaXRpdmUgZGlyZWNpdG9uIGZvciB5LWF4aXMgaXMgZG93bi5cbiAgICAgICAgICAgICAqIHNvIHNob3VsZCB1c2UgbmVnYXRpdmUgb3BlcmF0aW9uIG9uIHNjcm9sbFRvcC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgKDAsMCktLS0tLS0tLS0tLS0tLS0+IHhcbiAgICAgICAgICAgICAqICAgICAgIHxcbiAgICAgICAgICAgICAqICAgICAgIHxcbiAgICAgICAgICAgICAqICAgICAgIHxcbiAgICAgICAgICAgICAqICAgICAgIHxcbiAgICAgICAgICAgICAqICAgICAgIHYgeVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgeTogLXdyYXBwZXIuc2Nyb2xsVG9wXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0LiRlbCkge1xuICAgICAgICAgIHdlZXgudXRpbHMuZGlzcGF0Y2hOYXRpdmVFdmVudChjb250ZXh0LiRlbCwgJ3dlZXgkc2Nyb2xsJywgZXZ0T2JqKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoTWF0aC5hYnMob2Zmc2V0IC0gcHJlT2Zmc2V0KSA+PSBpbmRlbnQpIHtcbiAgICAgICAgdHJpZ2dlclNjcm9sbCgpXG4gICAgICAgIHByZU9mZnNldCA9IG9mZnNldFxuICAgICAgfVxuICAgIH0sIDE2LCB0cnVlKVxuICB9XG4gIHJldHVybiBjb250ZXh0Ll90aHJvdHRsZVNjcm9sbFxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbG9hZG1vcmVvZmZzZXQ6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0OiBERUZBVUxUX0xPQURNT1JFX09GRlNFVCxcbiAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gcGFyc2VJbnQodmFsdWUpXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPj0gREVGQVVMVF9MT0FETU9SRV9PRkZTRVRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb2Zmc2V0QWNjdXJhY3k6IHtcbiAgICAgIHR5cGU6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgICBkZWZhdWx0OiBERUZBVUxUX09GRlNFVF9BQ0NVUkFDWSxcbiAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gcGFyc2VJbnQodmFsdWUpXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPj0gREVGQVVMVF9PRkZTRVRfQUNDVVJBQ1lcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCAoKSB7XG4gICAgLy8gc2hvdWxkIGNhbGwgcmVzZXRMb2FkbW9yZSgpIHRvIGVuYWJsZSBsb2FkbW9yZSBldmVudC5cbiAgICB0aGlzLl9sb2FkbW9yZVJlc2V0ID0gdHJ1ZVxuICB9LFxuXG4gIG1vdW50ZWQgKCkge1xuICAgIHRoaXMucmVsb2FkU3RpY2t5Q2hpbGRyZW4oKVxuICB9LFxuXG4gIHVwZGF0ZWQgKCkge1xuICAgIHRoaXMucmVsb2FkU3RpY2t5Q2hpbGRyZW4oKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB1cGRhdGVMYXlvdXQgKCkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuJHJlZnMud3JhcHBlclxuICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgdGhpcy5fd3JhcHBlcldpZHRoID0gcmVjdC53aWR0aFxuICAgICAgICB0aGlzLl93cmFwcGVySGVpZ2h0ID0gcmVjdC5oZWlnaHRcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgY29uc3QgY2hpbGRyZW4gPSBpbm5lciAmJiBpbm5lci5jaGlsZHJlblxuICAgICAgaWYgKGlubmVyKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBpbm5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICB0aGlzLl9pbm5lcldpZHRoID0gcmVjdC53aWR0aFxuICAgICAgICB0aGlzLl9pbm5lckhlaWdodCA9IHJlY3QuaGVpZ2h0XG4gICAgICB9XG4gICAgICBjb25zdCBsb2FkaW5nRWwgPSB0aGlzLl9sb2FkaW5nICYmIHRoaXMuX2xvYWRpbmcuJGVsXG4gICAgICBjb25zdCByZWZyZXNoRWwgPSB0aGlzLl9yZWZyZXNoICYmIHRoaXMuX3JlZnJlc2guJGVsXG4gICAgICBpZiAobG9hZGluZ0VsKSB7XG4gICAgICAgIHRoaXMuX2lubmVySGVpZ2h0IC09IGxvYWRpbmdFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIH1cbiAgICAgIGlmIChyZWZyZXNoRWwpIHtcbiAgICAgICAgdGhpcy5faW5uZXJIZWlnaHQgLT0gcmVmcmVzaEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgfVxuICAgICAgLy8gaW5uZXIgd2lkdGggaXMgYWx3YXlzIHRoZSB2aWV3cG9ydCB3aWR0aCBzb21laG93IGluIGhvcml6b250YWxcbiAgICAgIC8vIHNjb2xsZXIsIHRoZXJlZm9yZSB0aGUgaW5uZXIgd2lkdGggc2hvdWxkIGJlIHJlY2xhY3VsYXRlZC5cbiAgICAgIGlmICh0aGlzLnNjcm9sbERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnICYmIGNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuX2lubmVyV2lkdGggPSB3ZWV4LnV0aWxzLmdldFJhbmdlV2lkdGgoaW5uZXIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlc2V0TG9hZG1vcmUgKCkge1xuICAgICAgdGhpcy5fbG9hZG1vcmVSZXNldCA9IHRydWVcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcHJvY2VzcyBzdGlja3kgY2hpbGRyZW4gaW4gc2Nyb2xsYWJsZSBjb21wb25lbnRzLlxuICAgICAqIGN1cnJlbnQgb25seSBzdXBwb3J0IGxpc3QgYW5kIHZlcnRpY2FsIHNjcm9sbGVyLlxuICAgICAqL1xuICAgIHByb2Nlc3NTdGlja3kgKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydCAnc3RpY2t5JyBvciAnLXdlYmtpdC1zdGlja3knLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgICAgICAqIHRvIGRvIGZ1cnRoZXIgbW9yZS5cbiAgICAgICAqL1xuICAgICAgY29uc3Qgc3RpY2t5Q2hpbGRyZW4gPSB0aGlzLl9zdGlja3lDaGlsZHJlblxuICAgICAgY29uc3QgbGVuID0gc3RpY2t5Q2hpbGRyZW4gJiYgc3RpY2t5Q2hpbGRyZW4ubGVuZ3RoIHx8IDBcbiAgICAgIGlmIChsZW4gPD0gMCkgeyByZXR1cm4gfVxuXG4gICAgICBjb25zdCBvcmlnU3RpY2t5ID0gd2VleC51dGlscy5zdXBwb3J0U3RpY2t5KClcbiAgICAgIC8vIGN1cnJlbnQgb25seSBzdXBwb3J0IGxpc3QgYW5kIHZlcnRpY2FsIHNjcm9sbGVyLlxuICAgICAgaWYgKHRoaXMuc2Nyb2xsRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuJGVsXG4gICAgICBpZiAoIWNvbnRhaW5lcikgeyByZXR1cm4gfVxuICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcFxuXG4gICAgICBsZXQgc3RpY2t5Q2hpbGRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RpY2t5Q2hpbGQgPSBzdGlja3lDaGlsZHJlbltpXVxuICAgICAgICBpZiAob3JpZ1N0aWNreSkge1xuICAgICAgICAgIHRoaXMuYWRkU3RpY2t5KHN0aWNreUNoaWxkLCBvcmlnU3RpY2t5KVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0aWNreUNoaWxkLl9pbml0T2Zmc2V0VG9wIDwgc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgdGhpcy5hZGRTdGlja3koc3RpY2t5Q2hpbGQpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVTdGlja3koc3RpY2t5Q2hpbGQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkU3RpY2t5IChlbCwgc3VwcG9ydFN0aWNreSkge1xuICAgICAgaWYgKHN1cHBvcnRTdGlja3kpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnd2VleC1pb3Mtc3RpY2t5JylcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoZWwuX3N0aWNreSA9PT0gdHJ1ZSkgcmV0dXJuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFt2dWUtcmVuZGVyXSBoZWFkZXIgYWRkIHN0aWNreWAsIGVsKVxuICAgICAgICB9XG4gICAgICAgIGVsLl9zdGlja3kgPSB0cnVlXG4gICAgICAgIGlmICghZWwuX3BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBlbC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBwbGFjZWhvbGRlci5fb3JpZ05vZGUgPSBlbFxuICAgICAgICAgIHBsYWNlaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ3dlZXgtc3RpY2t5LXBsYWNlaG9sZGVyJylcbiAgICAgICAgICBlbC5fcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlclxuICAgICAgICB9XG4gICAgICAgIGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsLl9wbGFjZWhvbGRlciwgZWwpXG4gICAgICAgIGVsLnN0eWxlLndpZHRoID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLndpZHRoXG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3dlZXgtc3RpY2t5JylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVtb3ZlU3RpY2t5IChlbCkge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZWwuX3N0aWNreSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgfHwgZWwuX3N0aWNreSA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbdnVlLXJlbmRlcl0gaGVhZGVyIHJlbW92ZSBzdGlja3lgLCBlbClcbiAgICAgIH1cbiAgICAgIGVsLl9zdGlja3kgPSBmYWxzZVxuICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbC5fcGxhY2Vob2xkZXIpXG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd3ZWV4LXN0aWNreScpXG4gICAgfSxcblxuICAgIHJlbG9hZFN0aWNreUNoaWxkcmVuICgpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuJGVsXG4gICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuXG4gICAgICBjb25zdCBzdGlja3lDaGlsZHJlbiA9IFtdXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdbc3RpY2t5XScpXG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldXG4gICAgICAgIGlmICgvd2VleC1zdGlja3ktcGxhY2Vob2xkZXIvLnRlc3QoY2hpbGQuY2xhc3NOYW1lKSkgeyAgLy8gaXMgYSBwbGFjZWhvbGRlci5cbiAgICAgICAgICBjb25zdCBvcmlnTm9kZSA9IGNoaWxkLl9vcmlnTm9kZVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFvcmlnTm9kZVxuICAgICAgICAgICAgfHwgIW9yaWdOb2RlLnBhcmVudE5vZGVcbiAgICAgICAgICAgIHx8IG9yaWdOb2RlLnBhcmVudE5vZGUgIT09IGNoaWxkLnBhcmVudE5vZGVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgLy8gaXMgYSBzdGlja3kgbm9kZS5cbiAgICAgICAgICBzdGlja3lDaGlsZHJlbi5wdXNoKGNoaWxkKVxuICAgICAgICAgIGlmICghY2hpbGQuX3N0aWNreSkge1xuICAgICAgICAgICAgY2hpbGQuX2luaXRPZmZzZXRUb3AgPSBjaGlsZC5vZmZzZXRUb3BcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0aWNreUNoaWxkcmVuID0gc3RpY2t5Q2hpbGRyZW5cbiAgICB9LFxuXG4gICAgaGFuZGxlU2Nyb2xsIChldmVudCkge1xuICAgICAgd2VleC51dGlscy5nZXRUaHJvdHRsZUxhenlsb2FkKDI1LCB0aGlzLiRlbCwgJ3Njcm9sbCcpKClcbiAgICAgIGdldFRocm90dGxlZFNjcm9sbCh0aGlzKShldmVudClcblxuICAgICAgdGhpcy5wcm9jZXNzU3RpY2t5KClcblxuICAgICAgLy8gZmlyZSBsb2FkbW9yZSBldmVudC5cbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgaWYgKGlubmVyKSB7XG4gICAgICAgIGNvbnN0IGlubmVyTGVuZ3RoID0gdGhpcy5zY3JvbGxEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICAgID8gdGhpcy5faW5uZXJXaWR0aFxuICAgICAgICAgIDogdGhpcy5faW5uZXJIZWlnaHRcbiAgICAgICAgaWYgKCF0aGlzLl9pbm5lckxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2lubmVyTGVuZ3RoID0gaW5uZXJMZW5ndGhcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faW5uZXJMZW5ndGggIT09IGlubmVyTGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5faW5uZXJMZW5ndGggPSBpbm5lckxlbmd0aFxuICAgICAgICAgIHRoaXMuX2xvYWRtb3JlUmVzZXQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2xvYWRtb3JlUmVzZXQgJiYgdGhpcy5yZWFjaEJvdHRvbSh0aGlzLmxvYWRtb3Jlb2Zmc2V0KSkge1xuICAgICAgICAgIHRoaXMuX2xvYWRtb3JlUmVzZXQgPSBmYWxzZVxuICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy4kZWxcbiAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgIHdlZXgudXRpbHMuZGlzcGF0Y2hOYXRpdmVFdmVudChlbCwgJ2xvYWRtb3JlJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVhY2hUb3AgKCkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuJHJlZnMud3JhcHBlclxuICAgICAgcmV0dXJuICghIXdyYXBwZXIpICYmICh3cmFwcGVyLnNjcm9sbFRvcCA8PSAwKVxuICAgIH0sXG5cbiAgICByZWFjaEJvdHRvbSAob2Zmc2V0KSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4kcmVmcy53cmFwcGVyXG4gICAgICBjb25zdCBpbm5lciA9IHRoaXMuJHJlZnMuaW5uZXJcbiAgICAgIG9mZnNldCA9IHBhcnNlSW50KG9mZnNldCB8fCAwKSAqIHdlZXguY29uZmlnLmVudi5zY2FsZVxuXG4gICAgICBpZiAod3JhcHBlciAmJiBpbm5lcikge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnNjcm9sbERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgICAgPyAnd2lkdGgnXG4gICAgICAgICAgOiAnaGVpZ2h0J1xuICAgICAgICBjb25zdCBpbm5lckxlbmd0aCA9IHRoaXNbYF9pbm5lciR7a2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtrZXkuc3Vic3RyKDEpfWBdXG4gICAgICAgIGNvbnN0IHdyYXBwZXJMZW5ndGggPSB0aGlzW2Bfd3JhcHBlciR7a2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtrZXkuc3Vic3RyKDEpfWBdXG4gICAgICAgIGNvbnN0IHNjcm9sbE9mZnNldCA9IHRoaXMuc2Nyb2xsRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICA/IHdyYXBwZXIuc2Nyb2xsTGVmdFxuICAgICAgICAgIDogd3JhcHBlci5zY3JvbGxUb3BcbiAgICAgICAgcmV0dXJuIHNjcm9sbE9mZnNldCA+PSBpbm5lckxlbmd0aCAtIHdyYXBwZXJMZW5ndGggLSBvZmZzZXRcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBoYW5kbGVUb3VjaFN0YXJ0IChldmVudCkge1xuICAgICAgaWYgKHRoaXMuX2xvYWRpbmcgfHwgdGhpcy5fcmVmcmVzaCkge1xuICAgICAgICBjb25zdCB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgIHRoaXMuX3RvdWNoUGFyYW1zID0ge1xuICAgICAgICAgIHJlYWNoVG9wOiB0aGlzLnJlYWNoVG9wKCksXG4gICAgICAgICAgcmVhY2hCb3R0b206IHRoaXMucmVhY2hCb3R0b20oKSxcbiAgICAgICAgICBzdGFydFRvdWNoRXZlbnQ6IHRvdWNoLFxuICAgICAgICAgIHN0YXJ0WDogdG91Y2gucGFnZVgsXG4gICAgICAgICAgc3RhcnRZOiB0b3VjaC5wYWdlWSxcbiAgICAgICAgICB0aW1lU3RhbXA6IGV2ZW50LnRpbWVTdGFtcFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZVRvdWNoTW92ZSAoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5fdG91Y2hQYXJhbXMgfHwgIXRoaXMuX3JlZnJlc2ggJiYgIXRoaXMuX2xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lciA9IHRoaXMuJHJlZnMuaW5uZXJcbiAgICAgIGNvbnN0IHsgc3RhcnRZLCByZWFjaFRvcCwgcmVhY2hCb3R0b20gfSA9IHRoaXMuX3RvdWNoUGFyYW1zXG4gICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgY29uc3QgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICBjb25zdCBvZmZzZXRZID0gdG91Y2gucGFnZVkgLSBzdGFydFlcbiAgICAgICAgY29uc3QgZGlyID0gb2Zmc2V0WSA+IDAgPyAnZG93bicgOiAndXAnXG4gICAgICAgIHRoaXMuX3RvdWNoUGFyYW1zLm9mZnNldFkgPSBvZmZzZXRZXG4gICAgICAgIGlmICh0aGlzLl9yZWZyZXNoICYmIChkaXIgPT09ICdkb3duJykgJiYgcmVhY2hUb3ApIHtcbiAgICAgICAgICB0aGlzLl9yZWZyZXNoLnB1bGxpbmdEb3duKG9mZnNldFkpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbG9hZGluZyAmJiAoZGlyID09PSAndXAnKSAmJiByZWFjaEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMuX2xvYWRpbmcucHVsbGluZ1VwKC1vZmZzZXRZKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZVRvdWNoRW5kIChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLl90b3VjaFBhcmFtcyB8fCAhdGhpcy5fcmVmcmVzaCAmJiAhdGhpcy5fbG9hZGluZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgY29uc3QgeyBzdGFydFksIHJlYWNoVG9wLCByZWFjaEJvdHRvbSB9ID0gdGhpcy5fdG91Y2hQYXJhbXNcbiAgICAgIGlmIChpbm5lcikge1xuICAgICAgICBjb25zdCB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSB0b3VjaC5wYWdlWSAtIHN0YXJ0WVxuICAgICAgICBjb25zdCBkaXIgPSBvZmZzZXRZID4gMCA/ICdkb3duJyA6ICd1cCdcbiAgICAgICAgdGhpcy5fdG91Y2hQYXJhbXMub2Zmc2V0WSA9IG9mZnNldFlcbiAgICAgICAgaWYgKHRoaXMuX3JlZnJlc2ggJiYgKGRpciA9PT0gJ2Rvd24nKSAmJiByZWFjaFRvcCkge1xuICAgICAgICAgIHRoaXMuX3JlZnJlc2gucHVsbGluZ0VuZCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbG9hZGluZyAmJiAoZGlyID09PSAndXAnKSAmJiByZWFjaEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMuX2xvYWRpbmcucHVsbGluZ0VuZCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl90b3VjaFBhcmFtc1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBzY3JvbGxhYmxlIGZyb20gJy4vc2Nyb2xsYWJsZSdcblxuZXhwb3J0IHtcbiAgc2Nyb2xsYWJsZVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBzY3JvbGxhYmxlIH0gZnJvbSAnLi9taXhpbnMnXG5cbmZ1bmN0aW9uIGdldExpc3QgKHdlZXgpIHtcbiAgY29uc3Qge1xuICAgIGV4dHJhY3RDb21wb25lbnRTdHlsZVxuICB9ID0gd2VleFxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtbGlzdCcsXG4gICAgbWl4aW5zOiBbc2Nyb2xsYWJsZV0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHdyYXBwZXJDbGFzcyAoKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzQXJyYXkgPSBbJ3dlZXgtbGlzdCcsICd3ZWV4LWxpc3Qtd3JhcHBlcicsICd3ZWV4LWN0J11cbiAgICAgICAgdGhpcy5fcmVmcmVzaCAmJiBjbGFzc0FycmF5LnB1c2goJ3dpdGgtcmVmcmVzaCcpXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgJiYgY2xhc3NBcnJheS5wdXNoKCd3aXRoLWxvYWRpbmcnKVxuICAgICAgICByZXR1cm4gY2xhc3NBcnJheS5qb2luKCcgJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgY3JlYXRlQ2hpbGRyZW4gKGgpIHtcbiAgICAgICAgY29uc3Qgc2xvdHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICAgIHRoaXMuX2NlbGxzID0gc2xvdHMuZmlsdGVyKHZub2RlID0+IHtcbiAgICAgICAgICBpZiAoIXZub2RlLnRhZyAmJiAhdm5vZGUuY29tcG9uZW50T3B0aW9ucykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBoKCdhcnRpY2xlJywge1xuICAgICAgICAgICAgcmVmOiAnaW5uZXInLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWxpc3QtaW5uZXIgd2VleC1jdCdcbiAgICAgICAgICB9LCB0aGlzLl9jZWxscylcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMud2VleFR5cGUgPSAnbGlzdCdcblxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnbWFpbicsIHtcbiAgICAgICAgcmVmOiAnd3JhcHBlcicsXG4gICAgICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiAnbGlzdCcgfSxcbiAgICAgICAgc3RhdGljQ2xhc3M6IHRoaXMud3JhcHBlckNsYXNzLFxuICAgICAgICBvbjoge1xuICAgICAgICAgIHNjcm9sbDogdGhpcy5oYW5kbGVTY3JvbGwsXG4gICAgICAgICAgdG91Y2hzdGFydDogdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LFxuICAgICAgICAgIHRvdWNobW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICAgICAgdG91Y2hlbmQ6IHRoaXMuaGFuZGxlVG91Y2hFbmRcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGljU3R5bGU6IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgfSwgdGhpcy5jcmVhdGVDaGlsZHJlbihjcmVhdGVFbGVtZW50KSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnbGlzdCcsIGdldExpc3Qod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBzY3JvbGxhYmxlIH0gZnJvbSAnLi9taXhpbnMnXG5cbmZ1bmN0aW9uIGdldFNjcm9sbGVyICh3ZWV4KSB7XG4gIGNvbnN0IHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGVcbiAgfSA9IHdlZXhcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXNjcm9sbGVyJyxcbiAgICBtaXhpbnM6IFtzY3JvbGxhYmxlXSxcbiAgICBwcm9wczoge1xuICAgICAgc2Nyb2xsRGlyZWN0aW9uOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmddLFxuICAgICAgICBkZWZhdWx0OiAndmVydGljYWwnLFxuICAgICAgICB2YWxpZGF0b3IgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddLmluZGV4T2YodmFsdWUpICE9PSAtMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2Nyb2xsYWJsZToge1xuICAgICAgICB0eXBlOiBbQm9vbGVhbl0sXG4gICAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICB3cmFwcGVyQ2xhc3MgKCkge1xuICAgICAgICBjb25zdCBjbGFzc0FycmF5ID0gWyd3ZWV4LXNjcm9sbGVyJywgJ3dlZXgtc2Nyb2xsZXItd3JhcHBlcicsICd3ZWV4LWN0J11cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICBjbGFzc0FycmF5LnB1c2goJ3dlZXgtc2Nyb2xsZXItaG9yaXpvbnRhbCcpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY2xhc3NBcnJheS5wdXNoKCd3ZWV4LXNjcm9sbGVyLXZlcnRpY2FsJylcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsYWJsZSkge1xuICAgICAgICAgIGNsYXNzQXJyYXkucHVzaCgnd2VleC1zY3JvbGxlci1kaXNhYmxlZCcpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzQXJyYXkuam9pbignICcpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGNyZWF0ZUNoaWxkcmVuIChoKSB7XG4gICAgICAgIGNvbnN0IHNsb3RzID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXVxuICAgICAgICB0aGlzLl9jZWxscyA9IHNsb3RzLmZpbHRlcih2bm9kZSA9PiB7XG4gICAgICAgICAgaWYgKCF2bm9kZS50YWcgJiYgIXZub2RlLmNvbXBvbmVudE9wdGlvbnMpIHJldHVybiBmYWxzZVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaCgnYXJ0aWNsZScsIHtcbiAgICAgICAgICAgIHJlZjogJ2lubmVyJyxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1zY3JvbGxlci1pbm5lciB3ZWV4LWN0J1xuICAgICAgICAgIH0sIHRoaXMuX2NlbGxzKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgICAgdGhpcy53ZWV4VHlwZSA9ICdzY3JvbGxlcidcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgLy8gICB2YWxpZGF0ZVN0eWxlcygnc2Nyb2xsZXInLCB0aGlzLiR2bm9kZS5kYXRhICYmIHRoaXMuJHZub2RlLmRhdGEuc3RhdGljU3R5bGUpXG4gICAgICAvLyB9XG5cbiAgICAgIHRoaXMuX2NlbGxzID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnbWFpbicsIHtcbiAgICAgICAgcmVmOiAnd3JhcHBlcicsXG4gICAgICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiAnc2Nyb2xsZXInIH0sXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgc2Nyb2xsOiB0aGlzLmhhbmRsZVNjcm9sbCxcbiAgICAgICAgICB0b3VjaHN0YXJ0OiB0aGlzLmhhbmRsZVRvdWNoU3RhcnQsXG4gICAgICAgICAgdG91Y2htb3ZlOiB0aGlzLmhhbmRsZVRvdWNoTW92ZSxcbiAgICAgICAgICB0b3VjaGVuZDogdGhpcy5oYW5kbGVUb3VjaEVuZFxuICAgICAgICB9LFxuICAgICAgICBzdGF0aWNDbGFzczogdGhpcy53cmFwcGVyQ2xhc3MsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIHRoaXMuY3JlYXRlQ2hpbGRyZW4oY3JlYXRlRWxlbWVudCkpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3Njcm9sbGVyJywgZ2V0U2Nyb2xsZXIod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IHdhdGVyZmFsbFxuICogTk9URTogb25seSBzdXBwb3J0IGZ1bGwgc2NyZWVuIHdpZHRoIHdhdGVyZmFsbC5cbiAqL1xuXG5pbXBvcnQgeyBzY3JvbGxhYmxlIH0gZnJvbSAnLi9taXhpbnMnXG5cbmNvbnN0IE5PUk1BTF9HQVBfU0laRSA9IDMyXG5jb25zdCBERUZBVUxUX0NPTFVNTl9DT1VOVCA9IDFcblxuZnVuY3Rpb24gZ2V0V2F0ZXJmYWxsICh3ZWV4KSB7XG4gIGNvbnN0IHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGVcbiAgfSA9IHdlZXhcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXdhdGVyZmFsbCcsXG4gICAgbWl4aW5zOiBbc2Nyb2xsYWJsZV0sXG4gICAgcHJvcHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogc3BlY2lmaWVkIGdhcCBzaXplLlxuICAgICAgICogdmFsdWUgY2FuIGJlIG51bWJlciBvciAnbm9ybWFsJy4gJ25vcm1hbCcgKDMycHgpIGJ5IGRlZmF1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbkdhcDoge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgICBkZWZhdWx0OiAnbm9ybWFsJyxcbiAgICAgICAgdmFsaWRhdG9yICh2YWwpIHtcbiAgICAgICAgICBpZiAoIXZhbCB8fCB2YWwgPT09ICdub3JtYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWwgPSBwYXJzZUludCh2YWwpXG4gICAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogdGhlIG1heGltdW0gY29sdW1uIGNvdW50cy5cbiAgICAgICAqIHZhbHVlIGNhbiBiZSBudW1iZXIgb3IgJ2F1dG8nLiAxIGJ5IGRlZmF1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbkNvdW50OiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgIGRlZmF1bHQ6IERFRkFVTFRfQ09MVU1OX0NPVU5ULFxuICAgICAgICB2YWxpZGF0b3IgKHZhbCkge1xuICAgICAgICAgIHZhbCA9IHBhcnNlSW50KHZhbClcbiAgICAgICAgICByZXR1cm4gIWlzTmFOKHZhbCkgJiYgdmFsID4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiB0aGUgbWltaW11bSBjb2x1bW4gd2lkdGguXG4gICAgICAgKiB2YWx1ZSBjYW4gYmUgbnVtYmVyIG9yICdhdXRvJy4gJ2F1dG8nIGJ5IGRlZmF1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbldpZHRoOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICAgICAgdmFsaWRhdG9yICh2YWwpIHtcbiAgICAgICAgICBpZiAoIXZhbCB8fCB2YWwgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsID0gcGFyc2VJbnQodmFsKVxuICAgICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPiAwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbW91bnRlZCAoKSB7XG4gICAgICB0aGlzLl9uZXh0VGljaygpXG4gICAgfSxcblxuICAgIHVwZGF0ZWQgKCkge1xuICAgICAgdGhpcy4kbmV4dFRpY2sodGhpcy5fbmV4dFRpY2soKSlcbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgX2NyZWF0ZUNoaWxkcmVuIChoLCByb290U3R5bGUpIHtcbiAgICAgICAgY29uc3Qgc2xvdHMgPSAodGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXSkuc2xpY2UoKVxuICAgICAgICB0aGlzLl9oZWFkZXJzID0gW11cbiAgICAgICAgdGhpcy5fZm9vdGVycyA9IFtdXG4gICAgICAgIHRoaXMuX290aGVycyA9IFtdXG4gICAgICAgIGNvbnN0IGxlbiA9IHNsb3RzLmxlbmd0aFxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2bm9kZSA9IHNsb3RzW2ldXG4gICAgICAgICAgY29uc3QgdGFnID1cbiAgICAgICAgICAgIHZub2RlLmNvbXBvbmVudE9wdGlvbnNcbiAgICAgICAgICAgICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMudGFnXG4gICAgICAgICAgICB8fCB2bm9kZS50YWdcbiAgICAgICAgICBpZiAodGFnID09PSAncmVmcmVzaCcgfHwgdGFnID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0YWcgPT09ICdzZWN0aW9uJykgeyAgLy8gY2VsbFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRhZyA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlcnMucHVzaCh2bm9kZSlcbiAgICAgICAgICAgIHNsb3RzW2ldID0gbnVsbCAvLyBzaG91bGQgbm90IGluY2x1ZGVkIGluIGZvb3Rlci5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCB2bm9kZSA9IHNsb3RzW2ldXG4gICAgICAgICAgaWYgKCF2bm9kZSkgeyBjb250aW51ZSB9ICAvLyBhbHJlYWR5IHRha2VuIGJ5IGhlYWRlci5cbiAgICAgICAgICBjb25zdCB0YWcgPVxuICAgICAgICAgICAgdm5vZGUuY29tcG9uZW50T3B0aW9uc1xuICAgICAgICAgICAgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucy50YWdcbiAgICAgICAgICAgIHx8IHZub2RlLnRhZ1xuICAgICAgICAgIGlmICh0YWcgPT09ICdyZWZyZXNoJyB8fCB0YWcgPT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRhZyA9PT0gJ3NlY3Rpb24nKSB7IC8vIGNlbGxcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0YWcgPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9mb290ZXJzLnB1c2godm5vZGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2VsbHMgPSBzbG90cy5maWx0ZXIodm5vZGUgPT4ge1xuICAgICAgICAgIGlmICghdm5vZGUpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGNvbnN0IGNtcE9wdHMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zXG4gICAgICAgICAgaWYgKCF2bm9kZS50YWcgJiYgIWNtcE9wdHMpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGNvbnN0IHRhZyA9IGNtcE9wdHMgJiYgY21wT3B0cy50YWcgfHwgdm5vZGUudGFnXG4gICAgICAgICAgaWYgKHRhZyA9PT0gJ3JlZnJlc2gnIHx8IHRhZyA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICB0aGlzW2BfJHt0YWd9YF0gPSB2bm9kZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0YWcgIT09ICdzZWN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb3RoZXJzLnB1c2godm5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLl9yZUNhbGMocm9vdFN0eWxlKVxuICAgICAgICB0aGlzLl9nZW5Db2x1bW5zKGgpXG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdXG4gICAgICAgIHRoaXMuX3JlZnJlc2ggJiYgY2hpbGRyZW4ucHVzaCh0aGlzLl9yZWZyZXNoKVxuICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmNvbmNhdCh0aGlzLl9oZWFkZXJzKVxuICAgICAgICAvLyAuY29uY2F0KHRoaXMuX290aGVycylcbiAgICAgICAgY2hpbGRyZW4ucHVzaChoKCdodG1sOmRpdicsIHtcbiAgICAgICAgICByZWY6ICdjb2x1bW5zJyxcbiAgICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtd2F0ZXJmYWxsLWlubmVyLWNvbHVtbnMgd2VleC1jdCdcbiAgICAgICAgfSwgdGhpcy5fY29sdW1ucykpXG4gICAgICAgIGNoaWxkcmVuLnB1c2goaCgnaHRtbDpkaXYnLCB7XG4gICAgICAgICAgcmVmOiAnZm9vdGVycycsXG4gICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXdhdGVyZmFsbC1mb290ZXJzIHdlZXgtY3QnXG4gICAgICAgIH0sIHRoaXMuX2Zvb3RlcnMpKVxuICAgICAgICB0aGlzLl9sb2FkaW5nICYmIGNoaWxkcmVuLnB1c2godGhpcy5fbG9hZGluZylcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBoKCdhcnRpY2xlJywge1xuICAgICAgICAgICAgcmVmOiAnaW5uZXInLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXdhdGVyZmFsbC1pbm5lciB3ZWV4LWN0J1xuICAgICAgICAgIH0sIGNoaWxkcmVuKVxuICAgICAgICBdXG4gICAgICB9LFxuXG4gICAgICBfcmVDYWxjIChyb290U3R5bGUpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5PVEU6IGNvbHVtbkdhcCBhbmQgY29sdW1uV2lkdGggY2FuJ3QgYm90aCBiZSBhdXRvLlxuICAgICAgICAgKiBOT1RFOiB0aGUgZm9ybXVsYTpcbiAgICAgICAgICogIHRvdGFsV2lkdGggPSBuICogdyArIChuIC0gMSkgKiBnYXBcbiAgICAgICAgICogMS4gaWYgY29sdW1uQ291bnQgPSBuIHRoZW4gY2FsYyB3XG4gICAgICAgICAqIDIuIGlmIGNvbHVtbldpZHRoID0gdyB0aGVuIGNhbGMgblxuICAgICAgICAgKiAzLiBpZiBjb2x1bW5XaWR0aCA9IHcgYW5kIGNvbHVtbkNvdW50ID0gbiB0aGVuIGNhbGMgdG90YWxXaWR0aFxuICAgICAgICAgKiAgICAzLjEgaWYgdG90YWxXaWR0aCA8IGN0V2lkdGggdGhlbiBpbmNyZWFzZSBjb2x1bW5XaWR0aFxuICAgICAgICAgKiAgICAzLjIgaWYgdG90YWxXaWR0aCA+IGN0V2lkdGggdGhlbiBkZWNyZWFzZSBjb2x1bW5Db3VudFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHdpZHRoLCBnYXAsIGNudCwgY3RXaWR0aFxuICAgICAgICBjb25zdCBzY2FsZSA9IHdlZXguY29uZmlnLmVudi5zY2FsZVxuICAgICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXG4gICAgICAgIGZ1bmN0aW9uIGdldEN0V2lkdGggKHdpZHRoLCBzdHlsZSkge1xuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSBzdHlsZS5wYWRkaW5nXG4gICAgICAgICAgICA/IHBhcnNlSW50KHN0eWxlLnBhZGRpbmcpICogMlxuICAgICAgICAgICAgOiBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCB8fCAwKSArIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCB8fCAwKVxuICAgICAgICAgIHJldHVybiB3aWR0aCAtIHBhZGRpbmdcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWwgJiYgZWwubm9kZVR5cGUgPT09IDEpIHsgLy8gYWxyZWFkeSBtb3VudGVkXG4gICAgICAgICAgY29uc3QgY3N0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpXG4gICAgICAgICAgY3RXaWR0aCA9IGdldEN0V2lkdGgoZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsIGNzdHlsZSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gbm90IG1vdW50ZWQuXG4gICAgICAgICAgLy8gb25seSBzdXBwb3J0IGZ1bGwgc2NyZWVuIHdpZHRoIGZvciB3YXRlcmZhbGwgY29tcG9uZW50LlxuICAgICAgICAgIGN0V2lkdGggPSBnZXRDdFdpZHRoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgcm9vdFN0eWxlKVxuICAgICAgICB9XG5cbiAgICAgICAgZ2FwID0gdGhpcy5jb2x1bW5HYXBcbiAgICAgICAgaWYgKGdhcCAmJiBnYXAgIT09ICdub3JtYWwnKSB7XG4gICAgICAgICAgZ2FwID0gcGFyc2VJbnQoZ2FwKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGdhcCA9IE5PUk1BTF9HQVBfU0laRVxuICAgICAgICB9XG4gICAgICAgIGdhcCA9IGdhcCAqIHNjYWxlXG5cbiAgICAgICAgd2lkdGggPSB0aGlzLmNvbHVtbldpZHRoXG4gICAgICAgIGNudCA9IHRoaXMuY29sdW1uQ291bnRcbiAgICAgICAgaWYgKHdpZHRoICYmIHdpZHRoICE9PSAnYXV0bycpIHtcbiAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KHdpZHRoKSAqIHNjYWxlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNudCAmJiBjbnQgIT09ICdhdXRvJykge1xuICAgICAgICAgIGNudCA9IHBhcnNlSW50KGNudClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDAuIGlmICFjb2x1bW5Db3VudCAmJiAhY29sdW1uV2lkdGhcbiAgICAgICAgaWYgKGNudCA9PT0gJ2F1dG8nICYmIHdpZHRoID09PSAnYXV0bycpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW3Z1ZS1yZW5kZXJdIHdhdGVyZmFsbCdzIGNvbHVtbldpZHRoIGFuZCBjb2x1bW5Db3VudCBzaG91bGRuJ3RgXG4gICAgICAgICAgICArIGAgYm90aCBiZSBhdXRvIGF0IHRoZSBzYW1lIHRpbWUuYClcbiAgICAgICAgICAgIGNudCA9IERFRkFVTFRfQ09MVU1OX0NPVU5UXG4gICAgICAgICAgICB3aWR0aCA9IGN0V2lkdGhcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gMS4gaWYgY29sdW1uQ291bnQgPSBuIHRoZW4gY2FsYyB3LlxuICAgICAgICBlbHNlIGlmIChjbnQgIT09ICdhdXRvJyAmJiB3aWR0aCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgd2lkdGggPSAoY3RXaWR0aCAtIChjbnQgLSAxKSAqIGdhcCkgLyBjbnRcbiAgICAgICAgfVxuICAgICAgICAvLyAyLiBpZiBjb2x1bW5XaWR0aCA9IHcgdGhlbiBjYWxjIG4uXG4gICAgICAgIGVsc2UgaWYgKGNudCA9PT0gJ2F1dG8nICYmIHdpZHRoICE9PSAnYXV0bycpIHtcbiAgICAgICAgICBjbnQgPSAoY3RXaWR0aCArIGdhcCkgLyAod2lkdGggKyBnYXApXG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4gaWYgY29sdW1uV2lkdGggPSB3IGFuZCBjb2x1bW5Db3VudCA9IG4gdGhlbiBjYWxjIHRvdGFsV2lkdGhcbiAgICAgICAgZWxzZSBpZiAoY250ICE9PSAnYXV0bycgJiYgd2lkdGggIT09ICdhdXRvJykge1xuICAgICAgICAgIGxldCB0b3RhbFdpZHRoXG4gICAgICAgICAgY29uc3QgYWRqdXN0Q291bnRBbmRXaWR0aCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggPSBjbnQgKiB3aWR0aCArIChjbnQgLSAxKSAqIGdhcFxuICAgICAgICAgICAgaWYgKHRvdGFsV2lkdGggPCBjdFdpZHRoKSB7XG4gICAgICAgICAgICAgIHdpZHRoICs9IChjdFdpZHRoIC0gdG90YWxXaWR0aCkgLyBjbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvdGFsV2lkdGggPiBjdFdpZHRoICYmIGNudCA+IDEpIHtcbiAgICAgICAgICAgICAgY250LS1cbiAgICAgICAgICAgICAgYWRqdXN0Q291bnRBbmRXaWR0aCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3RhbFdpZHRoID4gY3RXaWR0aCkgeyAgLy8gY250ID09PSAxXG4gICAgICAgICAgICAgIHdpZHRoID0gY3RXaWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZGp1c3RDb3VudEFuZFdpZHRoKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb2x1bW5Db3VudCA9IGNudFxuICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHdpZHRoXG4gICAgICAgIHRoaXMuX2NvbHVtbkdhcCA9IGdhcFxuICAgICAgfSxcblxuICAgICAgX2dlbkNvbHVtbnMgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IFtdXG4gICAgICAgIGNvbnN0IGNlbGxzID0gdGhpcy5fY2VsbHNcbiAgICAgICAgY29uc3QgY29sdW1uQ250ID0gdGhpcy5fY29sdW1uQ291bnRcbiAgICAgICAgY29uc3QgbGVuID0gY2VsbHMubGVuZ3RoXG4gICAgICAgIGNvbnN0IGNvbHVtbkNlbGxzID0gdGhpcy5fY29sdW1uQ2VsbHMgPSBBcnJheShjb2x1bW5DbnQpLmpvaW4oJy4nKS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiBbXSB9KVxuICAgICAgICAvLyBzcHJlYWQgY2VsbHMgdG8gdGhlIGNvbHVtbnMgdXNpbmcgc2ltcG9sZSBwb2xsaW5nIGFsZ29yaXRobS5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIChjZWxsc1tpXS5kYXRhLmF0dHJzIHx8IChjZWxsc1tpXS5kYXRhLmF0dHJzID0ge30pKVsnZGF0YS1jZWxsJ10gPSBpXG4gICAgICAgICAgY29sdW1uQ2VsbHNbaSAlIGNvbHVtbkNudF0ucHVzaChjZWxsc1tpXSlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbkNudDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNyZWF0ZUVsZW1lbnQoJ2h0bWw6ZGl2Jywge1xuICAgICAgICAgICAgcmVmOiBgY29sdW1uJHtpfWAsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAnZGF0YS1jb2x1bW4nOiBpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWN0JyxcbiAgICAgICAgICAgIHN0YXRpY1N0eWxlOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9jb2x1bW5XaWR0aCArICdweCcsXG4gICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IGkgPT09IDAgPyAwIDogdGhpcy5fY29sdW1uR2FwICsgJ3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGNvbHVtbkNlbGxzW2ldKSlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgX25leHRUaWNrICgpIHtcbiAgICAgICAgdGhpcy5fcmVMYXlvdXRDaGlsZHJlbigpXG4gICAgICB9LFxuXG4gICAgICBfcmVMYXlvdXRDaGlsZHJlbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cmVhdCB0aGUgc2hvcnRlc3QgY29sdW1uIGJvdHRvbSBhcyB0aGUgbWF0Y2ggc3RhbmRhcmQuXG4gICAgICAgICAqIHdoaWNoZXZlciBjZWxsIGV4Y2VlZGVkIGl0IHdvdWxkIGJlIHJlYXJyYW5nZWQuXG4gICAgICAgICAqIDEuIG0gPSBzaG9ydGVzdCBjb2x1bW4gYm90dG9tLlxuICAgICAgICAgKiAyLiBnZXQgYWxsIGNlbGwgaWRzIHdobyBpcyBiZWxvdyBtLlxuICAgICAgICAgKiAzLiBjYWxjdWxhdGUgd2hpY2ggY2VsbCBzaG91bGQgYmUgaW4gd2hpY2ggY29sdW1uLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgY29sdW1uQ250ID0gdGhpcy5fY29sdW1uQ291bnRcbiAgICAgICAgY29uc3QgY29sdW1uRG9tcyA9IFtdXG4gICAgICAgIGNvbnN0IGNvbHVtbkFwcGVuZEZyYWdtZW50cyA9IFtdXG4gICAgICAgIGNvbnN0IGNvbHVtbkJvdHRvbXMgPSBbXVxuICAgICAgICBsZXQgbWluQm90dG9tID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgbGV0IG1pbkJvdHRvbUNvbHVtbkluZGV4ID0gMFxuXG4gICAgICAgIC8vIDEuIGZpbmQgdGhlIHNob3J0ZXN0IGNvbHVtbiBib3R0b20uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uQ250OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5Eb20gPSB0aGlzLl9jb2x1bW5zW2ldLmVsbVxuICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGNvbHVtbkRvbS5sYXN0RWxlbWVudENoaWxkXG4gICAgICAgICAgY29uc3QgYm90dG9tID0gbGFzdENoaWxkID8gbGFzdENoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSA6IDBcbiAgICAgICAgICBjb2x1bW5Eb21zLnB1c2goY29sdW1uRG9tKVxuICAgICAgICAgIGNvbHVtbkJvdHRvbXNbaV0gPSBib3R0b21cbiAgICAgICAgICBjb2x1bW5BcHBlbmRGcmFnbWVudHMucHVzaChkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICAgICAgaWYgKGJvdHRvbSA8IG1pbkJvdHRvbSkge1xuICAgICAgICAgICAgbWluQm90dG9tID0gYm90dG9tXG4gICAgICAgICAgICBtaW5Cb3R0b21Db2x1bW5JbmRleCA9IGlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBnZXQgYWxsIGNlbGwgaWRzIHdobyBpcyBiZWxvdyBtLlxuICAgICAgICBjb25zdCBiZWxvd0NlbGxJZHMgPSBbXVxuICAgICAgICBjb25zdCBiZWxvd0NlbGxzID0ge31cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5DbnQ7IGkrKykge1xuICAgICAgICAgIGlmIChpID09PSBtaW5Cb3R0b21Db2x1bW5JbmRleCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY29sdW1uRG9tID0gY29sdW1uRG9tc1tpXVxuICAgICAgICAgIGNvbnN0IGNlbGxzSW5Db2x1bW4gPSBjb2x1bW5Eb20ucXVlcnlTZWxlY3RvckFsbCgnc2VjdGlvbi53ZWV4LWNlbGwnKVxuICAgICAgICAgIGNvbnN0IGxlbiA9IGNlbGxzSW5Db2x1bW4ubGVuZ3RoXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGxlbiAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsRG9tID0gY2VsbHNJbkNvbHVtbltqXVxuICAgICAgICAgICAgY29uc3QgY2VsbFJlY3QgPSBjZWxsRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICBpZiAoY2VsbFJlY3QudG9wID4gbWluQm90dG9tKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gfn5jZWxsRG9tLmdldEF0dHJpYnV0ZSgnZGF0YS1jZWxsJylcbiAgICAgICAgICAgICAgYmVsb3dDZWxsSWRzLnB1c2goaWQpXG4gICAgICAgICAgICAgIGJlbG93Q2VsbHNbaWRdID0geyBlbG06IGNlbGxEb20sIGhlaWdodDogY2VsbFJlY3QuaGVpZ2h0IH1cbiAgICAgICAgICAgICAgY29sdW1uQm90dG9tc1tpXSAtPSBjZWxsUmVjdC5oZWlnaHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBjYWxjdWxhdGUgd2hpY2ggY2VsbCBzaG91bGQgYmUgaW4gd2hpY2ggY29sdW1uIGFuZCByZWFycmFuZ2UgdGhlbVxuICAgICAgICAvLyAgaW4gdGhlIGRvbSB0cmVlLlxuICAgICAgICBiZWxvd0NlbGxJZHMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSlcbiAgICAgICAgY29uc3QgY2VsbElkc0xlbiA9IGJlbG93Q2VsbElkcy5sZW5ndGhcbiAgICAgICAgZnVuY3Rpb24gYWRkVG9TaG9ydGVzdENvbHVtbiAoYmVsb3dDZWxsKSB7XG4gICAgICAgICAgLy8gZmluZCBzaG9ydGVzdCBib3R0b20uXG4gICAgICAgICAgbWluQm90dG9tID0gTWF0aC5taW4oLi4uY29sdW1uQm90dG9tcylcbiAgICAgICAgICBtaW5Cb3R0b21Db2x1bW5JbmRleCA9IGNvbHVtbkJvdHRvbXMuaW5kZXhPZihtaW5Cb3R0b20pXG4gICAgICAgICAgY29uc3QgeyBlbG06IGNlbGxFbG0sIGhlaWdodDogY2VsbEhlaWdodCB9ID0gYmVsb3dDZWxsXG4gICAgICAgICAgY29sdW1uQXBwZW5kRnJhZ21lbnRzW21pbkJvdHRvbUNvbHVtbkluZGV4XS5hcHBlbmRDaGlsZChjZWxsRWxtKVxuICAgICAgICAgIGNvbHVtbkJvdHRvbXNbbWluQm90dG9tQ29sdW1uSW5kZXhdICs9IGNlbGxIZWlnaHRcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxJZHNMZW47IGkrKykge1xuICAgICAgICAgIGFkZFRvU2hvcnRlc3RDb2x1bW4oYmVsb3dDZWxsc1tiZWxvd0NlbGxJZHNbaV1dKVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uQ250OyBpKyspIHtcbiAgICAgICAgICBjb2x1bW5Eb21zW2ldLmFwcGVuZENoaWxkKGNvbHVtbkFwcGVuZEZyYWdtZW50c1tpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMud2VleFR5cGUgPSAnd2F0ZXJmYWxsJ1xuICAgICAgdGhpcy5fY2VsbHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KClcbiAgICAgIH0pXG4gICAgICBjb25zdCBtZXJnZWRTdHlsZSA9IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ21haW4nLCB7XG4gICAgICAgIHJlZjogJ3dyYXBwZXInLFxuICAgICAgICBhdHRyczogeyAnd2VleC10eXBlJzogJ3dhdGVyZmFsbCcgfSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBzY3JvbGw6IHRoaXMuaGFuZGxlU2Nyb2xsLFxuICAgICAgICAgIHRvdWNoc3RhcnQ6IHRoaXMuaGFuZGxlVG91Y2hTdGFydCxcbiAgICAgICAgICB0b3VjaG1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgICAgIHRvdWNoZW5kOiB0aGlzLmhhbmRsZVRvdWNoRW5kXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC13YXRlcmZhbGwgd2VleC13YXRlcmZhbGwtd3JhcHBlciB3ZWV4LWN0JyxcbiAgICAgICAgc3RhdGljU3R5bGU6IG1lcmdlZFN0eWxlXG4gICAgICB9LCB0aGlzLl9jcmVhdGVDaGlsZHJlbihjcmVhdGVFbGVtZW50LCBtZXJnZWRTdHlsZSkpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3dhdGVyZmFsbCcsIGdldFdhdGVyZmFsbCh3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmZ1bmN0aW9uIGdldEhlYWRlciAod2VleCkge1xuICBjb25zdCB7IGV4dHJhY3RDb21wb25lbnRTdHlsZSB9ID0gd2VleFxuXG4gIHJldHVybiB7XG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICBjb25zdCBhdHRycyA9IHRoaXMuJHZub2RlLmRhdGEuYXR0cnNcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdodG1sOmhlYWRlcicsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAnd2VleC10eXBlJzogJ2hlYWRlcicsXG4gICAgICAgICAgc3RpY2t5OiAoXG4gICAgICAgICAgICB0aGlzLiRwYXJlbnQud2VleFR5cGUgPT09ICd3YXRlcmZhbGwnXG4gICAgICAgICAgICAmJiB0eXBlb2YgYXR0cnMuc3RpY2t5ID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICkgPyB1bmRlZmluZWQgOiAnJ1xuICAgICAgICB9LFxuICAgICAgICByZWY6ICdoZWFkZXInLFxuICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtaGVhZGVyIHdlZXgtY3QnLFxuICAgICAgICBzdGF0aWNTdHlsZTogZXh0cmFjdENvbXBvbmVudFN0eWxlKHRoaXMpXG4gICAgICB9LCB0aGlzLiRzbG90cy5kZWZhdWx0KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdoZWFkZXInLCBnZXRIZWFkZXIod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRMb2FkaW5nICgpIHtcbiAgY29uc3QgeyBleHRyYWN0Q29tcG9uZW50U3R5bGUgfSA9IHdlZXhcbiAgY29uc3QgeyBkaXNwYXRjaE5hdGl2ZUV2ZW50IH0gPSB3ZWV4LnV0aWxzXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd2VleC1sb2FkaW5nJyxcbiAgICBwcm9wczoge1xuICAgICAgZGlzcGxheToge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGRlZmF1bHQ6ICdzaG93JyxcbiAgICAgICAgdmFsaWRhdG9yICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBbJ3Nob3cnLCAnaGlkZSddLmluZGV4T2YodmFsdWUpICE9PSAtMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkYXRhICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogLTEsXG4gICAgICAgIHZpZXdIZWlnaHQ6IDBcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vdW50ZWQgKCkge1xuICAgICAgdGhpcy52aWV3SGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0XG4gICAgICBpZiAodGhpcy5kaXNwbGF5ID09PSAnaGlkZScpIHtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLnZpZXdIZWlnaHRcbiAgICAgIH1cbiAgICB9LFxuICAgIHdhdGNoOiB7XG4gICAgICBoZWlnaHQgKHZhbCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBgJHt2YWx9cHhgXG4gICAgICAgIHRoaXMuJGVsLnN0eWxlLmhlaWdodCA9IG9mZnNldFxuICAgICAgICB0aGlzLiRlbC5zdHlsZS5ib3R0b20gPSBvZmZzZXRcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5ICh2YWwpIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gJ2hpZGUnKSB7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSAwXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLnZpZXdIZWlnaHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgcHVsbGluZyAob2Zmc2V0WSA9IDApIHtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvZmZzZXRZXG4gICAgICB9LFxuICAgICAgcHVsbGluZ1VwIChvZmZzZXRZKSB7XG4gICAgICAgIHRoaXMuJGVsLnN0eWxlLnRyYW5zaXRpb24gPSBgaGVpZ2h0IDBzYFxuICAgICAgICB0aGlzLnB1bGxpbmcob2Zmc2V0WSlcbiAgICAgIH0sXG4gICAgICBwdWxsaW5nRW5kICgpIHtcbiAgICAgICAgdGhpcy4kZWwgJiYgKHRoaXMuJGVsLnN0eWxlLnRyYW5zaXRpb24gPSBgaGVpZ2h0IC4yc2ApXG4gICAgICAgIGlmICh0aGlzLmhlaWdodCA+PSB0aGlzLnZpZXdIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLnB1bGxpbmcodGhpcy52aWV3SGVpZ2h0KVxuICAgICAgICAgIGlmICh0aGlzLiRlbCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hOYXRpdmVFdmVudCh0aGlzLiRlbCwgJ2xvYWRpbmcnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLnB1bGxpbmcoMClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldENoaWxkcmVuICgpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXkgPT09ICdzaG93Jykge1xuICAgICAgICAgIHJldHVybiBjaGlsZHJlblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5maWx0ZXIodm5vZGUgPT4ge1xuICAgICAgICAgIHJldHVybiAhKHZub2RlLmNvbXBvbmVudE9wdGlvbnNcbiAgICAgICAgICAgICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMudGFnID09PSAnbG9hZGluZy1pbmRpY2F0b3InKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICB0aGlzLiRwYXJlbnQuX2xvYWRpbmcgPSB0aGlzXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnYXNpZGUnLCB7XG4gICAgICAgIHJlZjogJ2xvYWRpbmcnLFxuICAgICAgICBhdHRyczogeyAnd2VleC10eXBlJzogJ2xvYWRpbmcnIH0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1sb2FkaW5nIHdlZXgtY3QnLFxuICAgICAgICBzdGF0aWNTdHlsZTogZXh0cmFjdENvbXBvbmVudFN0eWxlKHRoaXMpXG4gICAgICB9LCB0aGlzLmdldENoaWxkcmVuKCkpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2xvYWRpbmcnLCBnZXRMb2FkaW5nKHdlZXgpKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZnVuY3Rpb24gZ2V0UmVmcmVzaCAod2VleCkge1xuICBjb25zdCB7IGV4dHJhY3RDb21wb25lbnRTdHlsZSB9ID0gd2VleFxuICBjb25zdCB7IGRpc3BhdGNoTmF0aXZlRXZlbnQgfSA9IHdlZXgudXRpbHNcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXJlZnJlc2gnLFxuICAgIHByb3BzOiB7XG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZGVmYXVsdDogJ3Nob3cnLFxuICAgICAgICB2YWxpZGF0b3IgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIFsnc2hvdycsICdoaWRlJ10uaW5kZXhPZih2YWx1ZSkgIT09IC0xXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRhdGEgKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFzdER5OiAwLFxuICAgICAgICB2aWV3SGVpZ2h0OiAwLFxuICAgICAgICBoZWlnaHQ6IC0xXG4gICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkICgpIHtcbiAgICAgIHRoaXMudmlld0hlaWdodCA9IHRoaXMuJGVsLm9mZnNldEhlaWdodFxuICAgICAgaWYgKHRoaXMuZGlzcGxheSA9PT0gJ2hpZGUnKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMFxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy52aWV3SGVpZ2h0XG4gICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgaGVpZ2h0ICh2YWwpIHtcbiAgICAgICAgdGhpcy4kZWwuc3R5bGUuaGVpZ2h0ID0gYCR7dmFsfXB4YFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXkgKHZhbCkge1xuICAgICAgICBpZiAodmFsID09PSAnaGlkZScpIHtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IDBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMudmlld0hlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICBwdWxsaW5nIChvZmZzZXRZID0gMCkge1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9mZnNldFlcbiAgICAgICAgaWYgKHRoaXMuJGVsKSB7XG4gICAgICAgICAgZGlzcGF0Y2hOYXRpdmVFdmVudCh0aGlzLiRlbCwgJ3B1bGxpbmdkb3duJywge1xuICAgICAgICAgICAgZHk6IG9mZnNldFkgLSB0aGlzLmxhc3REeSxcbiAgICAgICAgICAgIHB1bGxpbmdEaXN0YW5jZTogb2Zmc2V0WSxcbiAgICAgICAgICAgIHZpZXdIZWlnaHQ6IHRoaXMudmlld0hlaWdodFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0RHkgPSBvZmZzZXRZXG4gICAgICB9LFxuICAgICAgcHVsbGluZ0Rvd24gKG9mZnNldFkpIHtcbiAgICAgICAgdGhpcy4kZWwuc3R5bGUudHJhbnNpdGlvbiA9IGBoZWlnaHQgMHNgXG4gICAgICAgIHRoaXMucHVsbGluZyhvZmZzZXRZKVxuICAgICAgfSxcbiAgICAgIHB1bGxpbmdFbmQgKCkge1xuICAgICAgICB0aGlzLiRlbCAmJiAodGhpcy4kZWwuc3R5bGUudHJhbnNpdGlvbiA9IGBoZWlnaHQgLjJzYClcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0ID49IHRoaXMudmlld0hlaWdodCkge1xuICAgICAgICAgIHRoaXMucHVsbGluZyh0aGlzLnZpZXdIZWlnaHQpXG4gICAgICAgICAgaWYgKHRoaXMuJGVsKSB7XG4gICAgICAgICAgICBkaXNwYXRjaE5hdGl2ZUV2ZW50KHRoaXMuJGVsLCAncmVmcmVzaCcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMucHVsbGluZygwKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0Q2hpbGRyZW4gKCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQgfHwgW11cbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheSA9PT0gJ3Nob3cnKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkcmVuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmZpbHRlcih2bm9kZSA9PiB7XG4gICAgICAgICAgcmV0dXJuICEodm5vZGUuY29tcG9uZW50T3B0aW9uc1xuICAgICAgICAgICAgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucy50YWcgPT09ICdsb2FkaW5nLWluZGljYXRvcicpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuJHBhcmVudC5fcmVmcmVzaCA9IHRoaXNcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdhc2lkZScsIHtcbiAgICAgICAgcmVmOiAncmVmcmVzaCcsXG4gICAgICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiAncmVmcmVzaCcgfSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXJlZnJlc2ggd2VleC1jdCcsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIHRoaXMuZ2V0Q2hpbGRyZW4oKSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgncmVmcmVzaCcsIGdldFJlZnJlc2god2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xubGV0IGV4dHJhY3RDb21wb25lbnRTdHlsZSwgZ2V0UmdiLCBsb29wQXJyYXksIGdldFN0eWxlU2hlZXRCeUlkXG5cbmNvbnN0IF9jc3MgPSBgXG4ud2VleC1yZWZyZXNoLWluZGljYXRvcixcbi53ZWV4LWxvYWRpbmctaW5kaWNhdG9yIHtcbiAgd2lkdGg6IDFyZW0gIWltcG9ydGFudDtcbiAgaGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XG4gIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gIC1tb3otYm94LWFsaWduOiBjZW50ZXI7XG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xuICAtbW96LWJveC1wYWNrOiBjZW50ZXI7XG4gIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBiYWNrZ3JvdW5kOiBub25lO1xufVxuLndlZXgtcmVmcmVzaC1pbmRpY2F0b3I6YmVmb3JlLFxuLndlZXgtbG9hZGluZy1pbmRpY2F0b3I6YmVmb3JlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGNvbnRlbnQ6ICcnO1xuICBmb250LXNpemU6IDAuMTZyZW07XG4gIHdpZHRoOiAwLjVlbTtcbiAgaGVpZ2h0OiAwLjVlbTtcbiAgbGVmdDogMDtcbiAgdG9wOiAwO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdGV4dC1pbmRlbnQ6IC05OTk5ZW07XG4gIC13ZWJraXQtYW5pbWF0aW9uOiB3ZWV4LXNwaW5uZXIgMS4xcyBpbmZpbml0ZSBlYXNlO1xuICAtbW96LWFuaW1hdGlvbjogd2VleC1zcGlubmVyIDEuMXMgaW5maW5pdGUgZWFzZTtcbiAgYW5pbWF0aW9uOiB3ZWV4LXNwaW5uZXIgMS4xcyBpbmZpbml0ZSBlYXNlO1xufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgd2VleC1zcGlubmVyIHtcbiAgMCUsXG4gIDEwMCUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSAjZmZmZmZmLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0xLjNlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAtMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcbiAgfVxuICAxMS4yNSUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIDAuOWVtIC0wLjllbSAwIDBlbSAjZmZmZmZmLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0xLjNlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTtcbiAgfVxuICAyNSUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIDEuMjVlbSAwZW0gMCAwZW0gI2ZmZmZmZiwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0xLjNlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgfVxuICAzNy41JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgMS4yNWVtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIDAuODc1ZW0gMC44NzVlbSAwIDBlbSAjZmZmZmZmLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICB9XG4gIDUwJSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMS4yNWVtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIDAuODc1ZW0gMC44NzVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIDBlbSAxLjI1ZW0gMCAwZW0gI2ZmZmZmZiwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICB9XG4gIDYxLjI1JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMS4yNWVtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuODc1ZW0gMC44NzVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCAtMC45ZW0gMC45ZW0gMCAwZW0gI2ZmZmZmZiwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICB9XG4gIDc1JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMS4yNWVtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuODc1ZW0gMC44NzVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCAtMS4zZW0gMGVtIDAgMGVtICNmZmZmZmYsIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICB9XG4gIDg3LjUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIC0xLjNlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCAtMC45ZW0gLTAuOWVtIDAgMGVtICNmZmZmZmY7XG4gIH1cbn1cblxuQGtleWZyYW1lcyB3ZWV4LXNwaW5uZXIge1xuICAwJSxcbiAgMTAwJSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtICNmZmZmZmYsIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICB9XG4gIDExLjI1JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMC45ZW0gLTAuOWVtIDAgMGVtICNmZmZmZmYsIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICB9XG4gIDI1JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMS4yNWVtIDBlbSAwIDBlbSAjZmZmZmZmLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICB9XG4gIDM3LjUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtICNmZmZmZmYsIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgNTAlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMGVtIDEuMjVlbSAwIDBlbSAjZmZmZmZmLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgNjEuMjUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIC0wLjllbSAwLjllbSAwIDBlbSAjZmZmZmZmLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgNzUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIC0xLjNlbSAwZW0gMCAwZW0gI2ZmZmZmZiwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgODcuNSUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIC0wLjllbSAtMC45ZW0gMCAwZW0gI2ZmZmZmZjtcbiAgfVxufVxuYFxuXG5mdW5jdGlvbiBnZXRTdHlsZVNoZWV0IChzcGlubmVyVm0pIHtcbiAgaWYgKHNwaW5uZXJWbS5fc3R5bGVTaGVldCkge1xuICAgIHJldHVyblxuICB9XG4gIHNwaW5uZXJWbS5fc3R5bGVTaGVldCA9IGdldFN0eWxlU2hlZXRCeUlkKCd3ZWV4LWNtcC1sb2FkaW5nLWluZGljYXRvcicpXG59XG5cbmZ1bmN0aW9uIHNldEtleWZyYW1lQ29sb3IgKHNwaW5uZXJWbSwgdmFsKSB7XG4gIGdldFN0eWxlU2hlZXQoc3Bpbm5lclZtKVxuICBjb25zdCBrZXlmcmFtZVJ1bGVzID0gY29tcHV0ZUtleUZyYW1lUnVsZXModmFsKVxuICBjb25zdCBydWxlcyA9IHNwaW5uZXJWbS5fc3R5bGVTaGVldC5ydWxlcyB8fCBzcGlubmVyVm0uX3N0eWxlU2hlZXQuY3NzUnVsZXNcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBydWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gcnVsZXMuaXRlbShpKVxuICAgIGlmICgoaXRlbS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FU19SVUxFXG4gICAgICAgICAgfHwgaXRlbS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRVNfUlVMRSlcbiAgICAgICAgJiYgaXRlbS5uYW1lID09PSAnd2VleC1zcGlubmVyJykge1xuICAgICAgY29uc3QgY3NzUnVsZXMgPSBpdGVtLmNzc1J1bGVzXG4gICAgICBmb3IgKGxldCBqID0gMCwgbSA9IGNzc1J1bGVzLmxlbmd0aDsgaiA8IG07IGorKykge1xuICAgICAgICBjb25zdCBrZXlmcmFtZSA9IGNzc1J1bGVzW2pdXG4gICAgICAgIGlmIChrZXlmcmFtZS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FX1JVTEVcbiAgICAgICAgICB8fCBrZXlmcmFtZS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRV9SVUxFKSB7XG4gICAgICAgICAga2V5ZnJhbWUuc3R5bGUuYm94U2hhZG93ID0ga2V5ZnJhbWVSdWxlc1tqXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVLZXlGcmFtZVJ1bGVzIChyZ2IpIHtcbiAgaWYgKCFyZ2IpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBzY2FsZUFyciA9IFtcbiAgICAnMGVtIC0xLjNlbSAwZW0gMGVtJyxcbiAgICAnMC45ZW0gLTAuOWVtIDAgMGVtJyxcbiAgICAnMS4yNWVtIDBlbSAwIDBlbScsXG4gICAgJzAuODc1ZW0gMC44NzVlbSAwIDBlbScsXG4gICAgJzBlbSAxLjI1ZW0gMCAwZW0nLFxuICAgICctMC45ZW0gMC45ZW0gMCAwZW0nLFxuICAgICctMS4zZW0gMGVtIDAgMGVtJyxcbiAgICAnLTAuOWVtIC0wLjllbSAwIDBlbSddXG4gIGNvbnN0IGNvbG9yQXJyID0gW1xuICAgICcxJyxcbiAgICAnMC4yJyxcbiAgICAnMC4yJyxcbiAgICAnMC4yJyxcbiAgICAnMC4yJyxcbiAgICAnMC4yJyxcbiAgICAnMC41JyxcbiAgICAnMC43J11cbiAgICAubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gJ3JnYmEoJyArIHJnYi5yICsgJywnICsgcmdiLmcgKyAnLCcgKyByZ2IuYiArICcsJyArIGUgKyAnKSdcbiAgICB9KVxuICBjb25zdCBydWxlcyA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2NhbGVBcnIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0bXBDb2xvckFyciA9IGxvb3BBcnJheShjb2xvckFyciwgaSwgJ3InKVxuICAgIHJ1bGVzLnB1c2goc2NhbGVBcnIubWFwKGZ1bmN0aW9uIChzY2FsZVN0ciwgaSkge1xuICAgICAgcmV0dXJuIHNjYWxlU3RyICsgJyAnICsgdG1wQ29sb3JBcnJbaV1cbiAgICB9KS5qb2luKCcsICcpKVxuICB9XG4gIHJldHVybiBydWxlc1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzU3R5bGUgKHZtKSB7XG4gIGNvbnN0IHN0eWxlID0gZXh0cmFjdENvbXBvbmVudFN0eWxlKHZtKVxuICBjb25zdCBjb2xvciA9IHN0eWxlLmNvbG9yXG4gIGNvbnN0IHJnYiA9IGNvbG9yICYmIGdldFJnYihjb2xvcilcbiAgaWYgKHJnYikge1xuICAgIHNldEtleWZyYW1lQ29sb3Iodm0sIHJnYilcbiAgfVxuICByZXR1cm4gc3R5bGVcbn1cblxuY29uc3QgbG9hZGluZ0luZGljYXRvciA9IHtcbiAgbmFtZTogJ3dlZXgtbG9hZGluZy1pbmRpY2F0b3InLFxuICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICB0aGlzLndlZXhUeXBlID0gJ2xvYWRpbmctaW5kaWNhdG9yJ1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdtYXJrJywge1xuICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdsb2FkaW5nLWluZGljYXRvcicgfSxcbiAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1sb2FkaW5nLWluZGljYXRvciB3ZWV4LWN0JyxcbiAgICAgIHN0YXRpY1N0eWxlOiBwcm9jZXNzU3R5bGUodGhpcylcbiAgICB9KVxuICB9LFxuICBfY3NzXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIGV4dHJhY3RDb21wb25lbnRTdHlsZSA9IHdlZXguZXh0cmFjdENvbXBvbmVudFN0eWxlXG4gICAgZ2V0UmdiID0gd2VleC51dGlscy5nZXRSZ2JcbiAgICBsb29wQXJyYXkgPSB3ZWV4LnV0aWxzLmxvb3BBcnJheVxuICAgIGdldFN0eWxlU2hlZXRCeUlkID0gd2VleC51dGlscy5nZXRTdHlsZVNoZWV0QnlJZFxuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2xvYWRpbmctaW5kaWNhdG9yJywgbG9hZGluZ0luZGljYXRvcilcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBzY3JvbGxhYmxlIH0gZnJvbSAnLi9taXhpbnMnXG5cbmZ1bmN0aW9uIGdldExpc3QgKHdlZXgpIHtcbiAgY29uc3Qge1xuICAgIGV4dHJhY3RDb21wb25lbnRTdHlsZVxuICB9ID0gd2VleFxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtcmVjeWNsZS1saXN0JyxcbiAgICBtaXhpbnM6IFtzY3JvbGxhYmxlXSxcbiAgICBwcm9wczoge1xuICAgICAgc2Nyb2xsRGlyZWN0aW9uOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmddLFxuICAgICAgICBkZWZhdWx0OiAndmVydGljYWwnLFxuICAgICAgICB2YWxpZGF0b3IgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddLmluZGV4T2YodmFsdWUpICE9PSAtMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2l0ZW1zOiBBcnJheSxcbiAgICAgIF9zd2l0Y2g6IFN0cmluZ1xuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHdyYXBwZXJDbGFzcyAoKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzQXJyYXkgPSBbJ3dlZXgtcmVjeWNsZScsICd3ZWV4LXJlY3ljbGUtd3JhcHBlcicsICd3ZWV4LWN0J11cbiAgICAgICAgdGhpcy5fcmVmcmVzaCAmJiBjbGFzc0FycmF5LnB1c2goJ3dpdGgtcmVmcmVzaCcpXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgJiYgY2xhc3NBcnJheS5wdXNoKCd3aXRoLWxvYWRpbmcnKVxuICAgICAgICBpZiAodGhpcy5zY3JvbGxEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgIGNsYXNzQXJyYXkucHVzaCgnd2VleC1yZWN5Y2xlLWhvcml6b250YWwnKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNsYXNzQXJyYXkucHVzaCgnd2VleC1yZWN5Y2xlLXZlcnRpY2FsJylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3NBcnJheS5qb2luKCcgJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgY3JlYXRlQ2hpbGRyZW4gKGgpIHtcbiAgICAgICAgY29uc3QgX3ZtID0gdGhpc1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGgoJ2FydGljbGUnLCB7XG4gICAgICAgICAgICByZWY6ICdpbm5lcicsXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtcmVjeWNsZS1pbm5lciB3ZWV4LWN0J1xuICAgICAgICAgIH0sIFtcbiAgICAgICAgICAgIF92bS5fbChfdm0uX2l0ZW1zLCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBfdm0uX3QoX3ZtLnNsb3RlTmFtZShpdGVtKSwgbnVsbCwge1xuICAgICAgICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSlcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHNsb3RlTmFtZSAoaXRlbSkge1xuICAgICAgICBpZiAodGhpcy5fc3dpdGNoICYmIGl0ZW1bdGhpcy5fc3dpdGNoXSkge1xuICAgICAgICAgIHJldHVybiBpdGVtW3RoaXMuX3N3aXRjaF1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJ2RlZmF1bHQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICB0aGlzLndlZXhUeXBlID0gJ2xpc3QnXG5cbiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVMYXlvdXQoKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ21haW4nLCB7XG4gICAgICAgIHJlZjogJ3dyYXBwZXInLFxuICAgICAgICBhdHRyczogeyAnd2VleC10eXBlJzogJ3JlY3ljbGUtbGlzdCcgfSxcbiAgICAgICAgc3RhdGljQ2xhc3M6IHRoaXMud3JhcHBlckNsYXNzLFxuICAgICAgICBvbjoge1xuICAgICAgICAgIHNjcm9sbDogdGhpcy5oYW5kbGVTY3JvbGwsXG4gICAgICAgICAgdG91Y2hzdGFydDogdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LFxuICAgICAgICAgIHRvdWNobW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICAgICAgdG91Y2hlbmQ6IHRoaXMuaGFuZGxlVG91Y2hFbmRcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGljU3R5bGU6IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgfSwgdGhpcy5jcmVhdGVDaGlsZHJlbihjcmVhdGVFbGVtZW50KSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgncmVjeWNsZS1saXN0JywgZ2V0TGlzdCh3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBsaXN0IGZyb20gJy4vbGlzdCdcbmltcG9ydCBzY3JvbGxlciBmcm9tICcuL3Njcm9sbGVyJ1xuaW1wb3J0IHdhdGVyZmFsbCBmcm9tICcuL3dhdGVyZmFsbCdcbi8vIGltcG9ydCBjZWxsIGZyb20gJy4vY2VsbCdcbmltcG9ydCBoZWFkZXIgZnJvbSAnLi9oZWFkZXInXG5pbXBvcnQgbG9hZGluZyBmcm9tICcuL2xvYWRpbmcnXG5pbXBvcnQgcmVmcmVzaCBmcm9tICcuL3JlZnJlc2gnXG5pbXBvcnQgbG9hZGluZ0luZGljYXRvciBmcm9tICcuL2xvYWRpbmctaW5kaWNhdG9yJ1xuaW1wb3J0IHJlY3ljbGVMaXN0IGZyb20gJy4vcmVjeWNsZS1saXN0J1xuXG5pbXBvcnQgJy4vc3R5bGUuY3NzJ1xuXG5jb25zdCBtb2R1bGVzID0gW1xuICBsaXN0LFxuICBzY3JvbGxlcixcbiAgd2F0ZXJmYWxsLFxuICAvLyBjZWxsLFxuICBoZWFkZXIsXG4gIGxvYWRpbmcsXG4gIHJlZnJlc2gsXG4gIGxvYWRpbmdJbmRpY2F0b3IsXG4gIHJlY3ljbGVMaXN0XG5dXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIG1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobW9kKSB7XG4gICAgICB3ZWV4Lmluc3RhbGwobW9kKVxuICAgIH0pXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgVFJBTlNJVElPTl9USU1FID0gNDAwXG5jb25zdCBORUlHSEJPUl9TQ0FMRV9USU1FID0gMTAwXG5jb25zdCBNQUlOX1NMSURFX09QQUNJVFkgPSAxXG5jb25zdCBUSFJPVFRMRV9TQ1JPTExfVElNRSA9IDI1XG5jb25zdCBJTlRFUlZBTF9NSU5JTVVNID0gMjAwXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY3JlYXRlZCAoKSB7XG4gICAgdGhpcy5fY2xvbmVzID0gW11cbiAgICB0aGlzLmlubmVyT2Zmc2V0ID0gMFxuICAgIHRoaXMuX2luZGljYXRvciA9IG51bGxcbiAgfSxcblxuICBiZWZvcmVVcGRhdGUgKCkge1xuICAgIHRoaXMuX2dldFdyYXBwZXJTaXplKClcbiAgfSxcblxuICB1cGRhdGVkICgpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuJGNoaWxkcmVuXG4gICAgY29uc3QgbGVuID0gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoXG4gICAgaWYgKGNoaWxkcmVuICYmIGxlbiA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3Qgdm0gPSBjaGlsZHJlbltpXVxuICAgICAgICBpZiAodm0uJG9wdGlvbnMuX2NvbXBvbmVudFRhZyA9PT0gJ2luZGljYXRvcidcbiAgICAgICAgICB8fCB2bS4kdm5vZGUuZGF0YS5yZWYgPT09ICdpbmRpY2F0b3InKSB7XG4gICAgICAgICAgdm0uX3dhdGNoZXIuZ2V0KClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZnJhbWVDb3VudCA9IHRoaXMuZnJhbWVDb3VudFxuICAgIGlmICghdGhpcy5fcHJlRnJhbWVDb3VudCkge1xuICAgICAgdGhpcy5fcHJlRnJhbWVDb3VudCA9IGZyYW1lQ291bnRcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5fcHJlRnJhbWVDb3VudCAhPT0gZnJhbWVDb3VudCkge1xuICAgICAgdGhpcy5fcmVzZXROb2RlcygpXG4gICAgICB0aGlzLl9wcmVGcmFtZUNvdW50ID0gZnJhbWVDb3VudFxuICAgICAgY29uc3QgcmVzZXRCbGFua0ZyYW1lID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5kZXggPj0gZnJhbWVDb3VudCkge1xuICAgICAgICAgIC8vIHJlc2V0IGJsYW5rIHBhZ2UuXG4gICAgICAgICAgdGhpcy5fc3RvcEF1dG9QbGF5KClcbiAgICAgICAgICB0aGlzLl9zbGlkZVRvKDApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zbGlkaW5nKSB7XG4gICAgICAgIC8vIElmIGl0J3Mgc2xpZGluZywgdGhlbiB0aGUgY3VycmVudEluZGV4IGlzIHRoZSBsYXN0IGZyYW1lLiBUaGUgYWN0dWFsIGN1cnJlbnRJbmRleFxuICAgICAgICAvLyBzaG91bGQgYmUgdGhlIG5leHQgaW5kZXguXG4gICAgICAgIC8vIFRoYXQgaXMgdG8gc2F5LCB0aGlzIHVwZGF0aW5nIGhhcHBlbnMgQmV0d2VlbiBfcGFyZXBhcmVOb2RlcyBhbmQgX3JlYXJyYW5nZU5vZGVzLFxuICAgICAgICAvLyBhbmQgdGhlIHNsaWRpbmcgaXMgbm90IHlldCBmaW5pc2hlZCwgYW5kIHRoZSBzdGF0ZSBpcyBub3QgdXBkYXRlZCB5ZXQuXG4gICAgICAgIHNldFRpbWVvdXQocmVzZXRCbGFua0ZyYW1lLCBUUkFOU0lUSU9OX1RJTUUgKyBORUlHSEJPUl9TQ0FMRV9USU1FKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlc2V0QmxhbmtGcmFtZSgpXG4gICAgICB9XG4gICAgfVxuICAgIHdlZXgudXRpbHMuZmlyZUxhenlsb2FkKHRoaXMuJGVsLCB0cnVlKVxuICAgIGlmICh0aGlzLl9wcmVJbmRleCAhPT0gdGhpcy5jdXJyZW50SW5kZXgpIHtcbiAgICAgIHRoaXMuX3NsaWRlVG8odGhpcy5jdXJyZW50SW5kZXgpXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQgKCkge1xuICAgIHRoaXMuX2dldFdyYXBwZXJTaXplKClcbiAgICB0aGlzLl9zbGlkZVRvKHRoaXMuY3VycmVudEluZGV4KVxuICAgIHdlZXgudXRpbHMuZmlyZUxhenlsb2FkKHRoaXMuJGVsLCB0cnVlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfZ2V0V3JhcHBlclNpemUgKCkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuJHJlZnMud3JhcHBlclxuICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgdGhpcy5fd3JhcHBlcldpZHRoID0gcmVjdC53aWR0aFxuICAgICAgICB0aGlzLl93cmFwcGVySGVpZ2h0ID0gcmVjdC5oZWlnaHRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2Zvcm1hdENoaWxkcmVuIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQgfHwgW11cbiAgICAgIGxldCBpbmRpY2F0b3JWbm9kZVxuICAgICAgY29uc3QgY2VsbHMgPSBjaGlsZHJlbi5maWx0ZXIodm5vZGUgPT4ge1xuICAgICAgICBpZiAoIXZub2RlLnRhZykgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmICh2bm9kZS5jb21wb25lbnRPcHRpb25zICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMudGFnID09PSAnaW5kaWNhdG9yJykge1xuICAgICAgICAgIGluZGljYXRvclZub2RlID0gdm5vZGVcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSkubWFwKHZub2RlID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ2xpJywge1xuICAgICAgICAgIHJlZjogJ2NlbGxzJyxcbiAgICAgICAgICBzdGF0aWNDbGFzczogYHdlZXgtc2xpZGVyLWNlbGwgd2VleC1jdCR7dGhpcy5pc05laWdoYm9yID8gJyBuZWlnaGJvci1jZWxsJyA6ICcnfWBcbiAgICAgICAgfSwgW3Zub2RlXSlcbiAgICAgIH0pXG4gICAgICBpZiAoaW5kaWNhdG9yVm5vZGUpIHtcbiAgICAgICAgaW5kaWNhdG9yVm5vZGUuZGF0YS5hdHRycyA9IGluZGljYXRvclZub2RlLmRhdGEuYXR0cnMgfHwge31cbiAgICAgICAgaW5kaWNhdG9yVm5vZGUuZGF0YS5hdHRycy5jb3VudCA9IGNlbGxzLmxlbmd0aFxuICAgICAgICBpbmRpY2F0b3JWbm9kZS5kYXRhLmF0dHJzLmFjdGl2ZSA9IHRoaXMuY3VycmVudEluZGV4XG4gICAgICAgIHRoaXMuX2luZGljYXRvciA9IGluZGljYXRvclZub2RlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2VsbHNcbiAgICB9LFxuXG4gICAgX3JlbmRlclNsaWRlcyAoY3JlYXRlRWxlbWVudCkge1xuICAgICAgdGhpcy5fY2VsbHMgPSB0aGlzLl9mb3JtYXRDaGlsZHJlbihjcmVhdGVFbGVtZW50KVxuICAgICAgdGhpcy5mcmFtZUNvdW50ID0gdGhpcy5fY2VsbHMubGVuZ3RoXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ25hdicsXG4gICAgICAgIHtcbiAgICAgICAgICByZWY6ICd3cmFwcGVyJyxcbiAgICAgICAgICBhdHRyczogeyAnd2VleC10eXBlJzogdGhpcy5pc05laWdoYm9yID8gJ3NsaWRlci1uZWlnaGJvcicgOiAnc2xpZGVyJyB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICB0b3VjaHN0YXJ0OiB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0LFxuICAgICAgICAgICAgdG91Y2htb3ZlOiB3ZWV4LnV0aWxzLnRocm90dGxlKHdlZXgudXRpbHMuYmluZCh0aGlzLl9oYW5kbGVUb3VjaE1vdmUsIHRoaXMpLCAyNSksXG4gICAgICAgICAgICB0b3VjaGVuZDogdGhpcy5faGFuZGxlVG91Y2hFbmQsXG4gICAgICAgICAgICB0b3VjaGNhbmNlbDogdGhpcy5faGFuZGxlVG91Y2hDYW5jZWxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1zbGlkZXIgd2VleC1zbGlkZXItd3JhcHBlciB3ZWV4LWN0JyxcbiAgICAgICAgICBzdGF0aWNTdHlsZTogd2VleC5leHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ3VsJywge1xuICAgICAgICAgICAgcmVmOiAnaW5uZXInLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXNsaWRlci1pbm5lciB3ZWV4LWN0J1xuICAgICAgICAgIH0sIHRoaXMuX2NlbGxzKSxcbiAgICAgICAgICB0aGlzLl9pbmRpY2F0b3JcbiAgICAgICAgXVxuICAgICAgKVxuICAgIH0sXG5cbiAgICAvLyBnZXQgc3RhbmRhcmQgaW5kZXhcbiAgICBfbm9ybWFsaXplSW5kZXggKGluZGV4KSB7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IChpbmRleCArIHRoaXMuZnJhbWVDb3VudCkgJSB0aGlzLmZyYW1lQ291bnRcbiAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChuZXdJbmRleCwgMCksIHRoaXMuZnJhbWVDb3VudCAtIDEpXG4gICAgfSxcblxuICAgIF9zdGFydEF1dG9QbGF5ICgpIHtcbiAgICAgIGlmICghdGhpcy5hdXRvUGxheSB8fCB0aGlzLmF1dG9QbGF5ID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2F1dG9QbGF5VGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2F1dG9QbGF5VGltZXIpXG4gICAgICAgIHRoaXMuX2F1dG9QbGF5VGltZXIgPSBudWxsXG4gICAgICB9XG4gICAgICBsZXQgaW50ZXJ2YWwgPSBwYXJzZUludCh0aGlzLmludGVydmFsIC0gVFJBTlNJVElPTl9USU1FIC0gTkVJR0hCT1JfU0NBTEVfVElNRSlcbiAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgPiBJTlRFUlZBTF9NSU5JTVVNID8gaW50ZXJ2YWwgOiBJTlRFUlZBTF9NSU5JTVVNXG4gICAgICB0aGlzLl9hdXRvUGxheVRpbWVyID0gc2V0VGltZW91dCh3ZWV4LnV0aWxzLmJpbmQodGhpcy5fbmV4dCwgdGhpcyksIGludGVydmFsKVxuICAgIH0sXG5cbiAgICBfc3RvcEF1dG9QbGF5ICgpIHtcbiAgICAgIGlmICh0aGlzLl9hdXRvUGxheVRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hdXRvUGxheVRpbWVyKVxuICAgICAgICB0aGlzLl9hdXRvUGxheVRpbWVyID0gbnVsbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfc2xpZGVUbyAoaW5kZXgsIGlzVG91Y2hTY3JvbGwpIHtcbiAgICAgIGlmICh0aGlzLmZyYW1lQ291bnQgPD0gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pbmZpbml0ZSB8fCB0aGlzLmluZmluaXRlID09PSAnZmFsc2UnKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPiAodGhpcy5mcmFtZUNvdW50IC0gMSkpIHtcbiAgICAgICAgICB0aGlzLl9zbGlkZVRvKHRoaXMuY3VycmVudEluZGV4KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuX3ByZUluZGV4ICYmIHRoaXMuX3ByZUluZGV4ICE9PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93Tm9kZXMgJiYgdGhpcy5fc2hvd05vZGVzWzBdKSB7XG4gICAgICAgICAgdGhpcy5fcHJlSW5kZXggPSB0aGlzLl9zaG93Tm9kZXNbMF0uaW5kZXhcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmVJbmRleCA9IHRoaXMuY3VycmVudEluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3NsaWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aGlzLl9zbGlkaW5nID0gdHJ1ZVxuXG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuX25vcm1hbGl6ZUluZGV4KGluZGV4KVxuICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLiRyZWZzLmlubmVyXG4gICAgICBjb25zdCBzdGVwID0gdGhpcy5fc3RlcCA9IHRoaXMuZnJhbWVDb3VudCA8PSAxID8gMCA6IHRoaXMuX3ByZUluZGV4IC0gaW5kZXhcblxuICAgICAgaWYgKGlubmVyKSB7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVOb2RlcygpXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHdlZXgudXRpbHMuZ2V0VHJhbnNmb3JtT2JqKGlubmVyKS50cmFuc2xhdGVcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0cmFuc2xhdGUgJiYgdHJhbnNsYXRlLm1hdGNoKC90cmFuc2xhdGVbXihdK1xcKChbKy1cXGQuXSspLylcbiAgICAgICAgY29uc3QgaW5uZXJYID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgMFxuICAgICAgICBjb25zdCBkaXN0ID0gaW5uZXJYIC0gdGhpcy5pbm5lck9mZnNldFxuICAgICAgICB0aGlzLmlubmVyT2Zmc2V0ICs9IHN0ZXAgKiB0aGlzLl93cmFwcGVyV2lkdGhcbiAgICAgICAgLy8gdHJhbnNmb3JtIHRoZSB3aG9sZSBzbGlkZXMgZ3JvdXAuXG4gICAgICAgIGlubmVyLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSBgLXdlYmtpdC10cmFuc2Zvcm0gJHtUUkFOU0lUSU9OX1RJTUUgLyAxMDAwfXMgZWFzZS1pbi1vdXRgXG4gICAgICAgIGlubmVyLnN0eWxlLm1velRyYW5zaXRpb24gPSBgdHJhbnNmb3JtICR7VFJBTlNJVElPTl9USU1FIC8gMTAwMH1zIGVhc2UtaW4tb3V0YFxuICAgICAgICBpbm5lci5zdHlsZS50cmFuc2l0aW9uID0gYHRyYW5zZm9ybSAke1RSQU5TSVRJT05fVElNRSAvIDEwMDB9cyBlYXNlLWluLW91dGBcbiAgICAgICAgaW5uZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7dGhpcy5pbm5lck9mZnNldH1weCwgMCwgMClgXG4gICAgICAgIGlubmVyLnN0eWxlLm1velRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3RoaXMuaW5uZXJPZmZzZXR9cHgsIDAsIDApYFxuICAgICAgICBpbm5lci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt0aGlzLmlubmVyT2Zmc2V0fXB4LCAwLCAwKWBcblxuICAgICAgICAvLyBlbWl0IHNjcm9sbCBldmVudHMuXG4gICAgICAgIGlmICghaXNUb3VjaFNjcm9sbCkge1xuICAgICAgICAgIHRoaXMuX2VtaXRTY3JvbGxFdmVudCgnc2Nyb2xsc3RhcnQnKVxuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Rocm90dGxlRW1pdFNjcm9sbChkaXN0LCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0U2Nyb2xsRXZlbnQoJ3Njcm9sbGVuZCcpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSwgVEhST1RUTEVfU0NST0xMX1RJTUUpXG5cbiAgICAgICAgdGhpcy5fbG9vcFNob3dOb2RlcyhzdGVwKVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzTmVpZ2hib3IpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldE5laWdoYm9ycygpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpbm5lci5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJydcbiAgICAgICAgICAgIGlubmVyLnN0eWxlLm1velRyYW5zaXRpb24gPSAnJ1xuICAgICAgICAgICAgaW5uZXIuc3R5bGUudHJhbnNpdGlvbiA9ICcnXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fc2hvd1N0YXJ0SWR4OyBpIDw9IHRoaXMuX3Nob3dFbmRJZHg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fc2hvd05vZGVzW2ldXG4gICAgICAgICAgICAgIGlmICghbm9kZSkgeyBjb250aW51ZSB9XG4gICAgICAgICAgICAgIGNvbnN0IGVsbSA9IG5vZGUuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgICAgZWxtLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnJ1xuICAgICAgICAgICAgICBlbG0uc3R5bGUubW96VHJhbnNpdGlvbiA9ICcnXG4gICAgICAgICAgICAgIGVsbS5zdHlsZS50cmFuc2l0aW9uID0gJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNsZWFuIGNsb25lZCBub2RlcyBhbmQgcmVhcnJhbmdlIHNsaWRlIGNlbGxzLlxuICAgICAgICAgICAgdGhpcy5fcmVhcnJhbmdlTm9kZXMobmV3SW5kZXgpXG4gICAgICAgICAgfSwgTkVJR0hCT1JfU0NBTEVfVElNRSlcbiAgICAgICAgfSwgVFJBTlNJVElPTl9USU1FKVxuICAgICAgfVxuXG4gICAgICBpZiAobmV3SW5kZXggIT09IHRoaXMuX3ByZUluZGV4KSB7XG4gICAgICAgIHdlZXgudXRpbHMuZGlzcGF0Y2hOYXRpdmVFdmVudCh0aGlzLiRlbCwgJ2NoYW5nZScsIHtcbiAgICAgICAgICBpbmRleDogbmV3SW5kZXhcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2NsZWFyTm9kZXNPZmZzZXQgKCkge1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5fc2hvd0VuZElkeFxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3Nob3dTdGFydElkeDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgICBub2RlID0gbm9kZSAmJiBub2RlLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgIGlmICghbm9kZSkgeyBjb250aW51ZSB9XG4gICAgICAgIHdlZXgudXRpbHMuYWRkVHJhbnNmb3JtKHRoaXMuX3Nob3dOb2Rlc1tpXS5maXJzdEVsZW1lbnRDaGlsZCwge1xuICAgICAgICAgIHRyYW5zbGF0ZTogJ3RyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfbG9vcFNob3dOb2RlcyAoc3RlcCkge1xuICAgICAgaWYgKCFzdGVwIHx8IHRoaXMuZnJhbWVDb3VudCA8PSAxKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3Qgc2lnbiA9IHN0ZXAgPiAwID8gMSA6IC0xXG4gICAgICBsZXQgaSA9IHN0ZXAgPD0gMCA/IHRoaXMuX3Nob3dTdGFydElkeCA6IHRoaXMuX3Nob3dFbmRJZHhcbiAgICAgIGNvbnN0IGVuZCA9IHN0ZXAgPD0gMCA/IHRoaXMuX3Nob3dFbmRJZHggOiB0aGlzLl9zaG93U3RhcnRJZHhcbiAgICAgIGZvciAoOyBpICE9PSBlbmQgLSBzaWduOyBpIC09IHNpZ24pIHtcbiAgICAgICAgY29uc3QgbmV4dElkeCA9IGkgKyBzdGVwXG4gICAgICAgIHRoaXMuX3Nob3dOb2Rlc1tuZXh0SWR4XSA9IHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgICB0aGlzLl9zaG93Tm9kZXNbbmV4dElkeF0uX3Nob3dJbmRleCA9IG5leHRJZHhcbiAgICAgICAgZGVsZXRlIHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgfVxuICAgICAgdGhpcy5fc2hvd1N0YXJ0SWR4ICs9IHN0ZXBcbiAgICAgIHRoaXMuX3Nob3dFbmRJZHggKz0gc3RlcFxuICAgIH0sXG5cbiAgICBfcHJlcGFyZU5vZGVzICgpIHtcbiAgICAgIC8vIHRlc3QgaWYgdGhlIG5leHQgc2xpZGUgdG93YXJkcyB0aGUgZGlyZWN0aW9uIGV4aXN0cy5cbiAgICAgIC8vIGUuZy4gY3VycmVudEluZGV4IDAgLT4gMTogc2hvdWxkIHByZXBhcmUgNCBzbGlkZXM6IC0xLCAwLCAxLCAyXG4gICAgICAvLyBpZiBub3QsIHRyYW5zbGF0ZSBhIG5vZGUgdG8gaGVyZSwgb3IganVzdCBjbG9uZSBpdC5cbiAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLl9zdGVwXG4gICAgICBpZiAoIXRoaXMuX2luaXRlZCkge1xuICAgICAgICB0aGlzLl9pbml0Tm9kZXMoKVxuICAgICAgICB0aGlzLl9pbml0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuX3Nob3dOb2RlcyA9IHt9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mcmFtZUNvdW50IDw9IDEpIHtcbiAgICAgICAgdGhpcy5fc2hvd1N0YXJ0SWR4ID0gdGhpcy5fc2hvd0VuZElkeCA9IDBcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX2NlbGxzWzBdLmVsbVxuICAgICAgICBub2RlLnN0eWxlLm9wYWNpdHkgPSAxXG4gICAgICAgIG5vZGUuc3R5bGUuekluZGV4ID0gOTlcbiAgICAgICAgbm9kZS5pbmRleCA9IDBcbiAgICAgICAgdGhpcy5fc2hvd05vZGVzWzBdID0gbm9kZVxuICAgICAgICBub2RlLl9pblNob3cgPSB0cnVlXG4gICAgICAgIG5vZGUuX3Nob3dJbmRleCA9IDBcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNob3dDb3VudCA9IHRoaXMuX3Nob3dDb3VudCA9IE1hdGguYWJzKHN0ZXApICsgM1xuICAgICAgdGhpcy5fc2hvd1N0YXJ0SWR4ID0gc3RlcCA8PSAwID8gLTEgOiAyIC0gc2hvd0NvdW50XG4gICAgICB0aGlzLl9zaG93RW5kSWR4ID0gc3RlcCA8PSAwID8gc2hvd0NvdW50IC0gMiA6IDFcbiAgICAgIHRoaXMuX2NsZWFyTm9kZXNPZmZzZXQoKVxuICAgICAgdGhpcy5fcG9zaXRpb25Ob2Rlcyh0aGlzLl9zaG93U3RhcnRJZHgsIHRoaXMuX3Nob3dFbmRJZHgsIHN0ZXApXG4gICAgfSxcblxuICAgIF9jbGVhckNsb25lcyAoKSB7XG4gICAgICAvLyBjbGVhciBhbGwgY2xvbmVzLlxuICAgICAgT2JqZWN0LmtleXModGhpcy5fY2xvbmVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHRoaXMuX2Nsb25lc1trZXldLmZvckVhY2goY2xvbmVOb2RlID0+IHtcbiAgICAgICAgICBjbG9uZU5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZU5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuX2Nsb25lc1trZXldID0gW11cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIC8vIHJlc2V0IG5vZGVzJyBpbmRleCBhbmQgX2luU2hvdyBzdGF0ZS4gQnV0IGxlYXZlIHRoZSBzdHlsZXNcbiAgICAvLyBhcyB0aGV5IGFyZSB0byBwcmV2ZW50IGRvbSByZXJlbmRlcmluZy5cbiAgICBfcmVzZXROb2RlcyAoKSB7XG4gICAgICB0aGlzLl9jbGVhckNsb25lcygpXG4gICAgICAvLyByZXNldCBzdGF0dXMuXG4gICAgICB0aGlzLl9jZWxscy5mb3JFYWNoKChjZWxsLCBpZHgpID0+IHtcbiAgICAgICAgY29uc3QgZWxtID0gY2VsbC5lbG1cbiAgICAgICAgZWxtLmluZGV4ID0gaWR4XG4gICAgICAgIGVsbS5faW5TaG93ID0gZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIF9pbml0Tm9kZXMgKCkge1xuICAgICAgdGhpcy5fY2VsbHMuZm9yRWFjaCgoY2VsbCwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjZWxsLmVsbVxuICAgICAgICBub2RlLmluZGV4ID0gaWR4XG4gICAgICAgIG5vZGUuX2luU2hvdyA9IGZhbHNlXG4gICAgICAgIG5vZGUuc3R5bGUuekluZGV4ID0gMFxuICAgICAgICBub2RlLnN0eWxlLm9wYWNpdHkgPSAwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBfcG9zaXRpb25Ob2RlcyAoYmVnaW4sIGVuZCwgc3RlcCwgYW5pbSkge1xuICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLl9jZWxsc1xuICAgICAgY29uc3Qgc3RhcnQgPSBzdGVwIDw9IDAgPyBiZWdpbiA6IGVuZFxuICAgICAgY29uc3Qgc3RvcCA9IHN0ZXAgPD0gMCA/IGVuZCA6IGJlZ2luXG4gICAgICBjb25zdCBzaWduID0gc3RlcCA8PSAwID8gLTEgOiAxXG4gICAgICBsZXQgY2VsbEluZGV4ID0gdGhpcy5fcHJlSW5kZXggKyBzaWduXG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgIT09IHN0b3AgLSBzaWduOyBpID0gaSAtIHNpZ24pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGNlbGxzW3RoaXMuX25vcm1hbGl6ZUluZGV4KGNlbGxJbmRleCldLmVsbVxuICAgICAgICBjZWxsSW5kZXggPSBjZWxsSW5kZXggLSBzaWduXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uTm9kZShub2RlLCBpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBpbmRleDogcG9zaXRpb24gaW5kZXggaW4gdGhlIHNob3dpbmcgY2VsbHMnIHZpZXcuXG4gICAgICovXG4gICAgX3Bvc2l0aW9uTm9kZSAobm9kZSwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuX3Nob3dOb2Rlc1tpbmRleF1cbiAgICAgIGlmIChub2RlLl9pblNob3cgJiYgKGhvbGRlciAhPT0gbm9kZSB8fCBob2xkZXIuX3Nob3dJbmRleCAhPT0gaW5kZXgpKSB7XG4gICAgICAgIGlmIChob2xkZXIgJiYgaG9sZGVyLl9pc0Nsb25lKSB7IHRoaXMuX3JlbW92ZUNsb25lKGhvbGRlcikgfVxuICAgICAgICBub2RlID0gdGhpcy5fZ2V0Q2xvbmUobm9kZS5pbmRleClcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG5vZGUuX2luU2hvdykgeyAgLy8gaG9sZGVyID09PSBub2RlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBub2RlLl9pblNob3cgPSB0cnVlXG4gICAgICBjb25zdCB0cmFuc2xhdGVYID0gaW5kZXggKiB0aGlzLl93cmFwcGVyV2lkdGggLSB0aGlzLmlubmVyT2Zmc2V0XG4gICAgICB3ZWV4LnV0aWxzLmFkZFRyYW5zZm9ybShub2RlLCB7XG4gICAgICAgIHRyYW5zbGF0ZTogYHRyYW5zbGF0ZTNkKCR7dHJhbnNsYXRlWH1weCwgMHB4LCAwcHgpYFxuICAgICAgfSlcbiAgICAgIG5vZGUuc3R5bGUuekluZGV4ID0gOTkgLSBNYXRoLmFicyhpbmRleClcbiAgICAgIG5vZGUuc3R5bGUub3BhY2l0eSA9IDFcbiAgICAgIG5vZGUuX3Nob3dJbmRleCA9IGluZGV4XG4gICAgICB0aGlzLl9zaG93Tm9kZXNbaW5kZXhdID0gbm9kZVxuICAgIH0sXG5cbiAgICBfZ2V0Q2xvbmUgKGluZGV4KSB7XG4gICAgICBjb25zdCBhcnIgPSB0aGlzLl9jbG9uZXNbaW5kZXhdIHx8ICh0aGlzLl9jbG9uZXNbaW5kZXhdID0gW10pXG4gICAgICBjb25zdCBvcmlnTm9kZSA9IHRoaXMuX2NlbGxzW2luZGV4XS5lbG1cbiAgICAgIGNvbnN0IGNsb25lID0gb3JpZ05vZGUuY2xvbmVOb2RlKHRydWUpXG4gICAgICBjbG9uZS5faXNDbG9uZSA9IHRydWVcbiAgICAgIGNsb25lLl9pblNob3cgPSB0cnVlXG4gICAgICAvLyBjbG9uZS5faW5TaG93ID0gb3JpZ05vZGUuX2luU2hvd1xuICAgICAgY2xvbmUuaW5kZXggPSBvcmlnTm9kZS5pbmRleFxuICAgICAgY2xvbmUuc3R5bGUub3BhY2l0eSA9IDBcbiAgICAgIGNsb25lLnN0eWxlLnpJbmRleCA9IDBcbiAgICAgIHRoaXMuJHJlZnMuaW5uZXIuYXBwZW5kQ2hpbGQoY2xvbmUpXG4gICAgICBhcnIucHVzaChjbG9uZSlcbiAgICAgIHJldHVybiBjbG9uZVxuICAgICAgLy8gdHJ5IHtcbiAgICAgIC8vICAgbGV0IGFyciA9IHRoaXMuX2Nsb25lc1tpbmRleF1cbiAgICAgIC8vICAgaWYgKCFhcnIpIHtcbiAgICAgIC8vICAgICB0aGlzLl9jbG9uZXNbaW5kZXhdID0gYXJyID0gW11cbiAgICAgIC8vICAgfVxuICAgICAgLy8gICBpZiAoYXJyLmxlbmd0aCA8PSAwKSB7XG5cbiAgICAgIC8vICAgfVxuICAgICAgLy8gICByZXR1cm4gYXJyLnBvcCgpXG4gICAgICAvLyB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vICAgY29uc29sZS5lcnJvcigndGhpcy5fY2VsbHMgLT4gJywgdGhpcy5fY2VsbHMpXG4gICAgICAvLyB9XG4gICAgfSxcblxuICAgIF9yZW1vdmVDbG9uZSAobm9kZSkge1xuICAgICAgY29uc3QgY2xvbmVBcnIgPSB0aGlzLl9jbG9uZXNbbm9kZS5pbmRleF1cbiAgICAgIGxldCBpXG4gICAgICBpZiAoY2xvbmVBcnIgJiYgKGkgPSBjbG9uZUFyci5pbmRleE9mKG5vZGUpKSA+IC0xKSB7XG4gICAgICAgIGNsb25lQXJyLnNwbGljZShpLCAxKVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpXG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIG1heWJlIGNlbGxzIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoaXMgY2xvbmUgbm9kZSBpcyBhbHJlYWR5IHJlbW92ZWQgZnJvbSB0aGUgZG9tIHRyZWVcbiAgICAgICAgLy8gdGhyb3VnaHQgX2NsZWFyQ2xvbmVzIG1ldGhvZC5cbiAgICAgIH1cbiAgICAgIC8vIGNvbnN0IGlkeCA9IG5vZGUuaW5kZXhcbiAgICAgIC8vIHRoaXMuX2hpZGVOb2RlKG5vZGUpXG4gICAgICAvLyBjb25zdCBhcnIgPSB0aGlzLl9jbG9uZXNbaWR4XVxuICAgICAgLy8gYXJyLnB1c2gobm9kZSlcbiAgICB9LFxuXG4gICAgX2hpZGVOb2RlIChub2RlKSB7XG4gICAgICBub2RlLl9pblNob3cgPSBmYWxzZVxuICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gMFxuICAgICAgbm9kZS5zdHlsZS56SW5kZXggPSAwXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhpZGUgbm9kZXMgZnJvbSBiZWdpbiB0byBlbmQgaW4gc2hvd0FycmF5LlxuICAgICAqIGlmIGl0IGlzIGNsb25lIG5vZGUsIGp1c3QgbW92ZSB0aGUgY2xvbmUgbm9kZSB0byB0aGUgYnVmZmVyLlxuICAgICAqL1xuICAgIF9jbGVhck5vZGVzIChiZWdpbiwgZW5kKSB7XG4gICAgICBmb3IgKGxldCBpID0gYmVnaW47IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgICBpZiAoIW5vZGUpIHsgcmV0dXJuIH1cbiAgICAgICAgaWYgKG5vZGUuX2lzQ2xvbmUpIHtcbiAgICAgICAgICB0aGlzLl9yZW1vdmVDbG9uZShub2RlKVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFub2RlLl9pblNob3cpIHtcbiAgICAgICAgICB0aGlzLl9oaWRlTm9kZShub2RlKVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zaG93Tm9kZXNbaV1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY29weSBub2RlIHN0eWxlIHByb3BzIChvcGFjaXR5IGFuZCB6SW5kZXgpIGFuZCB0cmFuc2Zvcm0gc3RhdHVzIGZyb21cbiAgICAgKiBvbmUgZWxlbWVudCB0byBhbm90aGVyLlxuICAgICAqL1xuICAgIF9jb3B5U3R5bGUgKGZyb20sIHRvLCBzdHlsZXMgPSBbJ29wYWNpdHknLCAnekluZGV4J10sIHRyYW5zZm9ybUV4dHJhID0ge30pIHtcbiAgICAgIHdlZXgudXRpbHMuZXh0ZW5kS2V5cyh0by5zdHlsZSwgZnJvbS5zdHlsZSwgc3R5bGVzKVxuICAgICAgY29uc3QgdHJhbnNPYmogPSB3ZWV4LnV0aWxzLmdldFRyYW5zZm9ybU9iaihmcm9tKVxuICAgICAgZm9yIChjb25zdCBrIGluIHRyYW5zZm9ybUV4dHJhKSB7XG4gICAgICAgIHRyYW5zT2JqW2tdID0gdHJhbnNmb3JtRXh0cmFba11cbiAgICAgIH1cbiAgICAgIHdlZXgudXRpbHMuYWRkVHJhbnNmb3JtKHRvLCB0cmFuc09iailcbiAgICAgIGNvbnN0IGZyb21Jbm5lciA9IGZyb20uZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgIGNvbnN0IHRvSW5uZXIgPSB0by5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgdG9Jbm5lci5zdHlsZS5vcGFjaXR5ID0gZnJvbUlubmVyLnN0eWxlLm9wYWNpdHlcbiAgICAgIHdlZXgudXRpbHMuY29weVRyYW5zZm9ybShmcm9tSW5uZXIsIHRvSW5uZXIpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlcGxhY2UgYSBjbG9uZSBub2RlIHdpdGggdGhlIG9yaWdpbmFsIG5vZGUgaWYgaXQncyBub3QgaW4gdXNlLlxuICAgICAqL1xuICAgIF9yZXBsYWNlQ2xvbmUgKGNsb25lLCBwb3MpIHtcbiAgICAgIGNvbnN0IG9yaWdDZWxsID0gdGhpcy5fY2VsbHNbY2xvbmUuaW5kZXhdXG4gICAgICBpZiAoIW9yaWdDZWxsKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3Qgb3JpZ05vZGUgPSBvcmlnQ2VsbC5lbG1cbiAgICAgIGlmIChvcmlnTm9kZS5faW5TaG93KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3Qgb3JpZ1Nob3dJbmRleCA9IG9yaWdOb2RlLl9zaG93SW5kZXhcbiAgICAgIGNvbnN0IHN0eWxlUHJvcHMgPSBbJ29wYWNpdHknLCAnekluZGV4J11cbiAgICAgIGxldCBjbFxuICAgICAgaWYgKE1hdGguYWJzKG9yaWdTaG93SW5kZXgpIDw9IDEpIHtcbiAgICAgICAgLy8gbGVhdmUgYSBjbG9uZSB0byByZXBsYWNlIHRoZSBvcmlnTm9kZSBpbiB0aGUgc2hvdyB6b25lKC0xIH4gMSkuXG4gICAgICAgIGNsID0gdGhpcy5fZ2V0Q2xvbmUob3JpZ05vZGUuaW5kZXgpXG4gICAgICAgIHRoaXMuX2NvcHlTdHlsZShvcmlnTm9kZSwgY2wpXG4gICAgICAgIHRoaXMuX3Nob3dOb2Rlc1tvcmlnU2hvd0luZGV4XSA9IGNsXG4gICAgICB9XG4gICAgICBvcmlnTm9kZS5faW5TaG93ID0gdHJ1ZVxuICAgICAgY29uc3QgdHJhbnNPYmogPSB3ZWV4LnV0aWxzLmdldFRyYW5zZm9ybU9iaihjbG9uZSlcbiAgICAgIHRyYW5zT2JqLnRyYW5zbGF0ZSA9IHRyYW5zT2JqLnRyYW5zbGF0ZS5yZXBsYWNlKC9bKy1cXGQuXStbcHddeC8sICgkMCkgPT4ge1xuICAgICAgICByZXR1cm4gcG9zICogdGhpcy5fd3JhcHBlcldpZHRoIC0gdGhpcy5pbm5lck9mZnNldCArICdweCdcbiAgICAgIH0pXG4gICAgICB0aGlzLl9jb3B5U3R5bGUoY2xvbmUsIG9yaWdOb2RlLCBzdHlsZVByb3BzLCB0cmFuc09iailcbiAgICAgIHRoaXMuX3JlbW92ZUNsb25lKGNsb25lKVxuICAgICAgaWYgKCFjbCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fc2hvd05vZGVzW29yaWdTaG93SW5kZXhdXG4gICAgICB9XG4gICAgICB0aGlzLl9zaG93Tm9kZXNbcG9zXSA9IG9yaWdOb2RlXG4gICAgICBvcmlnTm9kZS5fc2hvd0luZGV4ID0gcG9zXG4gICAgfSxcblxuICAgIF9yZWFycmFuZ2VOb2RlcyAobmV3SW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLmZyYW1lQ291bnQgPD0gMSkge1xuICAgICAgICB0aGlzLl9zbGlkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAwXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBjbGVhciBhdXRvUGxheSB0aW1lciAoYW5kIHJlc3RhcnQgYWZ0ZXIgdXBkYXRlZCBob29rKS5cbiAgICAgIHRoaXMuX3N0YXJ0QXV0b1BsYXkoKVxuXG4gICAgICAvKipcbiAgICAgICAqIGNsZWFuIG5vZGVzLiByZXBsYWNlIGN1cnJlbnQgbm9kZSB3aXRoIG5vbi1jbG9uZWQgbm9kZS5cbiAgICAgICAqIHNldCBjdXJyZW50IGluZGV4IHRvIHRoZSBuZXcgaW5kZXguXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHNob3dzID0gdGhpcy5fc2hvd05vZGVzXG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5fc2hvd1N0YXJ0SWR4OyBpIDw9IHRoaXMuX3Nob3dFbmRJZHg7IGkrKykge1xuICAgICAgICBzaG93c1tpXS5faW5TaG93ID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAtMTsgaSA8PSAxOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHNob3dzW2ldXG4gICAgICAgIGlmICghbm9kZS5faXNDbG9uZSkge1xuICAgICAgICAgIG5vZGUuX2luU2hvdyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9yZXBsYWNlQ2xvbmUobm9kZSwgaSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbGVhck5vZGVzKHRoaXMuX3Nob3dTdGFydElkeCwgLTIpXG4gICAgICB0aGlzLl9zaG93U3RhcnRJZHggPSAtMVxuICAgICAgdGhpcy5fY2xlYXJOb2RlcygyLCB0aGlzLl9zaG93RW5kSWR4KVxuICAgICAgdGhpcy5fc2hvd0VuZElkeCA9IDFcbiAgICAgIHRoaXMuX3NsaWRpbmcgPSBmYWxzZVxuXG4gICAgICAvLyBzZXQgY3VycmVudCBpbmRleCB0byB0aGUgbmV3IGluZGV4LlxuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBuZXdJbmRleFxuICAgICAgdGhpcy5fcHJlSW5kZXggPSBuZXdJbmRleFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGF0dHJzOiBuZWlnaGJvclNjYWxlLCBuZWlnaGJvckFscGhhLCBuZWlnaGJvclNwYWNlLlxuICAgICAqIDEuIGFwcGx5IHRoZSBtYWluIGNlbGwgdHJhbnNmb3JtIGVmZmVjdHMuXG4gICAgICogMi4gc2V0IHRoZSBwcmV2aW91cyBjZWxsIGFuZCB0aGUgbmV4dCBjZWxsJ3MgcG9zaXRvbiwgc2NhbGUgYW5kIGFscGhhLlxuICAgICAqIDMuIHNldCBvdGhlciBjZWxscycgc2NhbGUgYW5kIGFscGhhLlxuICAgICAqL1xuICAgIF9zZXROZWlnaGJvcnMgKCkge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3Nob3dTdGFydElkeDsgaSA8PSB0aGlzLl9zaG93RW5kSWR4OyBpKyspIHtcbiAgICAgICAgY29uc3QgZWxtID0gdGhpcy5fc2hvd05vZGVzW2ldLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgIGVsbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gYGFsbCAke05FSUdIQk9SX1NDQUxFX1RJTUUgLyAxMDAwfXMgZWFzZWBcbiAgICAgICAgZWxtLnN0eWxlLm1velRyYW5zaXRpb24gPSBgYWxsICR7TkVJR0hCT1JfU0NBTEVfVElNRSAvIDEwMDB9cyBlYXNlYFxuICAgICAgICBlbG0uc3R5bGUudHJhbnNpdGlvbiA9IGBhbGwgJHtORUlHSEJPUl9TQ0FMRV9USU1FIC8gMTAwMH1zIGVhc2VgXG4gICAgICAgIGNvbnN0IHRyYW5zT2JqID0ge1xuICAgICAgICAgIHNjYWxlOiBgc2NhbGUoJHtpID09PSAwID8gdGhpcy5jdXJyZW50SXRlbVNjYWxlIDogdGhpcy5uZWlnaGJvclNjYWxlfSlgXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyYW5zbGF0ZVhcbiAgICAgICAgaWYgKCF0aGlzLl9uZWlnaGJvcldpZHRoKSB7XG4gICAgICAgICAgdGhpcy5fbmVpZ2hib3JXaWR0aCA9IHBhcnNlRmxvYXQoZWxtLnN0eWxlLndpZHRoKSB8fCBlbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgICAgICAgfVxuICAgICAgICAvLyBjYWxjdWxhdGUgcG9zaXRpb24gb2Zmc2V0cyBhY2NvcmRpbmcgdG8gbmVpZ2hib3Igc2NhbGVzLlxuICAgICAgICBpZiAoTWF0aC5hYnMoaSkgPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBkaXN0ID0gKCh0aGlzLl93cmFwcGVyV2lkdGggLSB0aGlzLl9uZWlnaGJvcldpZHRoICogdGhpcy5uZWlnaGJvclNjYWxlKSAvIDJcbiAgICAgICAgICAgICsgdGhpcy5uZWlnaGJvclNwYWNlICogd2VleC5jb25maWcuZW52LnNjYWxlKSAvIHRoaXMubmVpZ2hib3JTY2FsZVxuICAgICAgICAgIHRyYW5zbGF0ZVggPSAtaSAqIGRpc3RcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBjbGVhciBwb3NpdGlvbiBvZmZzZXRzLlxuICAgICAgICAgIHRyYW5zbGF0ZVggPSAwXG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNPYmoudHJhbnNsYXRlID0gYHRyYW5zbGF0ZTNkKCR7dHJhbnNsYXRlWH1weCwgMHB4LCAwcHgpYFxuICAgICAgICB3ZWV4LnV0aWxzLmFkZFRyYW5zZm9ybShlbG0sIHRyYW5zT2JqKVxuICAgICAgICBlbG0uc3R5bGUub3BhY2l0eSA9IGkgPT09IDAgPyBNQUlOX1NMSURFX09QQUNJVFkgOiB0aGlzLm5laWdoYm9yQWxwaGFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX25leHQgKCkge1xuICAgICAgbGV0IG5leHQgPSB0aGlzLmN1cnJlbnRJbmRleCArIDFcbiAgICAgIGlmICh0aGlzLmZyYW1lQ291bnQgPD0gMSkge1xuICAgICAgICBuZXh0LS1cbiAgICAgIH1cbiAgICAgIHRoaXMuX3NsaWRlVG8obmV4dClcbiAgICB9LFxuXG4gICAgX3ByZXYgKCkge1xuICAgICAgbGV0IHByZXYgPSB0aGlzLmN1cnJlbnRJbmRleCAtIDFcbiAgICAgIGlmICh0aGlzLmZyYW1lQ291bnQgPD0gMSkge1xuICAgICAgICBwcmV2KytcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NsaWRlVG8ocHJldilcbiAgICB9LFxuXG4gICAgX2hhbmRsZVRvdWNoU3RhcnQgKGV2ZW50KSB7XG4gICAgICBjb25zdCB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICB0aGlzLl9zdG9wQXV0b1BsYXkoKVxuICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLiRyZWZzLmlubmVyXG4gICAgICB0aGlzLl90b3VjaFBhcmFtcyA9IHtcbiAgICAgICAgb3JpZ2luYWxUcmFuc2Zvcm06IGlubmVyLnN0eWxlLndlYmtpdFRyYW5zZm9ybVxuICAgICAgICAgIHx8IGlubmVyLnN0eWxlLm1velRyYW5zZm9ybVxuICAgICAgICAgIHx8IGlubmVyLnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgc3RhcnRUb3VjaEV2ZW50OiB0b3VjaCxcbiAgICAgICAgc3RhcnRYOiB0b3VjaC5wYWdlWCxcbiAgICAgICAgc3RhcnRZOiB0b3VjaC5wYWdlWSxcbiAgICAgICAgdGltZVN0YW1wOiBldmVudC50aW1lU3RhbXBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2hhbmRsZVRvdWNoTW92ZSAoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHRwID0gdGhpcy5fdG91Y2hQYXJhbXNcbiAgICAgIGlmICghdHApIHsgcmV0dXJuIH1cbiAgICAgIGlmICh0aGlzLl9zbGlkaW5nKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3Z1ZS1yZW5kZXJdIHdhcm46IGNhbid0IHNjcm9sbCB0aGUgc2xpZGVyIGR1cmluZyBzbGlkaW5nLmApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCB7IHN0YXJ0WCwgc3RhcnRZIH0gPSB0aGlzLl90b3VjaFBhcmFtc1xuICAgICAgY29uc3QgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgY29uc3Qgb2Zmc2V0WCA9IHRvdWNoLnBhZ2VYIC0gc3RhcnRYXG4gICAgICBjb25zdCBvZmZzZXRZID0gdG91Y2gucGFnZVkgLSBzdGFydFlcbiAgICAgIHRwLm9mZnNldFggPSBvZmZzZXRYXG4gICAgICB0cC5vZmZzZXRZID0gb2Zmc2V0WVxuICAgICAgbGV0IGlzViA9IHRwLmlzVmVydGljYWxcbiAgICAgIGlmICh0eXBlb2YgaXNWID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpc1YgPSB0cC5pc1ZlcnRpY2FsID0gTWF0aC5hYnMob2Zmc2V0WCkgPCBNYXRoLmFicyhvZmZzZXRZKVxuICAgICAgICBpZiAoIWlzVikge1xuICAgICAgICAgIHRoaXMuX2VtaXRTY3JvbGxFdmVudCgnc2Nyb2xsc3RhcnQnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB2ZXJ0aWNhbCBzY3JvbGwuIGp1c3QgaWdub3JlIGl0LlxuICAgICAgaWYgKGlzVikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIGhvcml6b250YWwgc2Nyb2xsLiB0cmlnZ2VyIHNjcm9sbCBldmVudC5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgaWYgKGlubmVyICYmIG9mZnNldFgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9ub2Rlc09mZnNldENsZWFyZWQpIHtcbiAgICAgICAgICB0aGlzLl9ub2Rlc09mZnNldENsZWFyZWQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5fY2xlYXJOb2Rlc09mZnNldCgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdFNjcm9sbEV2ZW50KCd3ZWV4JHNjcm9sbCcsIHtcbiAgICAgICAgICBvZmZzZXRYUmF0aW86IG9mZnNldFggLyB0aGlzLl93cmFwcGVyV2lkdGhcbiAgICAgICAgfSlcbiAgICAgICAgaW5uZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7dGhpcy5pbm5lck9mZnNldCArIG9mZnNldFh9cHgsIDAsIDApYFxuICAgICAgICBpbm5lci5zdHlsZS5tb3pUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt0aGlzLmlubmVyT2Zmc2V0ICsgb2Zmc2V0WH1weCwgMCwgMClgXG4gICAgICAgIGlubmVyLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3RoaXMuaW5uZXJPZmZzZXQgKyBvZmZzZXRYfXB4LCAwLCAwKWBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2hhbmRsZVRvdWNoRW5kIChldmVudCkge1xuICAgICAgdGhpcy5fc3RhcnRBdXRvUGxheSgpXG4gICAgICBjb25zdCB0cCA9IHRoaXMuX3RvdWNoUGFyYW1zXG4gICAgICBpZiAoIXRwKSB7IHJldHVybiB9XG4gICAgICBjb25zdCBpc1YgPSB0cC5pc1ZlcnRpY2FsXG4gICAgICBpZiAodHlwZW9mIGlzViA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lciA9IHRoaXMuJHJlZnMuaW5uZXJcbiAgICAgIGNvbnN0IHsgb2Zmc2V0WCB9ID0gdHBcbiAgICAgIGlmIChpbm5lcikge1xuICAgICAgICB0aGlzLl9ub2Rlc09mZnNldENsZWFyZWQgPSBmYWxzZVxuICAgICAgICAvLyBUT0RPOiB0ZXN0IHRoZSB2ZWxvY2l0eSBpZiBpdCdzIGxlc3MgdGhhbiAwLjIuXG4gICAgICAgIGNvbnN0IHJlc2V0ID0gTWF0aC5hYnMob2Zmc2V0WCAvIHRoaXMuX3dyYXBwZXJXaWR0aCkgPCAwLjJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gb2Zmc2V0WCA+IDAgPyAxIDogLTFcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSByZXNldCA/IHRoaXMuY3VycmVudEluZGV4IDogKHRoaXMuY3VycmVudEluZGV4IC0gZGlyZWN0aW9uKVxuICAgICAgICB0aGlzLl9zbGlkZVRvKG5ld0luZGV4LCB0cnVlKVxuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXMuX3RvdWNoUGFyYW1zXG4gICAgfSxcblxuICAgIF9oYW5kbGVUb3VjaENhbmNlbCAoZXZlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVUb3VjaEVuZChldmVudClcbiAgICB9LFxuXG4gICAgX2VtaXRTY3JvbGxFdmVudCAodHlwZSwgZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgd2VleC51dGlscy5kaXNwYXRjaE5hdGl2ZUV2ZW50KGVsLCB0eXBlLCBkYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfdGhyb3R0bGVFbWl0U2Nyb2xsIChvZmZzZXQsIGNhbGxiYWNrKSB7XG4gICAgICBsZXQgaSA9IDBcbiAgICAgIGNvbnN0IHRocm90dGxlVGltZSA9IFRIUk9UVExFX1NDUk9MTF9USU1FXG4gICAgICBjb25zdCBjbnQgPSBwYXJzZUludChUUkFOU0lUSU9OX1RJTUUgLyB0aHJvdHRsZVRpbWUpIC0gMVxuICAgICAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyAxIDogLTFcbiAgICAgIGNvbnN0IHIgPSBNYXRoLmFicyhvZmZzZXQgLyB0aGlzLl93cmFwcGVyV2lkdGgpXG4gICAgICBjb25zdCB0aHJvdHRsZWRTY3JvbGwgPSAoKSA9PiB7XG4gICAgICAgIGlmICgrK2kgPiBjbnQpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2suY2FsbCh0aGlzKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhdGlvID0gdGhpcy5fc3RlcCA9PT0gMFxuICAgICAgICAgID8gc2lnbiAqIHIgKiAoMSAtIGkgLyBjbnQpXG4gICAgICAgICAgOiBzaWduICogKHIgKyAoMSAtIHIpICogaSAvIGNudClcbiAgICAgICAgdGhpcy5fZW1pdFNjcm9sbEV2ZW50KCd3ZWV4JHNjcm9sbCcsIHtcbiAgICAgICAgICBvZmZzZXRYUmF0aW86IHJhdGlvXG4gICAgICAgIH0pXG4gICAgICAgIHNldFRpbWVvdXQodGhyb3R0bGVkU2Nyb2xsLCBUSFJPVFRMRV9TQ1JPTExfVElNRSlcbiAgICAgIH1cbiAgICAgIHRocm90dGxlZFNjcm9sbCgpXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIGltcG9ydCB7IHZhbGlkYXRlU3R5bGVzIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9yJ1xuLy8gaW1wb3J0IGluZGljYXRvciBmcm9tICcuL2luZGljYXRvcidcbmltcG9ydCBzbGlkZU1peGluIGZyb20gJy4vc2xpZGVNaXhpbidcblxuY29uc3Qgc2xpZGVyID0ge1xuICBtaXhpbnM6IFtzbGlkZU1peGluXSxcbiAgcHJvcHM6IHtcbiAgICBpbmRleDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgICdhdXRvLXBsYXknOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBpbnRlcnZhbDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDMwMDBcbiAgICB9LFxuICAgIGluZmluaXRlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBpbmRleCAoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuX25vcm1hbGl6ZUluZGV4KHRoaXMuaW5kZXgpXG4gICAgfVxuICB9LFxuXG4gIGRhdGEgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmcmFtZUNvdW50OiAwLFxuICAgICAgY3VycmVudEluZGV4OiB0aGlzLmluZGV4XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgdGhpcy53ZWV4VHlwZSA9ICdzbGlkZXInXG4gIH0sXG5cbiAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAvLyAgIHZhbGlkYXRlU3R5bGVzKCdzbGlkZXInLCB0aGlzLiR2bm9kZS5kYXRhICYmIHRoaXMuJHZub2RlLmRhdGEuc3RhdGljU3R5bGUpXG4gICAgLy8gfVxuICAgIHJldHVybiB0aGlzLl9yZW5kZXJTbGlkZXMoY3JlYXRlRWxlbWVudClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdzbGlkZXInLCBzbGlkZXIpXG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnY3ljbGVzbGlkZXInLCBzbGlkZXIpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHNsaWRlTWl4aW4gZnJvbSAnLi9zbGlkZU1peGluJ1xuXG5jb25zdCBERUZBVUxUX05FSUdIQk9SX1NQQUNFID0gMjBcbmNvbnN0IERFRkFVTFRfTkVJR0hCT1JfQUxQSEEgPSAwLjZcbmNvbnN0IERFRkFVTFRfTkVJR0hCT1JfU0NBTEUgPSAwLjhcbmNvbnN0IERFRkFVTFRfQ1VSUkVOVF9JVEVNX1NDQUxFID0gMC45XG5cbmNvbnN0IHNsaWRlck5laWdoYm9yID0ge1xuICBtaXhpbnM6IFtzbGlkZU1peGluXSxcbiAgcHJvcHM6IHtcbiAgICBpbmRleDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIGF1dG9QbGF5OiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBpbnRlcnZhbDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDMwMDBcbiAgICB9LFxuICAgIGluZmluaXRlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIG5laWdoYm9yU3BhY2U6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPiAwXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9ORUlHSEJPUl9TUEFDRVxuICAgIH0sXG4gICAgbmVpZ2hib3JBbHBoYToge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+PSAwICYmIHZhbCA8PSAxXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9ORUlHSEJPUl9BTFBIQVxuICAgIH0sXG4gICAgbmVpZ2hib3JTY2FsZToge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+PSAwICYmIHZhbCA8PSAxXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9ORUlHSEJPUl9TQ0FMRVxuICAgIH0sXG4gICAgY3VycmVudEl0ZW1TY2FsZToge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+PSAwICYmIHZhbCA8PSAxXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9DVVJSRU5UX0lURU1fU0NBTEVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBpbmRleCAoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuX25vcm1hbGl6ZUluZGV4KHRoaXMuaW5kZXgpXG4gICAgfVxuICB9LFxuXG4gIGRhdGEgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50SW5kZXg6IHRoaXMuaW5kZXgsXG4gICAgICBmcmFtZUNvdW50OiAwXG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgdGhpcy5pc05laWdoYm9yID0gdHJ1ZVxuICAgIHRoaXMud2VleFR5cGUgPSAnc2xpZGVyLW5laWdoYm9yJ1xuICB9LFxuXG4gIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJTbGlkZXMoY3JlYXRlRWxlbWVudClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdzbGlkZXItbmVpZ2hib3InLCBzbGlkZXJOZWlnaGJvcilcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmxldCBnZXRDb21wb25lbnRJbmxpbmVTdHlsZVxuXG5mdW5jdGlvbiBnZXRJbmRpY2F0b3JJdGVtU3R5bGUgKG1zLCBpc0FjdGl2ZSkge1xuICBjb25zdCBzdHlsZSA9IHt9XG4gIGNvbnN0IGJnQ29sb3IgPSBpc0FjdGl2ZVxuICAgID8gbXNbJ2l0ZW1TZWxlY3RlZENvbG9yJ10gfHwgbXNbJ2l0ZW0tc2VsZWN0ZWQtY29sb3InXVxuICAgIDogbXNbJ2l0ZW1Db2xvciddIHx8IG1zWydpdGVtLWNvbG9yJ11cbiAgc3R5bGVbJ2JhY2tncm91bmQtY29sb3InXSA9IGJnQ29sb3JcbiAgc3R5bGVbJ3dpZHRoJ10gPSBzdHlsZVsnaGVpZ2h0J10gPSBtc1snaXRlbVNpemUnXSB8fCBtc1snaXRlbS1zaXplJ11cbiAgcmV0dXJuIHN0eWxlXG59XG5cbmZ1bmN0aW9uIGdldFNjb3BlSWRzIChjb250ZXh0KSB7XG4gIGxldCBzY29wZUlkcyA9IGNvbnRleHQuX3Njb3BlSWRzXG4gIGlmIChzY29wZUlkcykge1xuICAgIHJldHVybiBzY29wZUlkc1xuICB9XG4gIGVsc2Uge1xuICAgIHNjb3BlSWRzID0gW11cbiAgfVxuICBsZXQgcGFyZW50ID0gY29udGV4dC4kcGFyZW50XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBsZXQgaVxuICAgIGlmICgoaSA9IHBhcmVudC4kb3B0aW9ucykgJiYgKGkgPSBpLl9zY29wZUlkKSkge1xuICAgICAgc2NvcGVJZHMucHVzaChpKVxuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudFxuICB9XG4gIGNvbnRleHQuX3Njb3BlSWRzID0gc2NvcGVJZHNcbiAgcmV0dXJuIHNjb3BlSWRzXG59XG5cbmZ1bmN0aW9uIF9yZW5kZXIgKGNvbnRleHQsIGgpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBjb25zdCBtZXJnZWRTdHlsZSA9IGdldENvbXBvbmVudElubGluZVN0eWxlKGNvbnRleHQpXG4gIGNvbnN0IHNjb3BlSWRzID0gZ2V0U2NvcGVJZHMoY29udGV4dClcbiAgY29uc3QgYXR0cnMgPSB7fVxuICBmb3IgKGxldCBpID0gMCwgbCA9IHNjb3BlSWRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGF0dHJzW3Njb3BlSWRzW2ldXSA9ICcnXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBOdW1iZXIoY29udGV4dC5jb3VudCk7ICsraSkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbJ3dlZXgtaW5kaWNhdG9yLWl0ZW0gd2VleC1lbCddXG4gICAgbGV0IGlzQWN0aXZlID0gZmFsc2VcbiAgICBpZiAoaSA9PT0gTnVtYmVyKGNvbnRleHQuYWN0aXZlKSkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCd3ZWV4LWluZGljYXRvci1pdGVtLWFjdGl2ZScpXG4gICAgICBpc0FjdGl2ZSA9IHRydWVcbiAgICB9XG4gICAgY2hpbGRyZW4ucHVzaChoKCdtYXJrJywge1xuICAgICAgYXR0cnMsXG4gICAgICBzdGF0aWNDbGFzczogY2xhc3NOYW1lcy5qb2luKCcgJyksXG4gICAgICBzdGF0aWNTdHlsZTogZ2V0SW5kaWNhdG9ySXRlbVN0eWxlKG1lcmdlZFN0eWxlLCBpc0FjdGl2ZSlcbiAgICB9KSlcbiAgfVxuICByZXR1cm4gaCgnbmF2Jywge1xuICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiAnaW5kaWNhdG9yJyB9LFxuICAgIHN0YXRpY0NsYXNzOiAnd2VleC1pbmRpY2F0b3Igd2VleC1jdCdcbiAgfSwgW1xuICAgIC8vIHRoZSBpbmRpY2F0b3IgbmF2IG1heSBjb3ZlciB0aGUgc2xpZGVzLCBhbmQgbWF5IHN0b3AgdGhlXG4gICAgLy8gY2xpY2sgZXZlbnQgYmUgdHJpZ2dlcmVkIG9uIHRoZSBzbGlkZXMuXG4gICAgLy8gc28gYSBzbWFsbGVyIHdyYXBwZXIgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIG92ZXJsYXAuXG4gICAgLy8gVGhpcyB3cmFwcGVyIHdpbGwgY292ZXIgb25seSB0aGUgd2hvbGUgc2l6ZSBvZiBhbGwgdGhlXG4gICAgLy8gaW5kaWNhdG9yIHBvaW50ZXJzJyBpdGVtLXNpemVzLlxuICAgIGgoJ2RpdicsIHtcbiAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1pbmRpY2F0b3ItaW5uZXInXG4gICAgfSwgY2hpbGRyZW4pXG4gIF0pXG59XG5cbmNvbnN0IGluZGljYXRvciA9IHtcbiAgbmFtZTogJ3dlZXgtaW5kaWNhdG9yJyxcbiAgbWV0aG9kczoge1xuICAgIHNob3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuJGVsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSdcbiAgICB9XG4gIH0sXG4gIHByb3BzOiB7XG4gICAgaXRlbUNvbG9yOiBbU3RyaW5nXSxcbiAgICBpdGVtU2VsZWN0ZWRDb2xvcjogW1N0cmluZ10sXG4gICAgaXRlbVNpemU6IFtTdHJpbmddXG4gIH0sXG4gIGRhdGEgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogMCxcbiAgICAgIGFjdGl2ZTogMFxuICAgIH1cbiAgfSxcbiAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgY29uc3QgeyBjb3VudCwgYWN0aXZlIH0gPSB0aGlzLiR2bm9kZS5kYXRhLmF0dHJzIHx8IHt9XG4gICAgdGhpcy5jb3VudCA9IGNvdW50XG4gICAgdGhpcy5hY3RpdmUgPSBhY3RpdmVcbiAgICBpZiAoIXRoaXMuY291bnQpIHsgcmV0dXJuIH1cbiAgICByZXR1cm4gX3JlbmRlcih0aGlzLCBjcmVhdGVFbGVtZW50KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIGdldENvbXBvbmVudElubGluZVN0eWxlID0gd2VleC5nZXRDb21wb25lbnRJbmxpbmVTdHlsZVxuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2luZGljYXRvcicsIGluZGljYXRvcilcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBzbGlkZXIgZnJvbSAnLi9zbGlkZXInXG5pbXBvcnQgbmVpZ2hib3IgZnJvbSAnLi9zbGlkZXItbmVpZ2hib3InXG5pbXBvcnQgaW5kaWNhdG9yIGZyb20gJy4vaW5kaWNhdG9yJ1xuaW1wb3J0ICcuL3N0eWxlLmNzcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5pbnN0YWxsKHNsaWRlcilcbiAgICB3ZWV4Lmluc3RhbGwobmVpZ2hib3IpXG4gICAgd2VleC5pbnN0YWxsKGluZGljYXRvcilcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgJy4vc3R5bGUuY3NzJ1xuXG5mdW5jdGlvbiBnZXRUZXh0YXJlYSAod2VleCkge1xuICBjb25zdCB7IGV4dHJhY3RDb21wb25lbnRTdHlsZSB9ID0gd2VleFxuICBjb25zdCB7IGlucHV0Q29tbW9uIH0gPSB3ZWV4Lm1peGluc1xuICBjb25zdCB7IGV4dGVuZCwgbWFwRm9ybUV2ZW50cyB9ID0gd2VleC51dGlsc1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtdGV4dGFyZWEnLFxuICAgIG1peGluczogW2lucHV0Q29tbW9uXSxcbiAgICBwcm9wczoge1xuICAgICAgdmFsdWU6IFN0cmluZyxcbiAgICAgIHBsYWNlaG9sZGVyOiBTdHJpbmcsXG4gICAgICBkaXNhYmxlZDoge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBhdXRvZm9jdXM6IHtcbiAgICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgcm93czoge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgICBkZWZhdWx0OiAyXG4gICAgICB9LFxuICAgICAgcmV0dXJuS2V5VHlwZTogU3RyaW5nXG4gICAgfSxcblxuICAgIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgLy8gICB2YWxpZGF0ZVN0eWxlcygndGV4dGFyZWEnLCB0aGlzLiR2bm9kZS5kYXRhICYmIHRoaXMuJHZub2RlLmRhdGEuc3RhdGljU3R5bGUpXG4gICAgICAvLyB9XG4gICAgICBjb25zdCBldmVudHMgPSBleHRlbmQobWFwRm9ybUV2ZW50cyh0aGlzKSlcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdodG1sOnRleHRhcmVhJywge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICd3ZWV4LXR5cGUnOiAndGV4dGFyZWEnLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICAgIGRpc2FibGVkOiAodGhpcy5kaXNhYmxlZCAhPT0gJ2ZhbHNlJyAmJiB0aGlzLmRpc2FibGVkICE9PSBmYWxzZSksXG4gICAgICAgICAgYXV0b2ZvY3VzOiAodGhpcy5hdXRvZm9jdXMgIT09ICdmYWxzZScgJiYgdGhpcy5hdXRvZm9jdXMgIT09IGZhbHNlKSxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy5wbGFjZWhvbGRlcixcbiAgICAgICAgICByb3dzOiB0aGlzLnJvd3MsXG4gICAgICAgICAgJ3JldHVybi1rZXktdHlwZSc6IHRoaXMucmV0dXJuS2V5VHlwZVxuICAgICAgICB9LFxuICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIG9uOiB0aGlzLmNyZWF0ZUtleWJvYXJkRXZlbnQoZXZlbnRzKSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXRleHRhcmVhIHdlZXgtZWwnLFxuICAgICAgICBzdGF0aWNTdHlsZTogZXh0cmFjdENvbXBvbmVudFN0eWxlKHRoaXMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd0ZXh0YXJlYScsIGdldFRleHRhcmVhKHdlZXgpKVxuICB9XG59XG4iLCIvKlxuKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4qIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuKiB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmZ1bmN0aW9uIGdldFZpZGVvICh3ZWV4KSB7XG4gIGNvbnN0IHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGUsXG4gICAgbWFwTmF0aXZlRXZlbnRzXG4gIH0gPSB3ZWV4XG4gIGNvbnN0IHsgZGlzcGF0Y2hOYXRpdmVFdmVudCB9ID0gd2VleC51dGlsc1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtdmlkZW8nLFxuICAgIHByb3BzOiB7XG4gICAgICBzcmM6IFN0cmluZyxcbiAgICAgIHBsYXlTdGF0dXM6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBkZWZhdWx0OiAncGF1c2UnLFxuICAgICAgICB2YWxpZGF0b3IgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIFsncGxheScsICdwYXVzZSddLmluZGV4T2YodmFsdWUpICE9PSAtMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXV0b3BsYXk6IHtcbiAgICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgYXV0b1BsYXk6IHtcbiAgICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgcGxheXNpbmxpbmU6IHtcbiAgICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICAgIH0sXG4gICAgICBjb250cm9sczoge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5wbGF5U3RhdHVzID09PSAncGxheScpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLiRlbCAmJiB0aGlzLiRlbC5wbGF5KClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZGlzcGF0Y2hOYXRpdmVFdmVudCh0aGlzICYmIHRoaXMuJGVsLCAnZXJyb3InLCB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHRoaXMucGxheVN0YXR1cyA9PT0gJ3BhdXNlJykge1xuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy4kZWwgJiYgdGhpcy4kZWwucGF1c2UoKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnaHRtbDp2aWRlbycsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAnd2VleC10eXBlJzogJ3ZpZGVvJyxcbiAgICAgICAgICBhdXRvcGxheTogKCh0aGlzLmF1dG9wbGF5ICE9PSAnZmFsc2UnICYmIHRoaXMuYXV0b3BsYXkgIT09IGZhbHNlKVxuICAgICAgICAgICAgfHwgKHRoaXMuYXV0b1BsYXkgIT09ICdmYWxzZScgJiYgdGhpcy5hdXRvUGxheSAhPT0gZmFsc2UpKSxcbiAgICAgICAgICAnd2Via2l0LXBsYXlzaW5saW5lJzogdGhpcy5wbGF5c2lubGluZSxcbiAgICAgICAgICBjb250cm9sczogdGhpcy5jb250cm9scyxcbiAgICAgICAgICBzcmM6IHRoaXMuc3JjXG4gICAgICAgIH0sXG4gICAgICAgIG9uOiBtYXBOYXRpdmVFdmVudHModGhpcywge1xuICAgICAgICAgIHBsYXk6ICdzdGFydCcsXG4gICAgICAgICAgZXJyb3I6ICdmYWlsJ1xuICAgICAgICB9KSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXZpZGVvIHdlZXgtZWwnLFxuICAgICAgICBzdGF0aWNTdHlsZTogZXh0cmFjdENvbXBvbmVudFN0eWxlKHRoaXMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd2aWRlbycsIGdldFZpZGVvKHdlZXgpKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCAnLi9zdHlsZS5jc3MnXG5cbmZ1bmN0aW9uIGdldFdlYiAod2VleCkge1xuICBjb25zdCB7IGV4dHJhY3RDb21wb25lbnRTdHlsZSB9ID0gd2VleFxuICBjb25zdCB7IGRpc3BhdGNoTmF0aXZlRXZlbnQgfSA9IHdlZXgudXRpbHNcblxuICByZXR1cm4ge1xuICAgIGRhdGEgKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFNyYzogJydcbiAgICAgIH1cbiAgICB9LFxuICAgIG5hbWU6ICd3ZWV4LXdlYicsXG4gICAgcHJvcHM6IHtcbiAgICAgIHNyYzogU3RyaW5nXG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgc3JjIChuZXdWYWwpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3JjID0gbmV3VmFsXG4gICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICBnb0JhY2sgKCkge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgIGNvbnN0IHdpbiA9IGVsLmNvbnRlbnRXaW5kb3dcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luLmhpc3RvcnkuYmFjaygpXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTcmMgPSB3aW4ubG9jYXRpb24uaHJlZlxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkaXNwYXRjaE5hdGl2ZUV2ZW50KGVsLCAnZXJyb3InLCBlcnIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ29Gb3J3YXJkICgpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICBjb25zdCB3aW4gPSBlbC5jb250ZW50V2luZG93XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdpbi5oaXN0b3J5LmZvcndhcmQoKVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3JjID0gd2luLmxvY2F0aW9uLmhyZWZcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZGlzcGF0Y2hOYXRpdmVFdmVudChlbCwgJ2Vycm9yJywgZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlbG9hZCAoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy4kZWxcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVsLmNvbnRlbnRXaW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgICAgICAgIGRpc3BhdGNoTmF0aXZlRXZlbnQoZWwsICdwYWdlc3RhcnQnLCB7IHVybDogdGhpcy5jdXJyZW50U3JjIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTmF0aXZlRXZlbnQoZWwsICdlcnJvcicsIGVycilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3JlYXRlZCAoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTcmMgPSB0aGlzLnNyY1xuICAgIH0sXG5cbiAgICBtb3VudGVkICgpIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy4kZWxcbiAgICAgIHRoaXMuX3ByZXZTcmMgPSB0aGlzLmN1cnJlbnRTcmNcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBkaXNwYXRjaE5hdGl2ZUV2ZW50KGVsLCAncGFnZXN0YXJ0JywgeyB1cmw6IHRoaXMuY3VycmVudFNyYyB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVkICgpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTcmMgIT09IHRoaXMuX3ByZXZTcmMpIHtcbiAgICAgICAgdGhpcy5fcHJldlNyYyA9IHRoaXMuY3VycmVudFNyY1xuICAgICAgICBkaXNwYXRjaE5hdGl2ZUV2ZW50KHRoaXMuJGVsLCAncGFnZXN0YXJ0JywgeyB1cmw6IHRoaXMuY3VycmVudFNyYyB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdpZnJhbWUnLCB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgJ3dlZXgtdHlwZSc6ICd3ZWInLFxuICAgICAgICAgIHNyYzogdGhpcy5jdXJyZW50U3JjXG4gICAgICAgIH0sXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgbG9hZDogZXZlbnQgPT4ge1xuICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGVsLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgaWYgKGh0bWwpIHtcbiAgICAgICAgICAgICAgICAgIGRpc3BhdGNoTmF0aXZlRXZlbnQoZWwsICdwYWdlZmluaXNoJywgeyB1cmw6IHRoaXMuY3VycmVudFNyYyB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRpc3BhdGNoTmF0aXZlRXZlbnQoZWwsICdlcnJvcicsIG5ldyBFcnJvcignW3Z1ZS1yZW5kZXJdOmZvdW5kIG5vIHBhZ2UgY29udGVudC4nKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoTmF0aXZlRXZlbnQoZWwsICdlcnJvcicsIGVycilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC13ZWIgd2VleC1lbCcsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3dlYicsIGdldFdlYih3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBpbXBvcnQgYSBmcm9tICcuL2EnXG4vLyBpbXBvcnQgZGl2IGZyb20gJy4vZGl2J1xuLy8gaW1wb3J0IGltYWdlIGZyb20gJy4vaW1hZ2UnXG5pbXBvcnQgaW5wdXQgZnJvbSAnLi9pbnB1dCdcbmltcG9ydCBfc3dpdGNoIGZyb20gJy4vc3dpdGNoJ1xuaW1wb3J0IHNjcm9sbGFibGUgZnJvbSAnLi9zY3JvbGxhYmxlJ1xuaW1wb3J0IHNsaWRlciBmcm9tICcuL3NsaWRlcidcbi8vIGltcG9ydCB0ZXh0IGZyb20gJy4vdGV4dCdcbmltcG9ydCB0ZXh0YXJlYSBmcm9tICcuL3RleHRhcmVhJ1xuaW1wb3J0IHZpZGVvIGZyb20gJy4vdmlkZW8nXG5pbXBvcnQgd2ViIGZyb20gJy4vd2ViJ1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gIC8vIGEsXG4gIC8vIGRpdixcbiAgLy8gaW1hZ2UsXG4gIGlucHV0LFxuICBfc3dpdGNoLFxuICBzY3JvbGxhYmxlLFxuICBzbGlkZXIsXG4gIC8vIHRleHQsXG4gIHRleHRhcmVhLFxuICB2aWRlbyxcbiAgd2ViXG5dXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBzdXBwb3J0R2VvbG9jYXRpb24gPSAnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvclxuY29uc3QgZXJyb3JNc2cgPSBgW2g1LXJlbmRlcl06IGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGdlb2xvY2F0aW9uLmBcblxuY29uc3QgZ2VvbG9jYXRpb24gPSB7XG4gIC8vIG9wdGlvbnM6XG4gIC8vICAgLSBlbmFibGVIaWdoQWNjdXJhY3kgb3B0aW9uYWwsIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UsIGZhbHNlIGJ5IGRlZmF1bHQuXG4gIC8vICAgLSB0aW1lb3V0IFtub25lLW5hdGl2ZV0gb3B0aW9uYWwsIHZhbHVlIGlzIGEgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBkZWZhdWx0IHZhdWxlIGlzIEZJTkZJTklUWS5cbiAgLy8gICAtIG1heGltdW1BZ2UgW25vbmUtbmF0aXZlXSBvcHRpb25hbCwgdmFsdWUgaXMgYSBudW1iZXIgKG1pbGxpc2Vjb25kcyksIGRlZmF1bHQgdmFsdWUgaXMgMC5cbiAgZ2V0Q3VycmVudFBvc2l0aW9uIChzdWNjZXNzQ2JJZCwgZXJyb3JDYklkLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc3VjY2Vzc0NiID0gcG9zID0+IHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhzdWNjZXNzQ2JJZCwgcG9zKVxuICAgIGNvbnN0IGVycm9yQ2IgPSBlcnIgPT4gdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGVycm9yQ2JJZCwgZXJyKVxuICAgIGlmIChzdXBwb3J0R2VvbG9jYXRpb24pIHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oc3VjY2Vzc0NiLCBlcnJvckNiLCBvcHRpb25zKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnJvck1zZylcbiAgICAgIGVycm9yQ2IobmV3IEVycm9yKGVycm9yTXNnKSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gb3B0aW9uczogdGhlIHNhbWUgd2l0aCBgZ2V0Q3VycmVudFBvc2l0aW9uYC5cbiAgd2F0Y2hQb3NpdGlvbiAoc3VjY2Vzc0NiSWQsIGVycm9yQ2JJZCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHN1Y2Nlc3NDYiA9IHBvcyA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soc3VjY2Vzc0NiSWQsIHBvcywgdHJ1ZSlcbiAgICBjb25zdCBlcnJvckNiID0gZXJyID0+IHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhlcnJvckNiSWQsIGVycilcbiAgICBpZiAoc3VwcG9ydEdlb2xvY2F0aW9uKSB7XG4gICAgICBjb25zdCBpZCA9IG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKHBvcyA9PiB7XG4gICAgICAgIHBvcy53YXRjaElkID0gaWRcbiAgICAgICAgc3VjY2Vzc0NiKHBvcylcbiAgICAgIH0sIGVycm9yQ2IsIG9wdGlvbnMpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGVycm9yTXNnKVxuICAgICAgZXJyb3JDYihuZXcgRXJyb3IoZXJyb3JNc2cpKVxuICAgIH1cbiAgfSxcblxuICBjbGVhcldhdGNoICh3YXRjaElkKSB7XG4gICAgaWYgKHN1cHBvcnRHZW9sb2NhdGlvbikge1xuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2god2F0Y2hJZClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3JNc2cpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGdlb2xvY2F0aW9uOiBbe1xuICAgIG5hbWU6ICdnZXRDdXJyZW50UG9zaXRpb24nLFxuICAgIGFyZ3M6IFsnZnVuY3Rpb24nLCAnZnVuY3Rpb24nLCAnb2JqZWN0J11cbiAgfSwge1xuICAgIG5hbWU6ICd3YXRjaFBvc2l0aW9uJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJywgJ2Z1bmN0aW9uJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAnY2xlYXJXYXRjaCcsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdnZW9sb2NhdGlvbicsIGdlb2xvY2F0aW9uLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBsb2NhbFN0b3JhZ2UgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmxldCBzdXBwb3J0TG9jYWxTdG9yYWdlID0gZmFsc2VcbnRyeSB7XG4gIHN1cHBvcnRMb2NhbFN0b3JhZ2UgPSB0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJ1xufVxuY2F0Y2ggKGVycikge1xuICAvLyBub3Qgc3VwcG9ydC5cbn1cblxuY29uc3QgU1VDQ0VTUyA9ICdzdWNjZXNzJ1xuY29uc3QgRkFJTEVEID0gJ2ZhaWxlZCdcbmNvbnN0IElOVkFMSURfUEFSQU0gPSAnaW52YWxpZF9wYXJhbSdcbmNvbnN0IFVOREVGSU5FRCA9ICd1bmRlZmluZWQnXG5cbmZ1bmN0aW9uIGNhbGxGYWlsIChzZW5kZXIsIGNhbGxiYWNrSWQsIGVycm9yTXNnKSB7XG4gIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgIHJlc3VsdDogRkFJTEVELFxuICAgIGRhdGE6IGVycm9yTXNnIHx8IFVOREVGSU5FRFxuICB9KVxufVxuXG5mdW5jdGlvbiBjYWxsTm90U3VwcG9ydEZhaWwgKHNlbmRlciwgY2FsbGJhY2tJZCkge1xuICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICBkYXRhOiAnbG9jYWxTdG9yYWdlIGlzIGRpc2FibGVkIG9yIG5vdCBzdXBwb3J0ZWQuJ1xuICB9KVxufVxuXG5jb25zdCBzdG9yYWdlID0ge1xuXG4gIC8qKlxuICAgKiBXaGVuIHBhc3NlZCBhIGtleSBuYW1lIGFuZCB2YWx1ZSwgd2lsbCBhZGQgdGhhdCBrZXkgdG8gdGhlIHN0b3JhZ2UsXG4gICAqIG9yIHVwZGF0ZSB0aGF0IGtleSdzIHZhbHVlIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBub3QgbnVsbCBub3IgdW5kaWZpbmVk77yMYnV0IDAgd29ya3MuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIHNldEl0ZW06IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBjYWxsYmFja0lkKSB7XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBjYWxsTm90U3VwcG9ydEZhaWwoc2VuZGVyLCBjYWxsYmFja0lkKVxuICAgIH1cbiAgICBpZiAoIWtleSB8fCAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgIGRhdGE6IElOVkFMSURfUEFSQU1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpXG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgICAgcmVzdWx0OiBTVUNDRVNTLFxuICAgICAgICBkYXRhOiBVTkRFRklORURcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAvLyBhY2NlcHQgYW55IGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGEgc3RvcmFnZSBhdHRlbXB0IGFzIGEgcXVvdGEgZXJyb3JcbiAgICAgIGNhbGxGYWlsKHNlbmRlciwgY2FsbGJhY2tJZClcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdoZW4gcGFzc2VkIGEga2V5IG5hbWUsIHdpbGwgcmV0dXJuIHRoYXQga2V5J3MgdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tJZFxuICAgKi9cbiAgZ2V0SXRlbTogZnVuY3Rpb24gKGtleSwgY2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgaWYgKCFzdXBwb3J0TG9jYWxTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gY2FsbE5vdFN1cHBvcnRGYWlsKHNlbmRlciwgY2FsbGJhY2tJZClcbiAgICB9XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogSU5WQUxJRF9QQVJBTVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KVxuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogdmFsID8gU1VDQ0VTUyA6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogdmFsIHx8IFVOREVGSU5FRFxuICAgICAgfSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGFjY2VwdCBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgYSBzdG9yYWdlIGF0dGVtcHQgYXMgYSBxdW90YSBlcnJvclxuICAgICAgY2FsbEZhaWwoc2VuZGVyLCBjYWxsYmFja0lkKVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICpXaGVuIHBhc3NlZCBhIGtleSBuYW1lLCB3aWxsIHJlbW92ZSB0aGF0IGtleSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIHJlbW92ZUl0ZW06IGZ1bmN0aW9uIChrZXksIGNhbGxiYWNrSWQpIHtcbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGlmICghc3VwcG9ydExvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIGNhbGxOb3RTdXBwb3J0RmFpbChzZW5kZXIsIGNhbGxiYWNrSWQpXG4gICAgfVxuICAgIGlmICgha2V5KSB7XG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgICAgcmVzdWx0OiBGQUlMRUQsXG4gICAgICAgIGRhdGE6IElOVkFMSURfUEFSQU1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSlcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICAgIGRhdGE6IFVOREVGSU5FRFxuICAgICAgfSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGFjY2VwdCBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgYSBzdG9yYWdlIGF0dGVtcHQgYXMgYSBxdW90YSBlcnJvclxuICAgICAgY2FsbEZhaWwoc2VuZGVyLCBjYWxsYmFja0lkKVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGRhdGEgaXRlbXMgc3RvcmVkIGluIHRoZSBTdG9yYWdlIG9iamVjdC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tJZFxuICAgKi9cbiAgbGVuZ3RoOiBmdW5jdGlvbiAoY2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgaWYgKCFzdXBwb3J0TG9jYWxTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gY2FsbE5vdFN1cHBvcnRGYWlsKHNlbmRlciwgY2FsbGJhY2tJZClcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxlbiA9IGxvY2FsU3RvcmFnZS5sZW5ndGhcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICAgIGRhdGE6IGxlblxuICAgICAgfSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGFjY2VwdCBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgYSBzdG9yYWdlIGF0dGVtcHQgYXMgYSBxdW90YSBlcnJvclxuICAgICAgY2FsbEZhaWwoc2VuZGVyLCBjYWxsYmFja0lkKVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFsbCBrZXlzIHN0b3JlZCBpbiBTdG9yYWdlIG9iamVjdC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tJZFxuICAgKi9cbiAgZ2V0QWxsS2V5czogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGlmICghc3VwcG9ydExvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIGNhbGxOb3RTdXBwb3J0RmFpbChzZW5kZXIsIGNhbGxiYWNrSWQpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBfYXJyID0gW11cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF9hcnIucHVzaChsb2NhbFN0b3JhZ2Uua2V5KGkpKVxuICAgICAgfVxuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogU1VDQ0VTUyxcbiAgICAgICAgZGF0YTogX2FyclxuICAgICAgfSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGFjY2VwdCBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgYSBzdG9yYWdlIGF0dGVtcHQgYXMgYSBxdW90YSBlcnJvclxuICAgICAgY2FsbEZhaWwoc2VuZGVyLCBjYWxsYmFja0lkKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXRhID0ge1xuICBzdG9yYWdlOiBbe1xuICAgIG5hbWU6ICdzZXRJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdzdHJpbmcnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ2dldEl0ZW0nLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdyZW1vdmVJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnbGVuZ3RoJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdnZXRBbGxLZXlzJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3N0b3JhZ2UnLCBzdG9yYWdlLCBtZXRhKVxuICB9XG59XG4iLCIodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpICYmICh3aW5kb3cgPSB7Y3RybDoge30sIGxpYjoge319KTshd2luZG93LmN0cmwgJiYgKHdpbmRvdy5jdHJsID0ge30pOyF3aW5kb3cubGliICYmICh3aW5kb3cubGliID0ge30pOyFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7dmFyIGI9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJwYXJhbXNcIix7c2V0OmZ1bmN0aW9uKGEpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBhKXtmb3IodmFyIGMgaW4gYilkZWxldGUgYltjXTtmb3IodmFyIGMgaW4gYSliW2NdPWFbY119fSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYn0sZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwic2VhcmNoXCIse3NldDpmdW5jdGlvbihhKXtpZihcInN0cmluZ1wiPT10eXBlb2YgYSl7MD09PWEuaW5kZXhPZihcIj9cIikmJihhPWEuc3Vic3RyKDEpKTt2YXIgYz1hLnNwbGl0KFwiJlwiKTtmb3IodmFyIGQgaW4gYilkZWxldGUgYltkXTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXS5zcGxpdChcIj1cIik7aWYodm9pZCAwIT09ZlsxXSYmKGZbMV09ZlsxXS50b1N0cmluZygpKSxmWzBdKXRyeXtiW2RlY29kZVVSSUNvbXBvbmVudChmWzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KGZbMV0pfWNhdGNoKGcpe2JbZlswXV09ZlsxXX19fX0sZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9W107Zm9yKHZhciBjIGluIGIpaWYodm9pZCAwIT09YltjXSlpZihcIlwiIT09YltjXSl0cnl7YS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChjKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQoYltjXSkpfWNhdGNoKGQpe2EucHVzaChjK1wiPVwiK2JbY10pfWVsc2UgdHJ5e2EucHVzaChlbmNvZGVVUklDb21wb25lbnQoYykpfWNhdGNoKGQpe2EucHVzaChjKX1yZXR1cm4gYS5sZW5ndGg/XCI/XCIrYS5qb2luKFwiJlwiKTpcIlwifSxlbnVtZXJhYmxlOiEwfSk7dmFyIGM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJoYXNoXCIse3NldDpmdW5jdGlvbihhKXtcInN0cmluZ1wiPT10eXBlb2YgYSYmKGEmJmEuaW5kZXhPZihcIiNcIik8MCYmKGE9XCIjXCIrYSksYz1hfHxcIlwiKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGVudW1lcmFibGU6ITB9KSx0aGlzLnNldD1mdW5jdGlvbihhKXthPWF8fFwiXCI7dmFyIGI7aWYoIShiPWEubWF0Y2gobmV3IFJlZ0V4cChcIl4oW2EtejAtOS1dKzopP1svXXsyfSg/OihbXkAvOj9dKykoPzo6KFteQC86XSspKT9AKT8oW146Lz8jXSspKD86WzpdKFswLTldKykpPyhbL11bXj8jO10qKT8oPzpbP10oW14jXSopKT8oWyNdW14/XSopPyRcIixcImlcIikpKSl0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyB1cmkgc2NoZW1lLlwiKTt0aGlzLnByb3RvY29sPWJbMV18fChcIm9iamVjdFwiPT10eXBlb2YgbG9jYXRpb24/bG9jYXRpb24ucHJvdG9jb2w6XCJcIiksdGhpcy51c2VybmFtZT1iWzJdfHxcIlwiLHRoaXMucGFzc3dvcmQ9YlszXXx8XCJcIix0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdD1iWzRdLHRoaXMucG9ydD1iWzVdfHxcIlwiLHRoaXMucGF0aG5hbWU9Yls2XXx8XCIvXCIsdGhpcy5zZWFyY2g9Yls3XXx8XCJcIix0aGlzLmhhc2g9Yls4XXx8XCJcIix0aGlzLm9yaWdpbj10aGlzLnByb3RvY29sK1wiLy9cIit0aGlzLmhvc3RuYW1lfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wcm90b2NvbCtcIi8vXCI7cmV0dXJuIHRoaXMudXNlcm5hbWUmJihhKz10aGlzLnVzZXJuYW1lLHRoaXMucGFzc3dvcmQmJihhKz1cIjpcIit0aGlzLnBhc3N3b3JkKSxhKz1cIkBcIiksYSs9dGhpcy5ob3N0LHRoaXMucG9ydCYmXCI4MFwiIT09dGhpcy5wb3J0JiYoYSs9XCI6XCIrdGhpcy5wb3J0KSx0aGlzLnBhdGhuYW1lJiYoYSs9dGhpcy5wYXRobmFtZSksdGhpcy5zZWFyY2gmJihhKz10aGlzLnNlYXJjaCksdGhpcy5oYXNoJiYoYSs9dGhpcy5oYXNoKSxhfSxhJiZ0aGlzLnNldChhLnRvU3RyaW5nKCkpfWIuaHR0cHVybD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGMoYSl9fSh3aW5kb3csd2luZG93LmxpYnx8KHdpbmRvdy5saWI9e30pKTs7bW9kdWxlLmV4cG9ydHMgPSB3aW5kb3cubGliWydodHRwdXJsJ107IiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0fSk7XG59O1xuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJpY3RVcmlFbmNvZGUgPSByZXF1aXJlKCdzdHJpY3QtdXJpLWVuY29kZScpO1xudmFyIG9iamVjdEFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxuZnVuY3Rpb24gZW5jb2RlckZvckFycmF5Rm9ybWF0KG9wdHMpIHtcblx0c3dpdGNoIChvcHRzLmFycmF5Rm9ybWF0KSB7XG5cdFx0Y2FzZSAnaW5kZXgnOlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBpbmRleCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IG51bGwgPyBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1snLFxuXHRcdFx0XHRcdGluZGV4LFxuXHRcdFx0XHRcdCddJ1xuXHRcdFx0XHRdLmpvaW4oJycpIDogW1xuXHRcdFx0XHRcdGVuY29kZShrZXksIG9wdHMpLFxuXHRcdFx0XHRcdCdbJyxcblx0XHRcdFx0XHRlbmNvZGUoaW5kZXgsIG9wdHMpLFxuXHRcdFx0XHRcdCddPScsXG5cdFx0XHRcdFx0ZW5jb2RlKHZhbHVlLCBvcHRzKVxuXHRcdFx0XHRdLmpvaW4oJycpO1xuXHRcdFx0fTtcblxuXHRcdGNhc2UgJ2JyYWNrZXQnOlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IGVuY29kZShrZXksIG9wdHMpIDogW1xuXHRcdFx0XHRcdGVuY29kZShrZXksIG9wdHMpLFxuXHRcdFx0XHRcdCdbXT0nLFxuXHRcdFx0XHRcdGVuY29kZSh2YWx1ZSwgb3B0cylcblx0XHRcdFx0XS5qb2luKCcnKTtcblx0XHRcdH07XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IGVuY29kZShrZXksIG9wdHMpIDogW1xuXHRcdFx0XHRcdGVuY29kZShrZXksIG9wdHMpLFxuXHRcdFx0XHRcdCc9Jyxcblx0XHRcdFx0XHRlbmNvZGUodmFsdWUsIG9wdHMpXG5cdFx0XHRcdF0uam9pbignJyk7XG5cdFx0XHR9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIHBhcnNlckZvckFycmF5Rm9ybWF0KG9wdHMpIHtcblx0dmFyIHJlc3VsdDtcblxuXHRzd2l0Y2ggKG9wdHMuYXJyYXlGb3JtYXQpIHtcblx0XHRjYXNlICdpbmRleCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFjY3VtdWxhdG9yKSB7XG5cdFx0XHRcdHJlc3VsdCA9IC9cXFsoXFxkKilcXF0kLy5leGVjKGtleSk7XG5cblx0XHRcdFx0a2V5ID0ga2V5LnJlcGxhY2UoL1xcW1xcZCpcXF0kLywgJycpO1xuXG5cdFx0XHRcdGlmICghcmVzdWx0KSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY2N1bXVsYXRvcltrZXldW3Jlc3VsdFsxXV0gPSB2YWx1ZTtcblx0XHRcdH07XG5cblx0XHRjYXNlICdicmFja2V0Jzpcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcblx0XHRcdFx0cmVzdWx0ID0gLyhcXFtcXF0pJC8uZXhlYyhrZXkpO1xuXHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZSgvXFxbXFxdJC8sICcnKTtcblxuXHRcdFx0XHRpZiAoIXJlc3VsdCkge1xuXHRcdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSB2YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSBpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IFt2YWx1ZV07XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IFtdLmNvbmNhdChhY2N1bXVsYXRvcltrZXldLCB2YWx1ZSk7XG5cdFx0XHR9O1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcblx0XHRcdFx0aWYgKGFjY3VtdWxhdG9yW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSB2YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gW10uY29uY2F0KGFjY3VtdWxhdG9yW2tleV0sIHZhbHVlKTtcblx0XHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlKHZhbHVlLCBvcHRzKSB7XG5cdGlmIChvcHRzLmVuY29kZSkge1xuXHRcdHJldHVybiBvcHRzLnN0cmljdCA/IHN0cmljdFVyaUVuY29kZSh2YWx1ZSkgOiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuXHR9XG5cblx0cmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBrZXlzU29ydGVyKGlucHV0KSB7XG5cdGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuXHRcdHJldHVybiBpbnB1dC5zb3J0KCk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuXHRcdHJldHVybiBrZXlzU29ydGVyKE9iamVjdC5rZXlzKGlucHV0KSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0cmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTtcblx0XHR9KS5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGlucHV0W2tleV07XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gaW5wdXQ7XG59XG5cbmV4cG9ydHMuZXh0cmFjdCA9IGZ1bmN0aW9uIChzdHIpIHtcblx0cmV0dXJuIHN0ci5zcGxpdCgnPycpWzFdIHx8ICcnO1xufTtcblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcblx0b3B0cyA9IG9iamVjdEFzc2lnbih7YXJyYXlGb3JtYXQ6ICdub25lJ30sIG9wdHMpO1xuXG5cdHZhciBmb3JtYXR0ZXIgPSBwYXJzZXJGb3JBcnJheUZvcm1hdChvcHRzKTtcblxuXHQvLyBDcmVhdGUgYW4gb2JqZWN0IHdpdGggbm8gcHJvdG90eXBlXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcXVlcnktc3RyaW5nL2lzc3Vlcy80N1xuXHR2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXHRpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0c3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKC9eKFxcP3wjfCYpLywgJycpO1xuXG5cdGlmICghc3RyKSB7XG5cdFx0cmV0dXJuIHJldDtcblx0fVxuXG5cdHN0ci5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG5cdFx0dmFyIHBhcnRzID0gcGFyYW0ucmVwbGFjZSgvXFwrL2csICcgJykuc3BsaXQoJz0nKTtcblx0XHQvLyBGaXJlZm94IChwcmUgNDApIGRlY29kZXMgYCUzRGAgdG8gYD1gXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmcvcHVsbC8zN1xuXHRcdHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpO1xuXHRcdHZhciB2YWwgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHMuam9pbignPScpIDogdW5kZWZpbmVkO1xuXG5cdFx0Ly8gbWlzc2luZyBgPWAgc2hvdWxkIGJlIGBudWxsYDpcblx0XHQvLyBodHRwOi8vdzMub3JnL1RSLzIwMTIvV0QtdXJsLTIwMTIwNTI0LyNjb2xsZWN0LXVybC1wYXJhbWV0ZXJzXG5cdFx0dmFsID0gdmFsID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHZhbCk7XG5cblx0XHRmb3JtYXR0ZXIoZGVjb2RlVVJJQ29tcG9uZW50KGtleSksIHZhbCwgcmV0KTtcblx0fSk7XG5cblx0cmV0dXJuIE9iamVjdC5rZXlzKHJldCkuc29ydCgpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcblx0XHR2YXIgdmFsID0gcmV0W2tleV07XG5cdFx0aWYgKEJvb2xlYW4odmFsKSAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHQvLyBTb3J0IG9iamVjdCBrZXlzLCBub3QgdmFsdWVzXG5cdFx0XHRyZXN1bHRba2V5XSA9IGtleXNTb3J0ZXIodmFsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0W2tleV0gPSB2YWw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59O1xuXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChvYmosIG9wdHMpIHtcblx0dmFyIGRlZmF1bHRzID0ge1xuXHRcdGVuY29kZTogdHJ1ZSxcblx0XHRzdHJpY3Q6IHRydWUsXG5cdFx0YXJyYXlGb3JtYXQ6ICdub25lJ1xuXHR9O1xuXG5cdG9wdHMgPSBvYmplY3RBc3NpZ24oZGVmYXVsdHMsIG9wdHMpO1xuXG5cdHZhciBmb3JtYXR0ZXIgPSBlbmNvZGVyRm9yQXJyYXlGb3JtYXQob3B0cyk7XG5cblx0cmV0dXJuIG9iaiA/IE9iamVjdC5rZXlzKG9iaikuc29ydCgpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0dmFyIHZhbCA9IG9ialtrZXldO1xuXG5cdFx0aWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXG5cdFx0aWYgKHZhbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShrZXksIG9wdHMpO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcblxuXHRcdFx0dmFsLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbiAodmFsMikge1xuXHRcdFx0XHRpZiAodmFsMiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0LnB1c2goZm9ybWF0dGVyKGtleSwgdmFsMiwgcmVzdWx0Lmxlbmd0aCkpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiByZXN1bHQuam9pbignJicpO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbmNvZGUoa2V5LCBvcHRzKSArICc9JyArIGVuY29kZSh2YWwsIG9wdHMpO1xuXHR9KS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcblx0XHRyZXR1cm4geC5sZW5ndGggPiAwO1xuXHR9KS5qb2luKCcmJykgOiAnJztcbn07XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBsaWIsIFhNTEh0dHBSZXF1ZXN0ICovXG4vKiBkZXBzOiBodHRwdXJsICovXG5cbid1c2Ugc3RyaWN0J1xuXG5sZXQgdXRpbHNcblxuaW1wb3J0ICdodHRwdXJsJ1xuaW1wb3J0IHFzIGZyb20gJ3F1ZXJ5LXN0cmluZydcblxubGV0IGpzb25wQ250ID0gMFxuY29uc3QgRVJST1JfU1RBVEUgPSAtMVxuXG5mdW5jdGlvbiBfanNvbnAgKGNvbmZpZywgY2FsbGJhY2ssIHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgY29uc3QgY2JOYW1lID0gY29uZmlnLmpzb25wQ2FsbGJhY2tOYW1lIHx8ICdqc29ucF8nICsgKCsranNvbnBDbnQpXG4gIGxldCB1cmxcblxuICBpZiAoIWNvbmZpZy51cmwpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBjb25maWcudXJsIHNob3VsZCBiZSBzZXQgaW4gX2pzb25wIGZvciBcXCdmZXRjaFxcJyBBUEkuJylcbiAgfVxuXG4gIGdsb2JhbFtjYk5hbWVdID0gKGZ1bmN0aW9uIChjYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBzdGF0dXNUZXh0OiAnT0snLFxuICAgICAgICBkYXRhOiByZXNwb25zZVxuICAgICAgfSlcbiAgICAgIGRlbGV0ZSBnbG9iYWxbY2JdXG4gICAgfVxuICB9KShjYk5hbWUpXG5cbiAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgdHJ5IHtcbiAgICB1cmwgPSBsaWIuaHR0cHVybChjb25maWcudXJsKVxuICB9XG4gIGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBpbnZhbGlkIGNvbmZpZy51cmwgaW4gX2pzb25wIGZvciBcXCdmZXRjaFxcJyBBUEk6ICdcbiAgICAgICsgY29uZmlnLnVybClcbiAgfVxuICB1cmwucGFyYW1zLmNhbGxiYWNrID0gY2JOYW1lXG4gIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCdcbiAgc2NyaXB0LnNyYyA9IHVybC50b1N0cmluZygpXG4gIC8vIHNjcmlwdC5vbmVycm9yIGlzIG5vdCB3b3JraW5nIG9uIElFIG9yIHNhZmFyaS5cbiAgLy8gYnV0IHRoZXkgYXJlIG5vdCBjb25zaWRlcmVkIGhlcmUuXG4gIHNjcmlwdC5vbmVycm9yID0gKGZ1bmN0aW9uIChjYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB1bmV4cGVjdGVkIGVycm9yIGluIF9qc29ucCBmb3IgXFwnZmV0Y2hcXCcgQVBJJywgZXJyKVxuICAgICAgY2FsbGJhY2soe1xuICAgICAgICBzdGF0dXM6IEVSUk9SX1NUQVRFLFxuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIHN0YXR1c1RleHQ6ICcnLFxuICAgICAgICBkYXRhOiAnJ1xuICAgICAgfSlcbiAgICAgIGRlbGV0ZSBnbG9iYWxbY2JdXG4gICAgfVxuICB9KShjYk5hbWUpXG4gIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gIGhlYWQuaW5zZXJ0QmVmb3JlKHNjcmlwdCwgbnVsbClcbn1cblxuZnVuY3Rpb24gX3hociAoY29uZmlnLCBjYWxsYmFjaywgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICB4aHIucmVzcG9uc2VUeXBlID0gY29uZmlnLnR5cGVcbiAgeGhyLm9wZW4oY29uZmlnLm1ldGhvZCwgY29uZmlnLnVybCwgdHJ1ZSlcblxuICAvLyBjb3JzIGNvb2tpZSBzdXBwb3J0XG4gIGlmIChjb25maWcud2l0aENyZWRlbnRpYWxzID09PSB0cnVlKSB7XG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fVxuICBmb3IgKGNvbnN0IGsgaW4gaGVhZGVycykge1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGssIGhlYWRlcnNba10pXG4gIH1cblxuICB4aHIub25sb2FkID0gZnVuY3Rpb24gKHJlcykge1xuICAgIGNhbGxiYWNrKHtcbiAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgIG9rOiB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwLFxuICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICBkYXRhOiB4aHIucmVzcG9uc2UsXG4gICAgICBoZWFkZXJzOiB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgaGVhZGVyU3RyKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyQXJyID0gaGVhZGVyU3RyLm1hdGNoKC8oLispOiAoLispLylcbiAgICAgICAgICBpZiAoaGVhZGVyQXJyKSB7XG4gICAgICAgICAgICBvYmpbaGVhZGVyQXJyWzFdXSA9IGhlYWRlckFyclsyXVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgIH0sIHt9KVxuICAgIH0pXG4gIH1cblxuICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHByb2dyZXNzQ2FsbGJhY2soe1xuICAgICAgICByZWFkeVN0YXRlOiB4aHIucmVhZHlTdGF0ZSxcbiAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICBsZW5ndGg6IGUubG9hZGVkLFxuICAgICAgICB0b3RhbDogZS50b3RhbCxcbiAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgnXFxuJylcbiAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChvYmosIGhlYWRlclN0cikge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyQXJyID0gaGVhZGVyU3RyLm1hdGNoKC8oLispOiAoLispLylcbiAgICAgICAgICAgIGlmIChoZWFkZXJBcnIpIHtcbiAgICAgICAgICAgICAgb2JqW2hlYWRlckFyclsxXV0gPSBoZWFkZXJBcnJbMl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgICB9LCB7fSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gdW5leHBlY3RlZCBlcnJvciBpbiBfeGhyIGZvciBcXCdmZXRjaFxcJyBBUEknLCBlcnIpXG4gICAgY2FsbGJhY2soe1xuICAgICAgc3RhdHVzOiBFUlJPUl9TVEFURSxcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIHN0YXR1c1RleHQ6ICcnLFxuICAgICAgZGF0YTogJydcbiAgICB9KVxuICB9XG5cbiAgeGhyLnNlbmQoY29uZmlnLmJvZHkgfHwgbnVsbClcbn1cblxuY29uc3Qgc3RyZWFtID0ge1xuXG4gIC8qKlxuICAgKiBzZW5kSHR0cFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBOb3RlOiBUaGlzIEFQSSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHN0cmVhbS5mZXRjaCBpbnN0ZWFkLlxuICAgKiBzZW5kIGEgaHR0cCByZXF1ZXN0IHRocm91Z2ggWEhSLlxuICAgKiBAcGFyYW0gIHtvYmp9IHBhcmFtc1xuICAgKiAgLSBtZXRob2Q6ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnREVMRVRFJyB8ICdIRUFEJyB8ICdQQVRDSCcsXG4gICAqICAtIHVybDogdXJsIHJlcXVlc3RlZFxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNhbGxiYWNrSWRcbiAgICovXG4gIHNlbmRIdHRwOiBmdW5jdGlvbiAocGFyYW0sIGNhbGxiYWNrSWQpIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyYW0gPSBKU09OLnBhcnNlKHBhcmFtKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW0gIT09ICdvYmplY3QnIHx8ICFwYXJhbS51cmwpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW2g1LXJlbmRlcl0gaW52YWxpZCBjb25maWcgb3IgaW52YWxpZCBjb25maWcudXJsIGZvciBzZW5kSHR0cCBBUEknKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgY29uc3QgbWV0aG9kID0gcGFyYW0ubWV0aG9kIHx8ICdHRVQnXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICB4aHIub3BlbihtZXRob2QsIHBhcmFtLnVybCwgdHJ1ZSlcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB0aGlzLnJlc3BvbnNlVGV4dClcbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB1bmV4cGVjdGVkIGVycm9yIGluIHNlbmRIdHRwIEFQSScsIGVycm9yKVxuICAgICAgLy8gc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhcbiAgICAgIC8vICAgY2FsbGJhY2tJZCxcbiAgICAgIC8vICAgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yIGluIHNlbmRIdHRwIEFQSScpXG4gICAgICAvLyApXG4gICAgfVxuICAgIHhoci5zZW5kKClcbiAgfSxcblxuICAvKipcbiAgICogZmV0Y2hcbiAgICogdXNlIHN0cmVhbS5mZXRjaCB0byByZXF1ZXN0IGZvciBhIGpzb24gZmlsZSwgYSBwbGFpbiB0ZXh0IGZpbGUgb3JcbiAgICogYSBhcnJheWJ1ZmZlciBmb3IgYSBmaWxlIHN0cmVhbS4gKFlvdSBjYW4gdXNlIEJsb2IgYW5kIEZpbGVSZWFkZXJcbiAgICogQVBJIGltcGxlbWVudGVkIGJ5IG1vc3QgbW9kZXJuIGJyb3dzZXJzIHRvIHJlYWQgYSBhcnJheWJ1ZmZlci4pXG4gICAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyBjb25maWcgb3B0aW9uc1xuICAgKiAgIC0gbWV0aG9kOiAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnIHwgJ0RFTEVURScgfCAnSEVBRCcgfCAnUEFUQ0gnXG4gICAqICAgLSBoZWFkZXJzIHtvYmp9XG4gICAqICAgLSB1cmwge3N0cmluZ31cbiAgICogICAtIG1vZGUge3N0cmluZ30gJ2NvcnMnIHwgJ25vLWNvcnMnIHwgJ3NhbWUtb3JpZ2luJyB8ICduYXZpZ2F0ZSdcbiAgICogICAtIHdpdGhDcmVkZW50aWFscyB7Ym9vbGVhbn1cbiAgICogICAtIGJvZHlcbiAgICogICAtIHR5cGUge3N0cmluZ30gJ2pzb24nIHwgJ2pzb25wJyB8ICd0ZXh0J1xuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNhbGxiYWNrSWRcbiAgICogQHBhcmFtICB7c3RyaW5nfSBwcm9ncmVzc0NhbGxiYWNrSWRcbiAgICovXG4gIGZldGNoOiBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2tJZCwgcHJvZ3Jlc3NDYWxsYmFja0lkKSB7XG4gICAgY29uc3QgREVGQVVMVF9NRVRIT0QgPSAnR0VUJ1xuICAgIGNvbnN0IERFRkFVTFRfTU9ERSA9ICdjb3JzJ1xuICAgIGNvbnN0IERFRkFVTFRfVFlQRSA9ICd0ZXh0J1xuXG4gICAgY29uc3QgbWV0aG9kT3B0aW9ucyA9IFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdIRUFEJywgJ1BBVENIJ11cbiAgICBjb25zdCBtb2RlT3B0aW9ucyA9IFsnY29ycycsICduby1jb3JzJywgJ3NhbWUtb3JpZ2luJywgJ25hdmlnYXRlJ11cbiAgICBjb25zdCB0eXBlT3B0aW9ucyA9IFsndGV4dCcsICdqc29uJywgJ2pzb25wJywgJ2FycmF5YnVmZmVyJ11cblxuICAgIC8vIGNvbnN0IGZhbGxiYWNrID0gZmFsc2UgIC8vIGZhbGxiYWNrIGZyb20gJ2ZldGNoJyBBUEkgdG8gWEhSLlxuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG5cbiAgICBjb25zdCBjb25maWcgPSB1dGlscy5leHRlbmQoe30sIG9wdGlvbnMpXG5cbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zLm1ldGhvZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm1ldGhvZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy5tZXRob2QgPSBERUZBVUxUX01FVEhPRFxuICAgICAgY29uc29sZS53YXJuKCdbaDUtcmVuZGVyXSBvcHRpb25zLm1ldGhvZCBmb3IgXFwnZmV0Y2hcXCcgQVBJIGhhcyBiZWVuIHNldCB0byAnXG4gICAgICAgICsgJ2RlZmF1bHQgdmFsdWUgXFwnJyArIGNvbmZpZy5tZXRob2QgKyAnXFwnJylcbiAgICB9XG4gICAgZWxzZSBpZiAobWV0aG9kT3B0aW9ucy5pbmRleE9mKChjb25maWcubWV0aG9kICsgJycpXG4gICAgICAudG9VcHBlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy5tZXRob2QgXFwnJ1xuICAgICAgICArIGNvbmZpZy5tZXRob2RcbiAgICAgICAgKyAnXFwnIGZvciBcXCdmZXRjaFxcJyBBUEkgc2hvdWxkIGJlIG9uZSBvZiAnXG4gICAgICAgICsgbWV0aG9kT3B0aW9ucyArICcuJylcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zLnVybFxuICAgIGlmICghY29uZmlnLnVybCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIG9wdGlvbnMudXJsIHNob3VsZCBiZSBzZXQgZm9yIFxcJ2ZldGNoXFwnIEFQSS4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGJvZHkgY29udGVudCBmb3IgbWV0aG9kICdHRVQnLlxuICAgIGlmIChjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09ICdHRVQnKSB7XG4gICAgICBsZXQgYm9keSA9IGNvbmZpZy5ib2R5XG4gICAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChib2R5KSkge1xuICAgICAgICBib2R5ID0gcXMuc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9XG4gICAgICBsZXQgdXJsID0gY29uZmlnLnVybFxuICAgICAgbGV0IGhhc2hJZHggPSB1cmwuaW5kZXhPZignIycpXG4gICAgICBoYXNoSWR4IDw9IC0xICYmIChoYXNoSWR4ID0gdXJsLmxlbmd0aClcbiAgICAgIGxldCBoYXNoID0gdXJsLnN1YnN0cihoYXNoSWR4KVxuICAgICAgaWYgKGhhc2ggJiYgaGFzaFswXSA9PT0gJyMnKSB7XG4gICAgICAgIGhhc2ggPSBoYXNoLnN1YnN0cigxKVxuICAgICAgfVxuICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCBoYXNoSWR4KVxuICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgdXJsICs9IChjb25maWcudXJsLmluZGV4T2YoJz8nKSA8PSAtMSA/ICc/JyA6ICcmJykgKyBib2R5XG4gICAgICB9XG4gICAgICB1cmwgKz0gJyMnICsgaGFzaFxuICAgICAgY29uZmlnLnVybCA9IHVybFxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnMubW9kZVxuICAgIGlmICh0eXBlb2YgY29uZmlnLm1vZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWcubW9kZSA9IERFRkFVTFRfTU9ERVxuICAgIH1cbiAgICBlbHNlIGlmIChtb2RlT3B0aW9ucy5pbmRleE9mKChjb25maWcubW9kZSArICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBvcHRpb25zLm1vZGUgXFwnJ1xuICAgICAgICArIGNvbmZpZy5tb2RlXG4gICAgICAgICsgJ1xcJyBmb3IgXFwnZmV0Y2hcXCcgQVBJIHNob3VsZCBiZSBvbmUgb2YgJ1xuICAgICAgICArIG1vZGVPcHRpb25zICsgJy4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnMudHlwZVxuICAgIGlmICh0eXBlb2YgY29uZmlnLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWcudHlwZSA9IERFRkFVTFRfVFlQRVxuICAgICAgY29uc29sZS53YXJuKCdbaDUtcmVuZGVyXSBvcHRpb25zLnR5cGUgZm9yIFxcJ2ZldGNoXFwnIEFQSSBoYXMgYmVlbiBzZXQgdG8gJ1xuICAgICAgICArICdkZWZhdWx0IHZhbHVlIFxcJycgKyBjb25maWcudHlwZSArICdcXCcuJylcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZU9wdGlvbnMuaW5kZXhPZigoY29uZmlnLnR5cGUgKyAnJykudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy50eXBlIFxcJydcbiAgICAgICAgICArIGNvbmZpZy50eXBlXG4gICAgICAgICAgKyAnXFwnIGZvciBcXCdmZXRjaFxcJyBBUEkgc2hvdWxkIGJlIG9uZSBvZiAnXG4gICAgICAgICAgKyB0eXBlT3B0aW9ucyArICcuJylcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zLmhlYWRlcnNcbiAgICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICAgaWYgKCF1dGlscy5pc1BsYWluT2JqZWN0KGNvbmZpZy5oZWFkZXJzKSkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIG9wdGlvbnMuaGVhZGVycyBzaG91bGQgYmUgYSBwbGFpbiBvYmplY3QnKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnMudGltZW91dFxuICAgIGNvbmZpZy50aW1lb3V0ID0gcGFyc2VJbnQoY29uZmlnLnRpbWVvdXQsIDEwKSB8fCAyNTAwXG5cbiAgICBjb25zdCBfY2FsbEFyZ3MgPSBbY29uZmlnLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHJlcylcbiAgICB9XVxuICAgIGlmIChwcm9ncmVzc0NhbGxiYWNrSWQpIHtcbiAgICAgIF9jYWxsQXJncy5wdXNoKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgLy8gU2V0ICdrZWVwQWxpdmUnIHRvIHRydWUgZm9yIHNlbmRpbmcgY29udGludW91cyBjYWxsYmFja3NcbiAgICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhwcm9ncmVzc0NhbGxiYWNrSWQsIHJlcywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAnanNvbnAnKSB7XG4gICAgICBfanNvbnAuYXBwbHkodGhpcywgX2NhbGxBcmdzKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIF94aHIuYXBwbHkodGhpcywgX2NhbGxBcmdzKVxuICAgIH1cbiAgfVxuXG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIHN0cmVhbTogW3tcbiAgICBuYW1lOiAnc2VuZEh0dHAnLFxuICAgIGFyZ3M6IFsnb2JqZWN0JywgJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdmZXRjaCcsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nLCAnZnVuY3Rpb24nXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgdXRpbHMgPSBXZWV4LnV0aWxzXG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnc3RyZWFtJywgc3RyZWFtLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG4vKipcblxuQVVDVElPTjpcbnRhc2tRdWV1ZVxuQ2xpcGJvYXJkLnNldFN0cmluZygpICBOT1cgbm90IHdvcmtzLCBmYWNpbmcgdG8gdXNlci1hY3QgbG9zZSBvZiB0YXNrUXVldWUuXG5cbndvcmtzIGluIENocm9tZSBGaXJlZm94IE9wZXJhLiBidXQgbm90IGluIFNhZmFyaS5cbkBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L2V4ZWNDb21tYW5kI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuXG5DbGlwYm9hcmQuZ2V0U3RyaW5nKCkgdW5pbXBsZW1lbnRlZC4gVGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gZG8gcGFzdGUgZnJvbSBjbGlwYm9hcmQgdG8ganMgdmFyaWFibGUuXG5cblNvIGxvb2sgb3V0IHlvdXIgYXBwIGJlaGF2aW9yLCB3aGVuIGRvd25ncmFkZSB0byBodG1sNSByZW5kZXIuXG5BbnkgaWRlYSBpcyB3ZWxjb21lLlxuKiovXG5cbmNvbnN0IFdFRVhfQ0xJUEJPQVJEX0lEID0gJ19fd2VleF9jbGlwYm9hcmRfaWRfXydcblxuY29uc3QgY2xpcGJvYXJkID0ge1xuXG4gIGdldFN0cmluZzogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICAvLyBub3Qgc3VwcG9ydGVkIGluIGh0bWw1XG4gICAgY29uc29sZS5sb2coJ2NsaXBib2FyZC5nZXRTdHJpbmcoKSBpcyBub3Qgc3VwcG9ydGVkIG5vdy4nKVxuICB9LFxuXG4gIHNldFN0cmluZzogZnVuY3Rpb24gKHRleHQpIHtcbiAgICAvLyBub3Qgc3VwcG9ydCBzYWZhcmlcbiAgICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnICYmIHRleHQgIT09ICcnICYmIGRvY3VtZW50LmV4ZWNDb21tYW5kKSB7XG4gICAgICBjb25zdCB0ZW1wSW5wdXQgPSBlbGVtZW50KClcbiAgICAgIHRlbXBJbnB1dC52YWx1ZSA9IHRleHRcblxuICAgICAgdGVtcElucHV0LnNlbGVjdCgpXG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpXG4gICAgICAvLyB2YXIgb3V0ID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXhlY0NvbW1hbmQgb3V0IGlzIFwiICsgb3V0KTtcbiAgICAgIHRlbXBJbnB1dC52YWx1ZSA9ICcnXG4gICAgICB0ZW1wSW5wdXQuYmx1cigpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ29ubHkgc3VwcG9ydCBzdHJpbmcgaW5wdXQgbm93JylcbiAgICB9XG4gIH1cblxufVxuXG5mdW5jdGlvbiBlbGVtZW50ICgpIHtcbiAgbGV0IHRlbXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFdFRVhfQ0xJUEJPQVJEX0lEKVxuICBpZiAoIXRlbXBJbnB1dCkge1xuICAgIHRlbXBJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcbiAgICB0ZW1wSW5wdXQuc2V0QXR0cmlidXRlKCdpZCcsIFdFRVhfQ0xJUEJPQVJEX0lEKVxuICAgIHRlbXBJbnB1dC5zdHlsZS5jc3NUZXh0ID0gJ2hlaWdodDoxcHg7d2lkdGg6MXB4O2JvcmRlcjpub25lOydcbiAgICAvLyB0ZW1wSW5wdXQuc3R5bGUuY3NzVGV4dCA9IFwiaGVpZ2h0OjQwcHg7d2lkdGg6MzAwcHg7Ym9yZGVyOnNvbGlkO1wiXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wSW5wdXQpXG4gIH1cbiAgcmV0dXJuIHRlbXBJbnB1dFxufVxuXG5jb25zdCBtZXRhID0ge1xuICBjbGlwYm9hcmQ6IFt7XG4gICAgbmFtZTogJ2dldFN0cmluZycsXG4gICAgYXJnczogWydmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnc2V0U3RyaW5nJyxcbiAgICBhcmdzOiBbJ3N0cmluZyddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdjbGlwYm9hcmQnLCBjbGlwYm9hcmQsIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGV2ZW50ID0ge1xuICAvKipcbiAgICogb3BlblVybFxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICAgKi9cbiAgb3BlblVSTDogZnVuY3Rpb24gKHVybCkge1xuICAgIGxvY2F0aW9uLmhyZWYgPSB1cmxcbiAgfVxuXG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGV2ZW50OiBbe1xuICAgIG5hbWU6ICdvcGVuVVJMJyxcbiAgICBhcmdzOiBbJ3N0cmluZyddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdldmVudCcsIGV2ZW50LCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNvbnN0IHV0aWxzID0ge31cbmxldCBlbmRFdmVudFxubGV0IHN0eWxlTmFtZVxuXG5jb25zdCBERVNJR05fUk9PVF9WQUxVRSA9IDc1XG5cbmNvbnN0IEVWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCcsXG4gIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgTW96VHJhbnNpdGlvbjogJ21velRyYW5zaXRpb25FbmQnLFxuICBPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uRW5kJyxcbiAgbXNUcmFuc2l0aW9uOiAnTVNUcmFuc2l0aW9uRW5kJ1xufVxuXG5mdW5jdGlvbiBkZXRlY3RFdmVudHMgKCkge1xuICBjb25zdCB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb25zdCBzdHlsZSA9IHRlc3RFbC5zdHlsZVxuICBmb3IgKGNvbnN0IG5hbWUgaW4gRVZFTlRfTkFNRV9NQVApIHtcbiAgICBpZiAobmFtZSBpbiBzdHlsZSkge1xuICAgICAgZW5kRXZlbnQgPSBFVkVOVF9OQU1FX01BUFtuYW1lXVxuICAgICAgc3R5bGVOYW1lID0gbmFtZVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cblxuZGV0ZWN0RXZlbnRzKClcblxuZnVuY3Rpb24gdHJhbnNpdGlvbk9uY2UgKHZub2RlLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHtcbiAgICBuZXh0RnJhbWUsXG4gICAgdG9DU1NUZXh0LFxuICAgIHN0eWxlT2JqZWN0MnJlbSxcbiAgICAvLyBub3JtYWxpemVTdHlsZSxcbiAgICBpc0FycmF5XG4gIH0gPSB1dGlsc1xuXG4gIGlmIChpc0FycmF5KHZub2RlKSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgY29uc29sZS53YXJuKCdbdnVlLXJlbmRlcl0gdGhlIHJlZiBwYXNzZWQgdG8gYW5pbWF0aW9uLnRyYW5zaXRpb25PbmNlIGlzIGEgYXJyYXkuJylcbiAgICB9XG4gICAgdm5vZGUgPSB2bm9kZVswXVxuICB9XG5cbiAgY29uc3QgZHVyYXRpb24gPSBjb25maWcuZHVyYXRpb24gfHwgMCAvLyBtc1xuICBjb25zdCB0aW1pbmcgPSBjb25maWcudGltaW5nRnVuY3Rpb24gfHwgJ2xpbmVhcidcbiAgY29uc3QgZGVsYXkgPSBjb25maWcuZGVsYXkgfHwgMCAgLy8gbXNcblxuICAvLyBUT0RPOiBwYXJzZSB0cmFuc2l0aW9uIHByb3BlcnRpZXNcbiAgY29uc3QgdHJhbnNpdGlvblZhbHVlID0gYGFsbCAke2R1cmF0aW9ufW1zICR7dGltaW5nfSAke2RlbGF5fW1zYFxuXG4gIGNvbnN0IGRvbSA9IHZub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyB2bm9kZSA6IHZub2RlLiRlbFxuICAvLyB0cmlnZ2VyIGltYWdlIGxhenlsb2FkaW5nIGJ5IGZvcmNlLlxuICBkb20gJiYgd2VleC51dGlscy5maXJlTGF6eWxvYWQoZG9tLCB0cnVlKVxuXG4gIGNvbnN0IHRyYW5zaXRpb25FbmRIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQgJiYgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoZW5kRXZlbnQpIHtcbiAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKGVuZEV2ZW50LCB0cmFuc2l0aW9uRW5kSGFuZGxlcilcbiAgICAgIGRvbS5zdHlsZVtzdHlsZU5hbWVdID0gJydcbiAgICB9XG4gICAgY2FsbGJhY2soKVxuICB9XG4gIGlmIChlbmRFdmVudCkge1xuICAgIGRvbS5zdHlsZVtzdHlsZU5hbWVdID0gdHJhbnNpdGlvblZhbHVlXG4gICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIHRyYW5zaXRpb25FbmRIYW5kbGVyKVxuICB9XG4gIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgZG9tLnN0eWxlLmNzc1RleHRcbiAgICAgICs9IHRvQ1NTVGV4dChzdHlsZU9iamVjdDJyZW0oY29uZmlnLnN0eWxlcywgREVTSUdOX1JPT1RfVkFMVUUpIHx8IHt9KVxuICB9KVxufVxuXG5jb25zdCBhbmltYXRpb24gPSB7XG4gIC8qKlxuICAgKiB0cmFuc2l0aW9uXG4gICAqIEBwYXJhbSAge1N0cmluZ30gdm5vZGVcbiAgICogQHBhcmFtICB7T2JqZWN0fSBjb25maWdcbiAgICogQHBhcmFtICB7U3RyaW5nfSBjYWxsYmFja1xuICAgKi9cbiAgdHJhbnNpdGlvbiAodm5vZGUsIGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICBpZiAoIWNvbmZpZy5zdHlsZXMpIHsgcmV0dXJuIH1cbiAgICByZXR1cm4gdHJhbnNpdGlvbk9uY2Uodm5vZGUsIGNvbmZpZywgKCkgPT4ge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgY29uc3QgZXh0ZW5kS2V5cyA9IHdlZXgudXRpbHMuZXh0ZW5kS2V5c1xuICAgIGV4dGVuZEtleXModXRpbHMsIHdlZXgudXRpbHMsIFtcbiAgICAgICduZXh0RnJhbWUnLFxuICAgICAgJ3RvQ1NTVGV4dCcsXG4gICAgICAnc3R5bGVPYmplY3QycmVtJyxcbiAgICAgIC8vICdhdXRvUHJlZml4JyxcbiAgICAgIC8vICdub3JtYWxpemVTdHlsZScsXG4gICAgICAnaXNBcnJheSdcbiAgICBdKVxuXG4gICAgd2VleC5yZWdpc3Rlck1vZHVsZSgnYW5pbWF0aW9uJywgYW5pbWF0aW9uKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNvbnN0IHV0aWxzID0ge31cblxuZnVuY3Rpb24gbm93ICgpIHtcbiAgY29uc3Qgbm93ID0gd2luZG93LnBlcmZvcm1hbmNlICYmIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3dcbiAgICA/IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpIDogRGF0ZS5ub3dcbiAgcmV0dXJuIG5vdygpXG59XG5cbmZ1bmN0aW9uIHNjcm9sbEVsZW1lbnQgKGRTdWZmaXgsIHBvc2l0aW9uKSB7XG4gIGlmICgodGhpcyA9PT0gZG9jdW1lbnQuYm9keSkgfHwgKHRoaXMgPT09IHdpbmRvdylcbiAgICAmJiB3aW5kb3cuc2Nyb2xsVG8pIHtcbiAgICByZXR1cm4gd2luZG93LnNjcm9sbFRvKDAsIHBvc2l0aW9uKVxuICB9XG4gIHRoaXNbYHNjcm9sbCR7ZFN1ZmZpeH1gXSA9IHBvc2l0aW9uXG59XG4vKipcbiAqIHNlbGYgaW52b2tlZCBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIGNvbnRleHQsIHN0ZXBzIHRocm91Z2ggc2Nyb2xsaW5nXG4gKiBAbWV0aG9kIHN0ZXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIHN0ZXAgKGNvbnRleHQpIHtcbiAgLy8gY2FsbCBtZXRob2QgYWdhaW4gb24gbmV4dCBhdmFpbGFibGUgZnJhbWVcbiAgY29udGV4dC5mcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcC5iaW5kKHdpbmRvdywgY29udGV4dCkpXG4gIGNvbnN0IHRpbWUgPSBub3coKVxuICBsZXQgZWxhcHNlZCA9ICh0aW1lIC0gY29udGV4dC5zdGFydFRpbWUpIC8gNDY4XG4gIC8vIGF2b2lkIGVsYXBzZWQgdGltZXMgaGlnaGVyIHRoYW4gb25lXG4gIGVsYXBzZWQgPSBlbGFwc2VkID4gMSA/IDEgOiBlbGFwc2VkXG4gIC8vIGFwcGx5IGVhc2luZyB0byBlbGFwc2VkIHRpbWVcbiAgY29uc3QgdmFsdWUgPSBlYXNlKGVsYXBzZWQpXG4gIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IGNvbnRleHQuc3RhcnRQb3NpdGlvbiArIChjb250ZXh0LnBvc2l0aW9uIC0gY29udGV4dC5zdGFydFBvc2l0aW9uKSAqIHZhbHVlXG4gIGNvbnRleHQubWV0aG9kLmNhbGwoY29udGV4dC5zY3JvbGxhYmxlLCBjb250ZXh0LmRTdWZmaXgsIGN1cnJlbnRQb3NpdGlvbilcbiAgLy8gcmV0dXJuIHdoZW4gZW5kIHBvaW50cyBoYXZlIGJlZW4gcmVhY2hlZFxuICAvKipcbiAgICAqIE5PVEU6IHNob3VsZCB1c2Ugfn4gdG8gcGFyc2UgcG9zaXRpb24gbnVtYmVyIGludG8gaW50ZWdlci4gT3RoZXJ3aXNlXG4gICAgKiB0aGlzIHR3byBmbG9hdCBudW1iZXJzIG1heWJlIGhhdmUgYSBzbGljZWx5IGxpdHRsZSBkaWZmZXJlbmNlLCB3aGljaFxuICAgICogd2lsbCBjYXVzZSB0aGlzIGZ1bmN0aW9uIG5ldmVyIHRvIHN0b3AuXG4gICovXG4gIGlmICh+fmN1cnJlbnRQb3NpdGlvbiA9PT0gfn5jb250ZXh0LnBvc2l0aW9uKSB7XG4gICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGNvbnRleHQuZnJhbWUpXG4gICAgcmV0dXJuXG4gIH1cbn1cbi8qKlxuICogcmV0dXJucyByZXN1bHQgb2YgYXBwbHlpbmcgZWFzZSBtYXRoIGZ1bmN0aW9uIHRvIGEgbnVtYmVyXG4gKiBAbWV0aG9kIGVhc2VcbiAqIEBwYXJhbSB7TnVtYmVyfSBrXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBlYXNlIChrKSB7XG4gIHJldHVybiAwLjUgKiAoMSAtIE1hdGguY29zKE1hdGguUEkgKiBrKSlcbn1cbmNvbnN0IGRvbSA9IHtcbiAgLyoqXG4gICAqIHNjcm9sbFRvRWxlbWVudFxuICAgKiBAcGFyYW0gIHtWbm9kZSB8IFZDb21wb25lbnR9IHZub2RlXG4gICAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyB7b2Zmc2V0Ok51bWJlcn1cbiAgICogICBwczogc2Nyb2xsLXRvIGhhcyAnZWFzZScgYW5kICdkdXJhdGlvbicobXMpIGFzIG9wdGlvbnMuXG4gICAqL1xuICBzY3JvbGxUb0VsZW1lbnQ6IGZ1bmN0aW9uICh2bm9kZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzQXJyYXksXG4gICAgICBnZXRQYXJlbnRTY3JvbGxlckVsZW1lbnRcbiAgICB9ID0gdXRpbHNcbiAgICBpZiAoaXNBcnJheSh2bm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t2dWUtcmVuZGVyXSB0aGUgcmVmIHBhc3NlZCB0byBhbmltYXRpb24udHJhbnNpdGlvbk9uY2UgaXMgYSBhcnJheS4nKVxuICAgICAgfVxuICAgICAgdm5vZGUgPSB2bm9kZVswXVxuICAgIH1cbiAgICBjb25zdCBpc0VsZW1lbnQgPSB2bm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XG4gICAgY29uc3QgZWwgPSBpc0VsZW1lbnQgPyB2bm9kZSA6ICh2bm9kZS4kZWwgfHwgdm5vZGUuZWxtKVxuICAgIGNvbnN0IGN0ID0gZ2V0UGFyZW50U2Nyb2xsZXJFbGVtZW50KHZub2RlKVxuICAgIGNvbnN0IHNjcm9sbGVyID0gY3QuX192dWVfX1xuICAgIGNvbnN0IGlzV2luZG93ID0gY3QgPT09IGRvY3VtZW50LmJvZHlcbiAgICBjb25zdCBzY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgaXNXaW5kb3cgPyAndmVydGljYWwnXG4gICAgICAgIDogKHNjcm9sbGVyICYmIHNjcm9sbGVyLnNjcm9sbERpcmVjdGlvbiB8fCAndmVydGljYWwnKVxuICAgIGlmIChjdCAmJiBlbCkge1xuICAgICAgY29uc3QgZFN1ZmZpeCA9ICh7XG4gICAgICAgIGhvcml6b250YWw6ICdMZWZ0JyxcbiAgICAgICAgdmVydGljYWw6ICdUb3AnXG4gICAgICB9KVtzY3JvbGxEaXJlY3Rpb25dXG4gICAgICBjb25zdCBjdFJlY3QgPSBjdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgbGV0IGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAvKipcbiAgICAgICAgKiBpZiBpdCdzIGEgd2F0ZXJmYWxsLCBhbmQgeW91IHdhbnQgdG8gc2Nyb2xsIHRvIGEgaGVhZGVyLCB0aGVuIGp1c3RcbiAgICAgICAgKiBzY3JvbGwgdG8gdGhlIHRvcC5cbiAgICAgICovXG4gICAgICBpZiAoXG4gICAgICAgICFpc0VsZW1lbnRcbiAgICAgICAgJiYgc2Nyb2xsZXJcbiAgICAgICAgJiYgc2Nyb2xsZXIud2VleFR5cGUgPT09ICd3YXRlcmZhbGwnXG4gICAgICAgICYmIHNjcm9sbGVyLl9oZWFkZXJzXG4gICAgICAgICYmIHNjcm9sbGVyLl9oZWFkZXJzLmluZGV4T2Yodm5vZGUuJHZub2RlIHx8IHZub2RlKSA+IC0xKSB7XG4gICAgICAgIC8vIGl0J3MgaW4gd2F0ZXJmYWxsLiBqdXN0IHNjcm9sbCB0byB0aGUgdG9wLlxuICAgICAgICBlbFJlY3QgPSBjdC5maXJzdEVsZW1lbnRDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgfVxuICAgICAgY29uc3QgZGlyID0gZFN1ZmZpeC50b0xvd2VyQ2FzZSgpXG4gICAgICBsZXQgb2Zmc2V0ID0gKGlzV2luZG93ID8gMCA6IGN0W2BzY3JvbGwke2RTdWZmaXh9YF0pICsgZWxSZWN0W2Rpcl0gLSBjdFJlY3RbZGlyXVxuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgb2Zmc2V0ICs9IG9wdGlvbnMub2Zmc2V0ICYmIG9wdGlvbnMub2Zmc2V0ICogd2VleC5jb25maWcuZW52LnNjYWxlIHx8IDBcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1Z1ZSBSZW5kZXJdIFRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIFwic2Nyb2xsVG9FbGVtZW50XCIgaXMgcmVxdWlyZWQsICdcbiAgICAgICAgKyAnb3RoZXJ3aXNlIGl0IG1heSBub3Qgd29ya3Mgd2VsbCBvbiBuYXRpdmUuJylcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYW5pbWF0ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxFbGVtZW50LmNhbGwoY3QsIGRTdWZmaXgsIG9mZnNldClcbiAgICAgIH1cbiAgICAgIHN0ZXAoe1xuICAgICAgICBzY3JvbGxhYmxlOiBjdCxcbiAgICAgICAgc3RhcnRUaW1lOiBub3coKSxcbiAgICAgICAgZnJhbWU6IG51bGwsXG4gICAgICAgIHN0YXJ0UG9zaXRpb246IGlzV2luZG93ID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogY3RbYHNjcm9sbCR7ZFN1ZmZpeH1gXSxcbiAgICAgICAgcG9zaXRpb246IG9mZnNldCxcbiAgICAgICAgbWV0aG9kOiBzY3JvbGxFbGVtZW50LFxuICAgICAgICBkU3VmZml4OiBkU3VmZml4XG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIGdldENvbXBvbmVudFJlY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZub2RlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBnZXRDb21wb25lbnRSZWN0OiBmdW5jdGlvbiAodm5vZGUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNBcnJheVxuICAgIH0gPSB1dGlsc1xuICAgIGlmIChpc0FycmF5KHZub2RlKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3Z1ZS1yZW5kZXJdIHRoZSByZWYgcGFzc2VkIHRvIGFuaW1hdGlvbi50cmFuc2l0aW9uT25jZSBpcyBhIGFycmF5LicpXG4gICAgICB9XG4gICAgICB2bm9kZSA9IHZub2RlWzBdXG4gICAgfVxuICAgIGNvbnN0IHNjYWxlID0gd2luZG93LndlZXguY29uZmlnLmVudi5zY2FsZVxuICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICByZXN1bHQ6IGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IHJlY3RLZXlzID0gWyd3aWR0aCcsICdoZWlnaHQnLCAndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0J11cblxuICAgIGZ1bmN0aW9uIHJlY2FsYyAocmVjdCkge1xuICAgICAgY29uc3QgcmVzID0ge31cbiAgICAgIHJlY3RLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKHJlY3Rba2V5XSkge1xuICAgICAgICAgIHJlc1trZXldID0gcmVjdFtrZXldIC8gc2NhbGVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiByZXNcbiAgICB9XG4gICAgaWYgKHZub2RlICYmIHZub2RlID09PSAndmlld3BvcnQnKSB7XG4gICAgICBpbmZvLnJlc3VsdCA9IHRydWVcbiAgICAgIGluZm8uc2l6ZSA9IHJlY2FsYyh7XG4gICAgICAgIHdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIGhlaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICByaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgICBib3R0b206IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2UgaWYgKHZub2RlKSB7XG4gICAgICBjb25zdCBlbCA9IHZub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgPyB2bm9kZVxuICAgICAgICA6IHZub2RlLiRlbFxuICAgICAgaWYgKGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgICBpbmZvLnJlc3VsdCA9IHRydWVcbiAgICAgICAgaW5mby5zaXplID0gcmVjYWxjKGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGluZm8ucmVzdWx0ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGluZm8ucmVzdWx0ID8gaW5mbyA6IHtcbiAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICBlcnJNc2c6ICdJbGxlZ2FsIHBhcmFtZXRlcidcbiAgICB9XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobWVzc2FnZSlcbiAgICByZXR1cm4gbWVzc2FnZVxuICB9LFxuICAvKipcbiAgICogZ2V0TGF5b3V0RGlyZWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2bm9kZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgZ2V0TGF5b3V0RGlyZWN0aW9uOiBmdW5jdGlvbiAodm5vZGUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgeyBpc0FycmF5IH0gPSB1dGlsc1xuICAgIGlmIChpc0FycmF5KHZub2RlKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW3Z1ZS1yZW5kZXJdIHRoZSByZWYgcGFzc2VkIHRvIGFuaW1hdGlvbi50cmFuc2l0aW9uT25jZSBpcyBhIGFycmF5LidcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdm5vZGUgPSB2bm9kZVswXVxuICAgIH1cbiAgICBsZXQgZGlyZWN0aW9uID0gJ2x0cidcbiAgICBpZiAodm5vZGUgJiYgdm5vZGUgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgIGRpcmVjdGlvbiA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVsnZGlyZWN0aW9uJ11cbiAgICB9XG4gICAgZWxzZSBpZiAodm5vZGUpIHtcbiAgICAgIGNvbnN0IGVsID0gdm5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHZub2RlIDogdm5vZGUuJGVsXG4gICAgICBkaXJlY3Rpb24gPSBnZXRDb21wdXRlZFN0eWxlKGVsKVsnZGlyZWN0aW9uJ11cbiAgICB9XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZGlyZWN0aW9uKVxuICAgIHJldHVybiBkaXJlY3Rpb25cbiAgfSxcbiAgLyoqXG4gICAqIGZvciBhZGRpbmcgZm9udEZhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBmb250RmFjZVxuICAgKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzIHJ1bGVzXG4gICAqL1xuICBhZGRSdWxlOiBmdW5jdGlvbiAoa2V5LCBzdHlsZXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYW1lbFRvS2ViYWIsXG4gICAgICBhcHBlbmRDc3NcbiAgICB9ID0gdXRpbHNcbiAgICBrZXkgPSBjYW1lbFRvS2ViYWIoa2V5KVxuICAgIGxldCBzdHlsZXNUZXh0ID0gJydcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgIHN0eWxlc1RleHQgKz0gY2FtZWxUb0tlYmFiKGspICsgJzonICsgc3R5bGVzW2tdICsgJzsnXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlVGV4dCA9IGBAJHtrZXl9eyR7c3R5bGVzVGV4dH19YFxuICAgIGFwcGVuZENzcyhzdHlsZVRleHQsICdkb20tYWRkZWQtcnVsZXMnKVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICBjb25zdCBleHRlbmRLZXlzID0gd2VleC51dGlscy5leHRlbmRLZXlzXG4gICAgZXh0ZW5kS2V5cyh1dGlscywgd2VleC51dGlscywgWydjYW1lbFRvS2ViYWInLCAnYXBwZW5kQ3NzJywgJ2lzQXJyYXknLCAnZ2V0UGFyZW50U2Nyb2xsZXJFbGVtZW50J10pXG4gICAgd2VleC5yZWdpc3Rlck1vZHVsZSgnZG9tJywgZG9tKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogZ2xvYmFsRXZlbnQgQVBJOlxuICogQGRvYyBodHRwOi8vd2VleC5hcGFjaGUub3JnL2NuL3JlZmVyZW5jZXMvbW9kdWxlcy9nbG9iYWxldmVudC5odG1sXG4gKi9cbi8vIHRyYWNrIHZhcmllcyBraW5kcyBvZiBldmVudHMgYW5kIGxpc3RlbmVycy5cbmNvbnN0IGhhbmRsZXJUcmFrZXIgPSB7fVxuXG5jb25zdCBnbG9iYWxFdmVudCA9IHtcbiAgLyoqXG4gICAqIGFkZEV2ZW50TGlzdGVuZXJcbiAgICogTk9URTogb25lIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGJvdW5kIHRvIHRoZSBzYW1lIGV2ZW50IG9uY2UuIEJpbmQgYSBjYWxsYmFjayB0d2ljZSBkb2Vzbid0XG4gICAqICBtZWFuIGl0IHdpbGwgYmUgY2FsbGVkIHR3aWNlIHdoZW4gdGhlIGV2ZW50IGZpcmVkIG9uY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldnQgLSB0aGUgZXZlbnQgbmFtZSB0byBhZGQgYSBsaXN0ZW5lciBvbi5cbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIgKGV2dCwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW3Z1ZS1yZW5kZXJdIG1pc3NpbmcgY2FsbGJhY2sgYXJnIGluIGdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIuYClcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsZXQgaGFuZGxlcnMgPSBoYW5kbGVyVHJha2VyW2V2dF1cbiAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IGhhbmRsZXJUcmFrZXJbZXZ0XSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGxlbiA9IGhhbmRsZXJzLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChoYW5kbGVyc1tpXSA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBhbHJlYWR5IGJvdW5kLiBubyBuZWVkIHRvIGJpbmQgaXQgYWdhaW4uXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVycy5wdXNoKGNhbGxiYWNrKVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBjYWxsYmFjaylcbiAgfSxcblxuICAvKipcbiAgICogcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgKiBOT1RFOiByZW1vdmUgYWxsIHRoZSBldmVudCBoYW5kbGVycyBmb3IgdGhlIHNwZWNpZmllZCBldmVudCB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZ0IC0gdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbS5cbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIgKGV2dCkge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gaGFuZGxlclRyYWtlcltldnRdXG4gICAgaWYgKCFoYW5kbGVycykge1xuICAgICAgLy8gZXZ0IGhhbmRsZXJzIGhhcyBiZWVuIGFscmVhZHkgcmVtb3ZlZC5cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBoYW5kbGVycy5mb3JFYWNoKGNiID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0LCBjYikpXG4gICAgZGVsZXRlIGhhbmRsZXJUcmFrZXJbZXZ0XVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJNb2R1bGUoJ2dsb2JhbEV2ZW50JywgZ2xvYmFsRXZlbnQpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgcXVldWUgPSBbXVxubGV0IGlzUHJvY2Vzc2luZyA9IGZhbHNlXG5sZXQgdG9hc3RXaW5cbmNvbnN0IFRPQVNUX1dJTl9DTEFTU19OQU1FID0gJ3dlZXgtdG9hc3QnXG5jb25zdCBUT0FTVF9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMC40XG5cbmNvbnN0IERFRkFVTFRfRFVSQVRJT04gPSAwLjhcblxuZnVuY3Rpb24gc2hvd1RvYXN0V2luZG93IChtc2csIGNhbGxiYWNrKSB7XG4gIGlmICghdG9hc3RXaW4pIHtcbiAgICB0b2FzdFdpbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdG9hc3RXaW4uY2xhc3NMaXN0LmFkZChUT0FTVF9XSU5fQ0xBU1NfTkFNRSlcbiAgICB0b2FzdFdpbi5jbGFzc0xpc3QuYWRkKCdoaWRlJylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0V2luKVxuICB9XG4gIHRvYXN0V2luLnRleHRDb250ZW50ID0gbXNnXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRvYXN0V2luLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKVxuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgfSwgMTYpXG59XG5cbmZ1bmN0aW9uIGhpZGVUb2FzdFdpbmRvdyAoY2FsbGJhY2spIHtcbiAgaWYgKCF0b2FzdFdpbikge1xuICAgIHJldHVyblxuICB9XG4gIHRvYXN0V2luLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKVxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gIH0sIFRPQVNUX1RSQU5TSVRJT05fRFVSQVRJT04gKiAxMDAwKVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHB1c2g6IGZ1bmN0aW9uIChtc2csIGR1cmF0aW9uKSB7XG4gICAgcXVldWUucHVzaCh7XG4gICAgICBtc2c6IG1zZyxcbiAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiB8fCBERUZBVUxUX0RVUkFUSU9OXG4gICAgfSlcbiAgICB0aGlzLnNob3coKVxuICB9LFxuXG4gIHNob3c6IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpc1xuXG4gICAgLy8gQWxsIG1lc3NhZ2VzIGhhZCBiZWVuIHRvYXN0ZWQgYWxyZWFkeSwgc28gcmVtb3ZlIHRoZSB0b2FzdCB3aW5kb3csXG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHRvYXN0V2luICYmIHRvYXN0V2luLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9hc3RXaW4pXG4gICAgICB0b2FzdFdpbiA9IG51bGxcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHRoZSBwcmV2aW91cyB0b2FzdCBpcyBub3QgZW5kZWQgeWV0LlxuICAgIGlmIChpc1Byb2Nlc3NpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpc1Byb2Nlc3NpbmcgPSB0cnVlXG5cbiAgICBjb25zdCB0b2FzdEluZm8gPSBxdWV1ZS5zaGlmdCgpXG4gICAgc2hvd1RvYXN0V2luZG93KHRvYXN0SW5mby5tc2csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBoaWRlVG9hc3RXaW5kb3coZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IGZhbHNlXG4gICAgICAgICAgdGhhdC5zaG93KClcbiAgICAgICAgfSlcbiAgICAgIH0sIHRvYXN0SW5mby5kdXJhdGlvbiAqIDEwMDApXG4gICAgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIHRoZXJlIHdpbGwgYmUgb25seSBvbmUgaW5zdGFuY2Ugb2YgbW9kYWwuXG5jb25zdCBNT0RBTF9XUkFQX0NMQVNTID0gJ3dlZXgtbW9kYWwtd3JhcCdcbmNvbnN0IE1PREFMX05PREVfQ0xBU1MgPSAnd2VleC1tb2RhbC1ub2RlJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb2RhbCAoKSB7XG4gIHRoaXMud3JhcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoTU9EQUxfV1JBUF9DTEFTUylcbiAgdGhpcy5ub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihNT0RBTF9OT0RFX0NMQVNTKVxuICBpZiAoIXRoaXMud3JhcCkge1xuICAgIHRoaXMuY3JlYXRlV3JhcCgpXG4gIH1cbiAgaWYgKCF0aGlzLm5vZGUpIHtcbiAgICB0aGlzLmNyZWF0ZU5vZGUoKVxuICB9XG4gIHRoaXMuY2xlYXJOb2RlKClcbiAgdGhpcy5jcmVhdGVOb2RlQ29udGVudCgpXG4gIHRoaXMuYmluZEV2ZW50cygpXG59XG5cbk1vZGFsLnByb3RvdHlwZSA9IHtcblxuICBzaG93OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy53cmFwLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgdGhpcy5ub2RlLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKVxuICB9LFxuXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMud3JhcClcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMubm9kZSlcbiAgICB0aGlzLndyYXAgPSBudWxsXG4gICAgdGhpcy5ub2RlID0gbnVsbFxuICB9LFxuXG4gIGNyZWF0ZVdyYXA6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLndyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRoaXMud3JhcC5jbGFzc05hbWUgPSBNT0RBTF9XUkFQX0NMQVNTXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLndyYXApXG4gIH0sXG5cbiAgY3JlYXRlTm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGhpcy5ub2RlLmNsYXNzTGlzdC5hZGQoTU9EQUxfTk9ERV9DTEFTUywgJ2hpZGUnKVxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKVxuICB9LFxuXG4gIGNsZWFyTm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubm9kZS5pbm5lckhUTUwgPSAnJ1xuICB9LFxuXG4gIGNyZWF0ZU5vZGVDb250ZW50OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAvLyBkbyBub3RoaW5nLlxuICAgIC8vIGNoaWxkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLlxuICB9LFxuXG4gIGJpbmRFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLndyYXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi9tb2RhbCdcblxuY29uc3QgQ09OVEVOVF9DTEFTUyA9ICdjb250ZW50J1xuY29uc3QgTVNHX0NMQVNTID0gJ2NvbnRlbnQtbXNnJ1xuY29uc3QgQlVUVE9OX0dST1VQX0NMQVNTID0gJ2J0bi1ncm91cCdcbmNvbnN0IEJVVFRPTl9DTEFTUyA9ICdidG4nXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFsZXJ0IChjb25maWcpIHtcbiAgdGhpcy5tc2cgPSBjb25maWcubWVzc2FnZSB8fCAnJ1xuICB0aGlzLmNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrXG4gIHRoaXMub2tUaXRsZSA9IGNvbmZpZy5va1RpdGxlIHx8ICdPSydcbiAgTW9kYWwuY2FsbCh0aGlzKVxuICB0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1hbGVydCcpXG59XG5cbkFsZXJ0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9kYWwucHJvdG90eXBlKVxuXG5BbGVydC5wcm90b3R5cGUuY3JlYXRlTm9kZUNvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb250ZW50LmNsYXNzTGlzdC5hZGQoQ09OVEVOVF9DTEFTUylcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpXG5cbiAgY29uc3QgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgbXNnLmNsYXNzTGlzdC5hZGQoTVNHX0NMQVNTKVxuICBtc2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5tc2cpKVxuICBjb250ZW50LmFwcGVuZENoaWxkKG1zZylcblxuICBjb25zdCBidXR0b25Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ1dHRvbkdyb3VwLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0dST1VQX0NMQVNTKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXApXG4gIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKEJVVFRPTl9DTEFTUywgJ2FsZXJ0LW9rJylcbiAgYnV0dG9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMub2tUaXRsZSkpXG4gIGJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKGJ1dHRvbilcbn1cblxuQWxlcnQucHJvdG90eXBlLmJpbmRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIE1vZGFsLnByb3RvdHlwZS5iaW5kRXZlbnRzLmNhbGwodGhpcylcbiAgY29uc3QgYnV0dG9uID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3IoJy4nICsgQlVUVE9OX0NMQVNTKVxuICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2soKVxuICB9LmJpbmQodGhpcykpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBNb2RhbCBmcm9tICcuL21vZGFsJ1xuXG5jb25zdCBDT05URU5UX0NMQVNTID0gJ2NvbnRlbnQnXG5jb25zdCBNU0dfQ0xBU1MgPSAnY29udGVudC1tc2cnXG5jb25zdCBCVVRUT05fR1JPVVBfQ0xBU1MgPSAnYnRuLWdyb3VwJ1xuY29uc3QgQlVUVE9OX0NMQVNTID0gJ2J0bidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ29uZmlybSAoY29uZmlnKSB7XG4gIHRoaXMubXNnID0gY29uZmlnLm1lc3NhZ2UgfHwgJydcbiAgdGhpcy5jYWxsYmFjayA9IGNvbmZpZy5jYWxsYmFja1xuICB0aGlzLm9rVGl0bGUgPSBjb25maWcub2tUaXRsZSB8fCAnT0snXG4gIHRoaXMuY2FuY2VsVGl0bGUgPSBjb25maWcuY2FuY2VsVGl0bGUgfHwgJ0NhbmNlbCdcbiAgTW9kYWwuY2FsbCh0aGlzKVxuICB0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb25maXJtJylcbn1cblxuQ29uZmlybS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1vZGFsLnByb3RvdHlwZSlcblxuQ29uZmlybS5wcm90b3R5cGUuY3JlYXRlTm9kZUNvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb250ZW50LmNsYXNzTGlzdC5hZGQoQ09OVEVOVF9DTEFTUylcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpXG5cbiAgY29uc3QgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgbXNnLmNsYXNzTGlzdC5hZGQoTVNHX0NMQVNTKVxuICBtc2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5tc2cpKVxuICBjb250ZW50LmFwcGVuZENoaWxkKG1zZylcblxuICBjb25zdCBidXR0b25Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ1dHRvbkdyb3VwLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0dST1VQX0NMQVNTKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXApXG4gIGNvbnN0IGJ0bk9rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnRuT2suYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5va1RpdGxlKSlcbiAgYnRuT2suY2xhc3NMaXN0LmFkZCgnYnRuLW9rJywgQlVUVE9OX0NMQVNTKVxuICBjb25zdCBidG5DYW5jZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidG5DYW5jZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jYW5jZWxUaXRsZSkpXG4gIGJ0bkNhbmNlbC5jbGFzc0xpc3QuYWRkKCdidG4tY2FuY2VsJywgQlVUVE9OX0NMQVNTKVxuICBidXR0b25Hcm91cC5hcHBlbmRDaGlsZChidG5PaylcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnRuQ2FuY2VsKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXApXG59XG5cbkNvbmZpcm0ucHJvdG90eXBlLmJpbmRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIE1vZGFsLnByb3RvdHlwZS5iaW5kRXZlbnRzLmNhbGwodGhpcylcbiAgY29uc3QgYnRuT2sgPSB0aGlzLm5vZGUucXVlcnlTZWxlY3RvcignLicgKyBCVVRUT05fQ0xBU1MgKyAnLmJ0bi1vaycpXG4gIGNvbnN0IGJ0bkNhbmNlbCA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLWNhbmNlbCcpXG4gIGJ0bk9rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGVzdHJveSgpXG4gICAgdGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrKHRoaXMub2tUaXRsZSlcbiAgfS5iaW5kKHRoaXMpKVxuICBidG5DYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2sodGhpcy5jYW5jZWxUaXRsZSlcbiAgfS5iaW5kKHRoaXMpKVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi9tb2RhbCdcblxuY29uc3QgQ09OVEVOVF9DTEFTUyA9ICdjb250ZW50J1xuY29uc3QgTVNHX0NMQVNTID0gJ2NvbnRlbnQtbXNnJ1xuY29uc3QgQlVUVE9OX0dST1VQX0NMQVNTID0gJ2J0bi1ncm91cCdcbmNvbnN0IEJVVFRPTl9DTEFTUyA9ICdidG4nXG5jb25zdCBJTlBVVF9XUkFQX0NMQVNTID0gJ2lucHV0LXdyYXAnXG5jb25zdCBJTlBVVF9DTEFTUyA9ICdpbnB1dCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUHJvbXB0IChjb25maWcpIHtcbiAgdGhpcy5tc2cgPSBjb25maWcubWVzc2FnZSB8fCAnJ1xuICB0aGlzLmRlZmF1bHRNc2cgPSBjb25maWcuZGVmYXVsdCB8fCAnJ1xuICB0aGlzLmNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrXG4gIHRoaXMub2tUaXRsZSA9IGNvbmZpZy5va1RpdGxlIHx8ICdPSydcbiAgdGhpcy5jYW5jZWxUaXRsZSA9IGNvbmZpZy5jYW5jZWxUaXRsZSB8fCAnQ2FuY2VsJ1xuICBNb2RhbC5jYWxsKHRoaXMpXG4gIHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LXByb21wdCcpXG59XG5cblByb21wdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1vZGFsLnByb3RvdHlwZSlcblxuUHJvbXB0LnByb3RvdHlwZS5jcmVhdGVOb2RlQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChDT05URU5UX0NMQVNTKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY29udGVudClcblxuICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBtc2cuY2xhc3NMaXN0LmFkZChNU0dfQ0xBU1MpXG4gIG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm1zZykpXG4gIGNvbnRlbnQuYXBwZW5kQ2hpbGQobXNnKVxuXG4gIGNvbnN0IGlucHV0V3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGlucHV0V3JhcC5jbGFzc0xpc3QuYWRkKElOUFVUX1dSQVBfQ0xBU1MpXG4gIGNvbnRlbnQuYXBwZW5kQ2hpbGQoaW5wdXRXcmFwKVxuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcbiAgaW5wdXQuY2xhc3NMaXN0LmFkZChJTlBVVF9DTEFTUylcbiAgaW5wdXQudHlwZSA9ICd0ZXh0J1xuICBpbnB1dC5hdXRvZm9jdXMgPSB0cnVlXG4gIGlucHV0LnBsYWNlaG9sZGVyID0gdGhpcy5kZWZhdWx0TXNnXG4gIGlucHV0V3JhcC5hcHBlbmRDaGlsZChpbnB1dClcblxuICBjb25zdCBidXR0b25Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ1dHRvbkdyb3VwLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0dST1VQX0NMQVNTKVxuICBjb25zdCBidG5PayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ0bk9rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMub2tUaXRsZSkpXG4gIGJ0bk9rLmNsYXNzTGlzdC5hZGQoJ2J0bi1vaycsIEJVVFRPTl9DTEFTUylcbiAgY29uc3QgYnRuQ2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnRuQ2FuY2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY2FuY2VsVGl0bGUpKVxuICBidG5DYW5jZWwuY2xhc3NMaXN0LmFkZCgnYnRuLWNhbmNlbCcsIEJVVFRPTl9DTEFTUylcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnRuT2spXG4gIGJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKGJ0bkNhbmNlbClcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGJ1dHRvbkdyb3VwKVxufVxuXG5Qcm9tcHQucHJvdG90eXBlLmJpbmRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIE1vZGFsLnByb3RvdHlwZS5iaW5kRXZlbnRzLmNhbGwodGhpcylcbiAgY29uc3QgYnRuT2sgPSB0aGlzLm5vZGUucXVlcnlTZWxlY3RvcignLicgKyBCVVRUT05fQ0xBU1MgKyAnLmJ0bi1vaycpXG4gIGNvbnN0IGJ0bkNhbmNlbCA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLWNhbmNlbCcpXG4gIGNvbnN0IHRoYXQgPSB0aGlzXG4gIGJ0bk9rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykudmFsdWVcbiAgICB0aGlzLmRlc3Ryb3koKVxuICAgIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjayh7XG4gICAgICByZXN1bHQ6IHRoYXQub2tUaXRsZSxcbiAgICAgIGRhdGE6IHZhbFxuICAgIH0pXG4gIH0uYmluZCh0aGlzKSlcbiAgYnRuQ2FuY2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykudmFsdWVcbiAgICB0aGlzLmRlc3Ryb3koKVxuICAgIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjayh7XG4gICAgICByZXN1bHQ6IHRoYXQuY2FuY2VsVGl0bGUsXG4gICAgICBkYXRhOiB2YWxcbiAgICB9KVxuICB9LmJpbmQodGhpcykpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGBcbi53ZWV4LXRvYXN0IHtcbiAgZm9udC1zaXplOiAwLjQyNjY2N3JlbTtcbiAgbGluZS1oZWlnaHQ6IDAuNDI2NjY3cmVtO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDE5OTk5OTk5OTk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1heC13aWR0aDogODAlO1xuICBib3R0b206IDUwJTtcbiAgbGVmdDogNTAlO1xuICBwYWRkaW5nOiAwLjIxMzMzM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3BhY2l0eTogMC43O1xuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjRzIGVhc2UtaW4tb3V0O1xuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjRzIGVhc2UtaW4tb3V0O1xuICAtbXMtdHJhbnNpdGlvbjogYWxsIDAuNHMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGFsbCAwLjRzIGVhc2UtaW4tb3V0O1xuICBib3JkZXItcmFkaXVzOiAwLjA2NjY2N3JlbTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG5cbi53ZWV4LXRvYXN0LmhpZGUge1xuICBvcGFjaXR5OiAwO1xufVxuXG4ud2VleC1hbGVydCAud2VleC1hbGVydC1vayB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4ud2VleC1jb25maXJtIC5idG4tZ3JvdXAgLmJ0biB7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogNTAlO1xufVxuXG4ud2VleC1jb25maXJtIC5idG4tZ3JvdXAgLmJ0bi5idG4tb2sge1xuICBib3JkZXItcmlnaHQ6IDAuMDEzMzMzcmVtIHNvbGlkICNkZGQ7XG59XG5cbi53ZWV4LW1vZGFsLXdyYXAge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5OTk5OTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xuICBvcGFjaXR5OiAwLjU7XG59XG5cbi53ZWV4LW1vZGFsLW5vZGUge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5OTk5OTk7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiA2LjY2NjY2N3JlbTtcbiAgbWluLWhlaWdodDogMi42NjY2NjdyZW07XG4gIGJvcmRlci1yYWRpdXM6IDAuMDY2NjY3cmVtO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4ud2VleC1tb2RhbC1ub2RlLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4ud2VleC1tb2RhbC1ub2RlIC5jb250ZW50IHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgZGlzcGxheTogLW1vei1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tb3otYm94LW9yaWVudDogdmVydGljYWw7XG4gIC1tb3otYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjtcbiAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xuICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAtbW96LWJveC1wYWNrOiBjZW50ZXI7XG4gIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBtaW4taGVpZ2h0OiAxLjg2NjY2N3JlbTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZm9udC1zaXplOiAwLjQyNjY2N3JlbTtcbiAgbGluZS1oZWlnaHQ6IDAuNDI2NjY3cmVtO1xuICBwYWRkaW5nOiAwLjIxMzMzM3JlbTtcbiAgYm9yZGVyLWJvdHRvbTogMC4wMTMzMzNyZW0gc29saWQgI2RkZDtcbn1cblxuLndlZXgtbW9kYWwtbm9kZSAuYnRuLWdyb3VwIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMC44cmVtO1xuICBmb250LXNpemU6IDAuMzczMzMzcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiBub25lO1xufVxuXG4ud2VleC1tb2RhbC1ub2RlIC5idG4tZ3JvdXAgLmJ0biB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLndlZXgtbW9kYWwtbm9kZSAuYnRuLWdyb3VwIC5idG4ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBoZWlnaHQ6IDAuOHJlbTtcbiAgbGluZS1oZWlnaHQ6IDAuOHJlbTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLndlZXgtcHJvbXB0IC5pbnB1dC13cmFwIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbi10b3A6IDAuMTMzMzMzcmVtO1xuICBoZWlnaHQ6IDAuOTZyZW07XG59XG5cbi53ZWV4LXByb21wdCAuaW5wdXQtd3JhcCAuaW5wdXQge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAwLjU2cmVtO1xuICBsaW5lLWhlaWdodDogMC41NnJlbTtcbiAgZm9udC1zaXplOiAwLjQyNjY2N3JlbTtcbiAgYm9yZGVyOiAwLjAxMzMzM3JlbSBzb2xpZCAjOTk5O1xufVxuXG4ud2VleC1wcm9tcHQgLmJ0bi1ncm91cCAuYnRuIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi53ZWV4LXByb21wdCAuYnRuLWdyb3VwIC5idG4uYnRuLW9rIHtcbiAgYm9yZGVyLXJpZ2h0OiAwLjAxMzMzM3JlbSBzb2xpZCAjZGRkO1xufVxuYFxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgdG9hc3QgZnJvbSAnLi90b2FzdCdcbmltcG9ydCBBbGVydCBmcm9tICcuL2FsZXJ0J1xuaW1wb3J0IENvbmZpcm0gZnJvbSAnLi9jb25maXJtJ1xuaW1wb3J0IFByb21wdCBmcm9tICcuL3Byb21wdCdcbmltcG9ydCBfY3NzIGZyb20gJy4vc3R5bGUnXG5cbi8vIFRPRE86IHJld3JpdGUgdGhlIG1vZGFsIHN0eWxlc1xuY29uc3QgbW9kYWwgPSB7XG5cbiAgLy8gZHVyYXRpb246IGRlZmF1bHQgaXMgMC44IHNlY29uZHMuXG4gIHRvYXN0OiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgdG9hc3QucHVzaChjb25maWcubWVzc2FnZSwgY29uZmlnLmR1cmF0aW9uKVxuICB9LFxuXG4gIC8vIGNvbmZpZzpcbiAgLy8gIC0gbWVzc2FnZTogc3RyaW5nXG4gIC8vICAtIG9rVGl0bGU6IHRpdGxlIG9mIG9rIGJ1dHRvblxuICAvLyAgLSBjYWxsYmFja1xuICBhbGVydDogZnVuY3Rpb24gKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICBjb25maWcuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfVxuICAgIG5ldyBBbGVydChjb25maWcpLnNob3coKVxuICB9LFxuXG4gIC8vIGNvbmZpZzpcbiAgLy8gIC0gbWVzc2FnZTogc3RyaW5nXG4gIC8vICAtIG9rVGl0bGU6IHRpdGxlIG9mIG9rIGJ1dHRvblxuICAvLyAgLSBjYW5jZWxUaXRsZTogdGl0bGUgb2YgY2FuY2VsIGJ1dHRvblxuICAvLyAgLSBjYWxsYmFja1xuICBjb25maXJtOiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFjaykge1xuICAgIGNvbmZpZy5jYWxsYmFjayA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHZhbClcbiAgICB9XG4gICAgbmV3IENvbmZpcm0oY29uZmlnKS5zaG93KClcbiAgfSxcblxuICAvLyBjb25maWc6XG4gIC8vICAtIG1lc3NhZ2U6IHN0cmluZ1xuICAvLyAgLSBva1RpdGxlOiB0aXRsZSBvZiBvayBidXR0b25cbiAgLy8gIC0gY2FuY2VsVGl0bGU6IHRpdGxlIG9mIGNhbmNlbCBidXR0b25cbiAgLy8gIC0gY2FsbGJhY2tcbiAgcHJvbXB0OiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFjaykge1xuICAgIGNvbmZpZy5jYWxsYmFjayA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHZhbClcbiAgICB9XG4gICAgbmV3IFByb21wdChjb25maWcpLnNob3coKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnV0aWxzLmFwcGVuZENzcyhfY3NzLCAnd2VleC1tdWQtbW9kYWwnKVxuICAgIFdlZXgucmVnaXN0ZXJNb2R1bGUoJ21vZGFsJywgbW9kYWwpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIE5hdmlnYXRvciBtb2R1bGVcbiAqL1xuY29uc3QgbmF2aWdhdG9yTW9kdWxlID0ge1xuICBwdXNoOiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFjaykge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gY29uZmlnLnVybFxuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgfSxcblxuICBwb3A6IGZ1bmN0aW9uIChjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgd2luZG93Lmhpc3RvcnkuYmFjaygpXG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJNb2R1bGUoJ25hdmlnYXRvcicsIG5hdmlnYXRvck1vZHVsZSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogV2VidmlldyBtb2R1bGVcbiAqL1xubGV0IGlzQXJyYXlcblxuY29uc3Qgd2VidmlldyA9IHtcbiAgZ29CYWNrICh2bm9kZSkge1xuICAgIGlmIChpc0FycmF5KHZub2RlKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3Z1ZS1yZW5kZXJdIHRoZSByZWYgcGFzc2VkIHRvIHdlYnZpZXcuZ29CYWNrIGlzIGEgYXJyYXkuJylcbiAgICAgIH1cbiAgICAgIHZub2RlID0gdm5vZGVbMF1cbiAgICB9XG4gICAgaWYgKHZub2RlICYmIHR5cGVvZiB2bm9kZS5nb0JhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZub2RlLmdvQmFjaygpXG4gICAgfVxuICB9LFxuICBnb0ZvcndhcmQgKHZub2RlKSB7XG4gICAgaWYgKGlzQXJyYXkodm5vZGUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdnVlLXJlbmRlcl0gdGhlIHJlZiBwYXNzZWQgdG8gd2Vidmlldy5nb0ZvcndhcmQgaXMgYSBhcnJheS4nKVxuICAgICAgfVxuICAgICAgdm5vZGUgPSB2bm9kZVswXVxuICAgIH1cbiAgICBpZiAodm5vZGUgJiYgdHlwZW9mIHZub2RlLmdvRm9yd2FyZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdm5vZGUuZ29Gb3J3YXJkKClcbiAgICB9XG4gIH0sXG4gIHJlbG9hZCAodm5vZGUpIHtcbiAgICBpZiAoaXNBcnJheSh2bm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t2dWUtcmVuZGVyXSB0aGUgcmVmIHBhc3NlZCB0byB3ZWJ2aWV3LnJlbG9hZCBpcyBhIGFycmF5LicpXG4gICAgICB9XG4gICAgICB2bm9kZSA9IHZub2RlWzBdXG4gICAgfVxuICAgIGlmICh2bm9kZSAmJiB0eXBlb2Ygdm5vZGUucmVsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2bm9kZS5yZWxvYWQoKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICBpc0FycmF5ID0gd2VleC51dGlscy5pc0FycmF5XG4gICAgd2VleC5yZWdpc3Rlck1vZHVsZSgnd2VidmlldycsIHdlYnZpZXcpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiB3ZWJzb2NrZXQgbW9kdWxlXG4gKi9cbi8qZ2xvYmFsIFdlYlNvY2tldCovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKCkge1xuICBjb25zdCByZWdpc3Rlckxpc3RlbmVycyA9IFsnb25vcGVuJywgJ29ubWVzc2FnZScsICdvbmVycm9yJywgJ29uY2xvc2UnXVxuICBjb25zdCB3cyA9IHtcbiAgICBJTlNUQU5DRTogbnVsbCxcbiAgICBXZWJTb2NrZXQ6IGZ1bmN0aW9uICh1cmwsIHByb3RvY29sKSB7XG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICB3cy5JTlNUQU5DRSA9IG51bGxcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoIXByb3RvY29sKSB7XG4gICAgICAgIHdzLklOU1RBTkNFID0gbmV3IFdlYlNvY2tldCh1cmwpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgd3MuSU5TVEFOQ0UgPSBuZXcgV2ViU29ja2V0KHVybCwgcHJvdG9jb2wpXG4gICAgICB9XG4gICAgICByZXR1cm4gd3MuSU5TVEFOQ0VcbiAgICB9LFxuICAgIHNlbmQ6IGZ1bmN0aW9uIChtZXNzYWdlcykge1xuICAgICAgd3MuSU5TVEFOQ0UgJiYgd3MuSU5TVEFOQ0Uuc2VuZChtZXNzYWdlcylcbiAgICB9LFxuICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB3cy5JTlNUQU5DRSAmJiB3cy5JTlNUQU5DRS5jbG9zZSgpXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgaSBpbiByZWdpc3Rlckxpc3RlbmVycykge1xuICAgIGlmIChyZWdpc3Rlckxpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdzLCByZWdpc3Rlckxpc3RlbmVyc1tpXSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gd3MuSU5TVEFOQ0UgJiYgd3MuSU5TVEFOQ0VbcmVnaXN0ZXJMaXN0ZW5lcnNbaV1dXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgaWYgKHdzLklOU1RBTkNFKSB7XG4gICAgICAgICAgICB3cy5JTlNUQU5DRVtyZWdpc3Rlckxpc3RlbmVyc1tpXV0gPSBmblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdzXG59KSgpXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB3ZWJzb2NrZXQgZnJvbSAnLi93ZWJzb2NrZXQnXG5cbi8vIFRPRE86IHJld3JpdGUgdGhlIG1vZHVsZSBtZXRhXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3Rlck1vZHVsZSgnd2ViU29ja2V0Jywgd2Vic29ja2V0LCB7IHJlZ2lzdGVyVHlwZTogJ2Fzc2lnbm1lbnQnIH0pXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyByZXNldFZpZXdwb3J0IH0gZnJvbSAnLi4vd2VleC92aWV3cG9ydCdcblxuY29uc3QgbWV0YSA9IHtcbiAgLyoqXG4gICAqIHNldFZpZXdwb3J0LlxuICAgKiBDaGFuZ2luZyB2aWV3cG9ydCBkZXNpZ24gd2lkdGggYXQgcnVudGltZS5cbiAgICovXG4gIHNldFZpZXdwb3J0IChvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbdnVlLXJlbmRlcl0gc2V0IHZpZXdwb3J0IHdpZHRoIGludmFsaWQgb3B0aW9uczogJHtvcHRpb25zfWApXG4gICAgfVxuICAgIGNvbnN0IG5ld1dpZHRoID0gcGFyc2VJbnQob3B0aW9ucy53aWR0aClcbiAgICBpZiAoIWlzTmFOKG5ld1dpZHRoKSAmJiBuZXdXaWR0aCA+IDApIHtcbiAgICAgIHJlc2V0Vmlld3BvcnQob3B0aW9ucy53aWR0aClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbdnVlLXJlbmRlcl0gc2V0IHZpZXdwb3J0IHdpZHRoIGludmFsaWQgb3B0aW9ucy53aWR0aDogJHtvcHRpb25zLndpZHRofWApXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJNb2R1bGUoJ21ldGEnLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gbW9kdWxlcyBmcm9tIHJlbmRlci9icm93ZXNyIChsZWdhY3kgbW9kdWxlcylcblxuaW1wb3J0IGdlb2xvY2F0aW9uIGZyb20gJy4vZ2VvbG9jYXRpb24nXG5pbXBvcnQgc3RvcmFnZSBmcm9tICcuL3N0b3JhZ2UnXG5pbXBvcnQgc3RyZWFtIGZyb20gJy4vc3RyZWFtJ1xuaW1wb3J0IGNsaXBib2FyZCBmcm9tICcuL2NsaXBib2FyZCdcbmltcG9ydCBldmVudE1vZHVsZSBmcm9tICcuL2V2ZW50J1xuXG4vLyBjdXN0b20gbW9kdWxlc1xuaW1wb3J0IGFuaW1hdGlvbiBmcm9tICcuL2FuaW1hdGlvbidcbmltcG9ydCBkb20gZnJvbSAnLi9kb20nXG5pbXBvcnQgZ2xvYmFsRXZlbnQgZnJvbSAnLi9nbG9iYWxFdmVudCdcbmltcG9ydCBtb2RhbCBmcm9tICcuL21vZGFsJ1xuaW1wb3J0IG5hdmlnYXRvck1vZHVsZSBmcm9tICcuL25hdmlnYXRvcidcbmltcG9ydCB3ZWJ2aWV3IGZyb20gJy4vd2VidmlldydcbmltcG9ydCB3ZWJzb2NrZXQgZnJvbSAnLi93ZWJzb2NrZXQnXG5pbXBvcnQgbWV0YSBmcm9tICcuL21ldGEnXG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgZ2VvbG9jYXRpb24sXG4gIHN0b3JhZ2UsXG4gIHN0cmVhbSxcbiAgY2xpcGJvYXJkLFxuICBldmVudE1vZHVsZSxcbiAgbW9kYWwsXG4gIHdlYnNvY2tldCxcbiAgYW5pbWF0aW9uLFxuICBkb20sXG4gIGdsb2JhbEV2ZW50LFxuICBuYXZpZ2F0b3JNb2R1bGUsXG4gIHdlYnZpZXcsXG4gIG1ldGFcbl1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgdmFsTWFwID0ge1xuICBjb250YWluOiAnY29udGFpbicsXG4gIGNvdmVyOiAnY292ZXInLFxuICBzdHJldGNoOiAnMTAwJSAxMDAlJ1xufVxuY29uc3QgdmFscyA9IE9iamVjdC5rZXlzKHZhbE1hcClcbmNvbnN0IGRlZmF1bHRWYWwgPSAnc3RyZXRjaCdcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5fX3Z1ZV9fLmRpcmVjdGl2ZSgnd2VleC1yZXNpemUnLCBmdW5jdGlvbiAoZWwsIGJpbmRpbmcpIHtcbiAgICAgIGlmIChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdmaWd1cmUnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbGV0IHZhbHVlID0gYmluZGluZy52YWx1ZVxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBiaW5kaW5nLm9sZHZhbHVlXG4gICAgICBpZiAodmFsdWUgPT09IG9sZFZhbHVlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHZhbHMuaW5kZXhPZih2YWx1ZSkgPD0gLTEpIHtcbiAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsXG4gICAgICB9XG4gICAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IHZhbE1hcFt2YWx1ZV1cbiAgICB9KVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCByZXNpemUgZnJvbSAnLi9yZXNpemUnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcmVzaXplXG59XG4iLCJpbXBvcnQgd2VleCBmcm9tICcuLi8uLi8uLi9zcmMnXG5cbmltcG9ydCBjb21wb25lbnRzIGZyb20gJy4uLy4uLy4uL3NyYy9jb21wb25lbnRzJ1xuaW1wb3J0IG1vZHVsZXMgZnJvbSAnLi4vLi4vLi4vc3JjL21vZHVsZXMnXG5pbXBvcnQgZGlyZWN0aXZlcyBmcm9tICcuLi8uLi8uLi9zcmMvZGlyZWN0aXZlcydcblxuY29uc3QgcHJlSW5pdCA9IHdlZXguaW5pdFxuXG53ZWV4LmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHByZUluaXQuYXBwbHkod2VleCwgYXJndW1lbnRzKVxuICBjb25zdCBwbHVnaW5zID0gY29tcG9uZW50cy5jb25jYXQobW9kdWxlcylcblxuICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIHdlZXguaW5zdGFsbChwbHVnaW4pXG4gIH0pXG5cbiAgZm9yIChjb25zdCBrIGluIGRpcmVjdGl2ZXMpIHtcbiAgICB3ZWV4Lmluc3RhbGwoZGlyZWN0aXZlc1trXSlcbiAgfVxufVxuXG5pZiAoZ2xvYmFsLlZ1ZSkge1xuICB3ZWV4LmluaXQoZ2xvYmFsLlZ1ZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgd2VleFxuIl0sIm5hbWVzIjpbImRlZmluZWQiLCJ0b0ludGVnZXIiLCJpc09iamVjdCIsInJlcXVpcmUkJDAiLCJkb2N1bWVudCIsInJlcXVpcmUkJDEiLCJyZXF1aXJlJCQyIiwiYW5PYmplY3QiLCJ0b1ByaW1pdGl2ZSIsIklFOF9ET01fREVGSU5FIiwiZFAiLCJjcmVhdGVEZXNjIiwiaGFzIiwiaGlkZSIsImdsb2JhbCIsImFGdW5jdGlvbiIsImNvcmUiLCJjdHgiLCJyZWRlZmluZSIsImNvZiIsIklPYmplY3QiLCJtaW4iLCJ0b0lPYmplY3QiLCJ0b0xlbmd0aCIsInRvQWJzb2x1dGVJbmRleCIsInVpZCIsIklFX1BST1RPIiwiJGtleXMiLCJlbnVtQnVnS2V5cyIsImdldEtleXMiLCJQUk9UT1RZUEUiLCJkUHMiLCJjcmVhdGUiLCJkZXNjcmlwdG9yIiwic2V0VG9TdHJpbmdUYWciLCJ0b09iamVjdCIsIiRpdGVyQ3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJMSUJSQVJZIiwiSXRlcmF0b3JzIiwiJGV4cG9ydCIsIklURVJBVE9SIiwiJGRlZmluZVByb3BlcnR5IiwiVEFHIiwiY2xhc3NvZiIsImdldEl0ZXJGbiIsImlzQXJyYXlJdGVyIiwiY3JlYXRlUHJvcGVydHkiLCJjYWxsIiwiZ09QUyIsInBJRSIsImFyZ3VtZW50cyIsIkFycmF5UHJvdG8iLCJzdGVwIiwiYWRkVG9VbnNjb3BhYmxlcyIsIndrcyIsIiRpdGVyYXRvcnMiLCJwcm9jZXNzIiwiaW52b2tlIiwiY2VsIiwiaHRtbCIsImlzTm9kZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiU1BFQ0lFUyIsIkRFU0NSSVBUT1JTIiwiVHlwZUVycm9yIiwibmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUiLCJwZXJmb3JtIiwiYW5JbnN0YW5jZSIsInJlcXVpcmUkJDMiLCJzcGVjaWVzQ29uc3RydWN0b3IiLCJyZXF1aXJlJCQ0IiwicmVxdWlyZSQkNSIsInJlcXVpcmUkJDYiLCJwcm9taXNlUmVzb2x2ZSIsInJlcXVpcmUkJDciLCJmb3JPZiIsImNvbnN0IiwibGliIiwibGV0IiwiZW52IiwiaSIsInRvU3RyaW5nIiwiaW5pdCIsImV4dGVuZCIsImV2ZW50IiwiX3VpZCIsImluaXRWaWV3cG9ydCIsIndlZXgiLCJ1dGlscy5hcHBlbmRDc3MiLCJ0YWdNYXAiLCJnZXRUcmFuc2Zvcm1lciIsImJpbmRpbmdTdHlsZU5hbWVzRm9yUHgyUmVtIiwidGhpcyIsIl9pbml0ZWQiLCJiYXNlIiwibWFwRm9ybUV2ZW50cyIsImFwcGVuZENzcyIsInJlY3QiLCJzY3JvbGxhYmxlIiwidm5vZGUiLCJ0YWciLCJjb2x1bW5Eb20iLCJleHRyYWN0Q29tcG9uZW50U3R5bGUiLCJnZXRSZ2IiLCJsb29wQXJyYXkiLCJnZXRTdHlsZVNoZWV0QnlJZCIsInByb2Nlc3NTdHlsZSIsImdldExpc3QiLCJsb2FkaW5nSW5kaWNhdG9yIiwic2xpZGVyIiwiZ2V0Q29tcG9uZW50SW5saW5lU3R5bGUiLCJpbmRpY2F0b3IiLCJtZXRhIiwiaGFzT3duUHJvcGVydHkiLCJ1dGlscyIsInFzIiwicXVldWUiLCJDT05URU5UX0NMQVNTIiwiTVNHX0NMQVNTIiwiQlVUVE9OX0dST1VQX0NMQVNTIiwiQlVUVE9OX0NMQVNTIiwiX2NzcyIsImlzQXJyYXkiLCJ3ZWJzb2NrZXQiLCJnZW9sb2NhdGlvbiIsInN0b3JhZ2UiLCJzdHJlYW0iLCJjbGlwYm9hcmQiLCJtb2RhbCIsImFuaW1hdGlvbiIsImRvbSIsImdsb2JhbEV2ZW50IiwibmF2aWdhdG9yTW9kdWxlIiwid2VidmlldyIsIm1vZHVsZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDdkIsY0FBYyxHQUFHLFVBQVUsRUFBRSxFQUFFO0VBQzdCLE9BQU8sS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztDQUMxRDs7QUNMRDtBQUNBLFlBQWMsR0FBRyxVQUFVLEVBQUUsRUFBRTtFQUM3QixJQUFJLEVBQUUsSUFBSSxTQUFTLElBQUUsTUFBTSxTQUFTLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDLEdBQUM7RUFDcEUsT0FBTyxFQUFFLENBQUM7Q0FDWDs7OztBQ0FELGFBQWMsR0FBRyxVQUFVLFNBQVMsRUFBRTtFQUNwQyxPQUFPLFVBQVUsSUFBSSxFQUFFLEdBQUcsRUFBRTtJQUMxQixJQUFJLENBQUMsR0FBRyxNQUFNLENBQUNBLFFBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHQyxVQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqQixJQUFJLENBQUMsRUFBRSxDQUFD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QUNwQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ3ZFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMvQjs7QUNWRCxJQUFJMEMsU0FBTyxHQUFHM0MsT0FBTSxDQUFDLE9BQU8sQ0FBQztBQUM3QixJQUFJLE9BQU8sR0FBR0EsT0FBTSxDQUFDLFlBQVksQ0FBQztBQUNsQyxJQUFJLFNBQVMsR0FBR0EsT0FBTSxDQUFDLGNBQWMsQ0FBQztBQUN0QyxJQUFJLGNBQWMsR0FBR0EsT0FBTSxDQUFDLGNBQWMsQ0FBQztBQUMzQyxJQUFJLFFBQVEsR0FBR0EsT0FBTSxDQUFDLFFBQVEsQ0FBQztBQUMv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QUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0VBQzVDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUM7RUFDeEUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7TUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7TUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUM7RUFDMUIsSUFBSSxTQUFTLEdBQUc7SUFDZCxFQUFFO01BQ0EsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztNQUM3QixLQUFLLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQy9CLEVBQUU7TUFDQSxLQUFLLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO01BQzdCLEtBQUssR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBQzs7RUFFbEMsT0FBTztJQUNMLE1BQU0sRUFBRSxNQUFNO0lBQ2QsS0FBSyxFQUFFLEtBQUs7SUFDWixTQUFTLEVBQUUsU0FBUztJQUNwQixNQUFNLEVBQUU7TUFDTixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0s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QUFHLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFDLE9BQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLE9BQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLHdIQUF3SCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFRLENBQUMsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVB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